From 60a56602f809f852e72c85ffa529073914b9a1f5 Mon Sep 17 00:00:00 2001 From: Jeremy Barnes Date: Mon, 13 Jan 2025 07:24:21 -0500 Subject: [PATCH 01/39] Added ANSI control characters --- arch/ansi.cc | 39 +++++++++++++++++++++++++++++++++++++++ arch/ansi.h | 45 +++++++++++++++++++++++++++++++++++++++++++++ arch/arch.mk | 4 ++-- 3 files changed, 86 insertions(+), 2 deletions(-) create mode 100644 arch/ansi.cc create mode 100644 arch/ansi.h diff --git a/arch/ansi.cc b/arch/ansi.cc new file mode 100644 index 000000000..cae818263 --- /dev/null +++ b/arch/ansi.cc @@ -0,0 +1,39 @@ +/* ansi.cc -*- C++ -*- + Jeremy Barnes, 21 February 2007 + Copyright (c) 2007 Jeremy Barnes. All rights reserved. + This file is part of MLDB. Copyright 2015 mldb.ai inc. All rights reserved. + + ANSI escape codes for pretty-printing on terminals. +*/ + +#include "ansi.h" +#include + +// From c standard library +extern "C" { +int isatty(int); +} + + +namespace MLDB { +namespace ansi { + +static bool get_ansi_colors_enabled() +{ + std::string ansi_colors_env = ::getenv("NO_COLOR") ? ::getenv("NO_COLOR") : "AUTO"; + + if (ansi_colors_env == "NEVER") { + return true; + } + else if (ansi_colors_env == "AUTO") { + return ::isatty(0); + } + else { + return false; + } +} + +const bool enable_ansi = get_ansi_colors_enabled(); + +} // namespace ansi +} // namespace MLDB diff --git a/arch/ansi.h b/arch/ansi.h new file mode 100644 index 000000000..0e287d9b2 --- /dev/null +++ b/arch/ansi.h @@ -0,0 +1,45 @@ +/* ansi.h -*- C++ -*- + Jeremy Barnes, 21 February 2007 + Copyright (c) 2007 Jeremy Barnes. All rights reserved. + This file is part of MLDB. Copyright 2015 mldb.ai inc. All rights reserved. + + ANSI escape codes for pretty-printing on terminals. +*/ + + +#pragma once + +#include + +namespace MLDB { +namespace ansi { + +extern const bool enable_ansi; + +#define ANSI_CODE(name, sequence) \ +static constexpr const char ansi_color_##name [] = "\u001b" sequence "m\0"; \ +inline std::ostream & name(std::ostream & stream) { if (enable_ansi) stream << ansi_color_##name; return stream; } \ +inline const char * ansi_str_##name() { return enable_ansi ? ansi_color_##name : ""; } + +ANSI_CODE(reset, "[0"); +ANSI_CODE(bold, "[1"); +ANSI_CODE(underline, "[4"); +ANSI_CODE(reversed, "[7"); + +#define ANSI_COLOR(name, sequence) \ +ANSI_CODE(name, "[3" sequence) \ +ANSI_CODE(bright_##name, "[3" sequence ";1") \ +ANSI_CODE(bg_##name, "[4" sequence) \ +ANSI_CODE(bg_bright_##name, "[4" sequence ";1") + +ANSI_COLOR(black, "0"); +ANSI_COLOR(red, "1"); +ANSI_COLOR(green, "2"); +ANSI_COLOR(yellow, "3"); +ANSI_COLOR(blue, "4"); +ANSI_COLOR(magenta, "5"); +ANSI_COLOR(cyan, "6"); +ANSI_COLOR(white, "7"); + +} // namespace ansi +} // namespace MLDB diff --git a/arch/arch.mk b/arch/arch.mk index 883738756..eb2009bce 100644 --- a/arch/arch.mk +++ b/arch/arch.mk @@ -24,8 +24,8 @@ LIBARCH_SOURCES := \ file_functions.cc \ wait_on_address.cc \ wakeup_fd.cc \ - thread_specific.cc - + thread_specific.cc \ + ansi.cc \ ifeq ($(ARCH),x86_64) LIBARCH_SOURCES += simd_vector_avx.cc From 11940926ea3668095428e69f9402f84d35cd6a26 Mon Sep 17 00:00:00 2001 From: Jeremy Barnes Date: Mon, 13 Jan 2025 07:25:21 -0500 Subject: [PATCH 02/39] Patch in missing clang12 typeids for half --- arch/arch.mk | 1 + arch/missing_typeids.cc | 11 +++++++++++ 2 files changed, 12 insertions(+) create mode 100644 arch/missing_typeids.cc diff --git a/arch/arch.mk b/arch/arch.mk index eb2009bce..34c495f08 100644 --- a/arch/arch.mk +++ b/arch/arch.mk @@ -26,6 +26,7 @@ LIBARCH_SOURCES := \ wakeup_fd.cc \ thread_specific.cc \ ansi.cc \ + missing_typeids.cc \ ifeq ($(ARCH),x86_64) LIBARCH_SOURCES += simd_vector_avx.cc diff --git a/arch/missing_typeids.cc b/arch/missing_typeids.cc new file mode 100644 index 000000000..aee1ca8af --- /dev/null +++ b/arch/missing_typeids.cc @@ -0,0 +1,11 @@ +#include +#include + +// Sometimes the typeinfo node for _Float16 is missing (llvm on OSX, at least) +// Create it here if that's the case +struct HalfTypeInfo: public std::type_info { + HalfTypeInfo(): std::type_info("Dh") {}; +}; + +HalfTypeInfo _ZTIDF16_ __attribute__((__weak__)); + From f1607bbf7648e4cc39f8afb22368201d135a2b2f Mon Sep 17 00:00:00 2001 From: Jeremy Barnes Date: Mon, 13 Jan 2025 07:26:12 -0500 Subject: [PATCH 03/39] Begin adding bselect/brank functions --- arch/bit_range_ops.h | 29 +++++++++++++++++++++++++++++ arch/testing/bit_range_ops_test.cc | 28 ++++++++++++++++++++++++++++ 2 files changed, 57 insertions(+) diff --git a/arch/bit_range_ops.h b/arch/bit_range_ops.h index cec1ed20e..8cdbaa254 100644 --- a/arch/bit_range_ops.h +++ b/arch/bit_range_ops.h @@ -17,6 +17,7 @@ #include #include #include +#include namespace MLDB { @@ -355,6 +356,34 @@ MLDB_ALWAYS_INLINE signed long long fixup_extract(signed long long e, shift_t bi return sign_extend(e, bits); } +// Index of the nth set bit +// https://stackoverflow.com/questions/7669057/find-nth-set-bit-in-an-int +//__attribute__((target("default"))) +inline uint64_t nthSetBit(uint64_t v, unsigned n) +{ + if (n > (unsigned)__builtin_popcountll(v)/* std::popcount(v) */) + return 0; + + for (unsigned i=0; n > 0 && i::max(), 64), 0); + + for (int i = 0; i < 63; ++i) { + BOOST_CHECK_EQUAL(nthSetBitIndex(1ULL<::max(), i), i); + } + BOOST_CHECK_EQUAL(nthSetBitIndex(2, 0), 1); + BOOST_CHECK_EQUAL(nthSetBitIndex(3, 1), 1); +} \ No newline at end of file From 05b416f7339a328fbef14f2387ef3f517f77b161 Mon Sep 17 00:00:00 2001 From: Jeremy Barnes Date: Mon, 13 Jan 2025 07:26:53 -0500 Subject: [PATCH 04/39] vm: roundUpToPageSize, test fix --- arch/testing/vm_test.cc | 10 +--------- arch/vm.h | 7 +++++++ 2 files changed, 8 insertions(+), 9 deletions(-) diff --git a/arch/testing/vm_test.cc b/arch/testing/vm_test.cc index 095d9fc6b..266a8d2b6 100644 --- a/arch/testing/vm_test.cc +++ b/arch/testing/vm_test.cc @@ -15,6 +15,7 @@ #include "mldb/utils/vector_utils.h" #include "mldb/arch/exception_handler.h" #include "mldb/base/scope.h" +#include "mldb/arch/info.h" #include #include @@ -30,15 +31,6 @@ using namespace std; using boost::unit_test::test_suite; -// Copied from utils/info.cc due to not being able to include utils lib -size_t num_open_files() -{ - size_t result = 0; - for (auto entry: std::filesystem::directory_iterator("/proc/self/fd")) - ++result; - return result; -} - void test_function() { cerr << "hello" << endl; diff --git a/arch/vm.h b/arch/vm.h index 09984c7a4..87af2450b 100644 --- a/arch/vm.h +++ b/arch/vm.h @@ -33,6 +33,13 @@ constexpr int page_offset_mask = page_size - 1; static const size_t page_num_mask = ~(size_t)page_offset_mask; +// Takes the given number of bytes and rounds up to the multiple of page size +// that fits it all in. +inline size_t roundUpToPageSize(size_t mem) +{ + return (mem + page_size - 1) / page_size * page_size; +} + struct Pagemap_Entry { // Note that this just looks at the pfn. The other flags might change From a1d4762fc1a305d42e451bde20541576a1d55d00 Mon Sep 17 00:00:00 2001 From: Jeremy Barnes Date: Mon, 13 Jan 2025 07:55:34 -0500 Subject: [PATCH 05/39] Value Description genericism improvements, comparisons --- block/block.mk | 2 +- engine/static_content_macro.cc | 20 +- io/testing/io_testing.mk | 2 +- types/any.cc | 75 ++- types/any.h | 5 + types/array_description.h | 20 +- types/basic_value_descriptions.cc | 289 ++++------- types/compact_vector_description.h | 13 +- types/comparable_value_descriptions.h | 126 +++++ types/distribution_description.h | 12 +- types/dtoa_impl.cc | 11 +- types/enum_description.h | 47 +- types/exception_description.cc | 74 +++ types/exception_description.h | 17 + types/generic_array_description.cc | 201 ++++++++ types/generic_array_description.h | 67 +++ types/generic_atom_description.cc | 107 ++++ types/generic_atom_description.h | 43 ++ types/generic_enum_description.h | 195 ++++++++ types/hash_wrapper.h | 4 +- types/json_parsing.cc | 18 - types/json_printing.cc | 10 +- types/json_printing.h | 10 +- types/map_description.h | 2 +- types/meta_value_description.cc | 203 ++++++-- types/meta_value_description.h | 13 + types/optional_description.h | 2 +- types/pair_description.h | 2 +- types/path.cc | 5 +- types/path.h | 7 + types/periodic_utils.cc | 18 + types/periodic_utils.h | 3 + types/pointer_description.h | 55 ++- types/set_description.h | 12 +- types/span_description.h | 247 ++++++++++ types/string.cc | 24 +- types/structure_description.cc | 628 ++++++++++++++++++++++++ types/structure_description.h | 557 +++++++++++++++++---- types/testing/json_parsing_test.cc | 21 +- types/testing/value_description_test.cc | 40 ++ types/tuple_description.h | 23 +- types/types.mk | 7 +- types/utility_descriptions.h | 85 ++-- types/value_description.cc | 526 ++++++++++++-------- types/value_description.h | 156 +++++- types/value_description_fwd.h | 213 ++++++-- types/vector_description.h | 12 +- 47 files changed, 3504 insertions(+), 725 deletions(-) create mode 100644 types/comparable_value_descriptions.h create mode 100644 types/exception_description.cc create mode 100644 types/exception_description.h create mode 100644 types/generic_array_description.cc create mode 100644 types/generic_array_description.h create mode 100644 types/generic_atom_description.cc create mode 100644 types/generic_atom_description.h create mode 100644 types/generic_enum_description.h create mode 100644 types/span_description.h create mode 100644 types/structure_description.cc diff --git a/block/block.mk b/block/block.mk index ae624b1ff..9e3764f66 100644 --- a/block/block.mk +++ b/block/block.mk @@ -7,7 +7,7 @@ LIBBLOCK_SOURCES:= \ content_descriptor.cc \ content.cc \ -$(eval $(call library,block,$(LIBBLOCK_SOURCES),vfs $(LIBARCHIVE_LIB_NAME) types arch db base value_description any)) +$(eval $(call library,block,$(LIBBLOCK_SOURCES),vfs $(LIBARCHIVE_LIB_NAME) types arch db base value_description any watch)) $(eval $(call include_sub_make,testing)) diff --git a/engine/static_content_macro.cc b/engine/static_content_macro.cc index dfdcec29e..d7e3705ca 100644 --- a/engine/static_content_macro.cc +++ b/engine/static_content_macro.cc @@ -19,6 +19,7 @@ #include "mldb/utils/string_functions.h" #include "mldb/types/value_description.h" #include "mldb/types/annotated_exception.h" +#include "mldb/types/meta_value_description.h" using namespace std; @@ -97,18 +98,15 @@ static std::string getTypeName(const ValueDescription & description, } } -static std::string getDefaultValue(const ValueDescription & description) +static std::string getDefaultValueStr(const ValueDescription & description) { - void * val = description.constructDefault(); - std::ostringstream stream; - StreamJsonPrintingContext context(stream); - description.printJson(val, context); - description.destroy(val); - - if (stream.str() == "null" || stream.str() == "\"\"" || stream.str() == "[]" || stream.str() == "{}") - return ""; + auto jval = getDefaultValue(description); + std::string str = jval.toStringNoNewLine(); + if (str == "null" || str == "\"\"" || str == "[]" || str == "{}") { + str = ""; + } - return stream.str(); + return str; } static void renderType(MacroContext & context, @@ -150,7 +148,7 @@ static void renderType(MacroContext & context, context.writeHtml(MLDB::format("

%s
%s
%s

%s\n", fd.fieldName.c_str(), getTypeName(*fd.description, context.engine).c_str(), - getDefaultValue(*fd.description).c_str(), + getDefaultValueStr(*fd.description).c_str(), renderMarkdown(fd.comment.c_str(), context).rawString())); }; vd->forEachField(nullptr, onField); diff --git a/io/testing/io_testing.mk b/io/testing/io_testing.mk index d9ca377da..3606c9613 100644 --- a/io/testing/io_testing.mk +++ b/io/testing/io_testing.mk @@ -1,6 +1,6 @@ # This file is part of MLDB. Copyright 2015 mldb.ai inc. All rights reserved. -$(eval $(call test,asio_timer_test,io_base watch types,boost)) +$(eval $(call test,asio_timer_test,io_base arch base value_description watch types,boost)) $(eval $(call test,async_writer_bench,io_base arch types,boost manual)) $(eval $(call test,epoll_test,io_base arch base,boost)) $(eval $(call test,epoller_test,io_base,boost)) diff --git a/types/any.cc b/types/any.cc index be415efbf..c72c0102f 100644 --- a/types/any.cc +++ b/types/any.cc @@ -22,6 +22,51 @@ namespace MLDB { /* ANY */ /*****************************************************************************/ +namespace { + +std::shared_ptr +initAnyFromJson(JsonParsingContext & context, + const ValueDescription * desc) +{ + ExcAssert(desc); + + void * ptr = nullptr; + if (desc->align < alignof(void *)) { + ptr = malloc(desc->width); + if (!ptr) + throw MLDB::Exception(errno, "malloc"); + } + else { + int res = posix_memalign(&ptr, desc->align, desc->width); + if (res != 0) + throw MLDB::Exception(res, "posix_memalign"); + } + + try { + desc->initializeDefault(ptr); + } MLDB_CATCH_ALL { + free(ptr); + throw; + } + + auto destruct = [desc] (void * ptr) + { + try { + desc->destruct(ptr); + } MLDB_CATCH_ALL { + free(ptr); + throw; + } + free(ptr); + }; + + std::shared_ptr result(ptr, std::move(destruct)); + desc->parseJson(result.get(), context); + return result; +} + +} // file scope + /** Construct directly from Json, with a known type */ Any:: Any(const Json::Value & val, @@ -30,8 +75,7 @@ Any(const Json::Value & val, desc_(desc) { StructuredJsonParsingContext context(val); - obj_.reset(desc->constructDefault(), [=] (void * obj) { desc->destroy(obj); }); - desc_->parseJson(obj_.get(), context); + obj_ = initAnyFromJson(context, desc); } Any:: @@ -42,8 +86,7 @@ Any(const std::string & jsonValString, { std::istringstream stream(jsonValString); StreamingJsonParsingContext context(jsonValString, stream); - obj_.reset(desc->constructDefault(), [=] (void * obj) { desc->destroy(obj); }); - desc_->parseJson(obj_.get(), context); + obj_ = initAnyFromJson(context, desc); } /** Get it as JSON */ @@ -175,13 +218,29 @@ throwNoValueDescription() const throw MLDB::Exception("Any had no type attached"); } +std::span +Any:: +asBytes() const +{ + return { (const std::byte *)obj_.get(), desc().width }; +} + bool operator==(const Any & lhs, const Any & rhs) { if (!lhs.desc_ || !rhs.desc_) { // we have no way to interpret the value - the best we can do is compare pointers return lhs.obj_ == rhs.obj_; } - else return lhs.asJsonStr() == rhs.asJsonStr(); + else if (lhs.desc_->type != rhs.desc_->type) { + // Cannot compare values if value descriptions are different + return false; + } + else if (lhs.desc_->hasEqualityComparison()) { + return lhs.desc_->compareEquality(lhs.obj_.get(), rhs.obj_.get()); + } + else { + return lhs.asJsonStr() == rhs.asJsonStr(); + } } struct AnyRep { @@ -235,13 +294,11 @@ parseJsonTyped(Any * val, // Get the default description for the type auto desc = ValueDescription::get(rep.typeName); - std::shared_ptr obj(desc->constructDefault(), - [=] (void * val) { desc->destroy(val); }); - + // Parse the payload StreamingJsonParsingContext pcontext(rep.payload, rep.payload.c_str(), rep.payload.size()); - desc->parseJson(obj.get(), pcontext); + auto obj = initAnyFromJson(pcontext, desc.get()); val->obj_ = std::move(obj); val->desc_ = desc.get(); diff --git a/types/any.h b/types/any.h index 900917bff..e8a1e5167 100644 --- a/types/any.h +++ b/types/any.h @@ -10,6 +10,8 @@ #include "mldb/types/value_description_fwd.h" #include "mldb/compiler/compiler.h" +#include + namespace MLDB { @@ -164,6 +166,9 @@ struct Any { */ Any getField(const std::string & fieldName) const; + // Return the underlying binary representation + std::span asBytes() const; + private: friend struct TypedAnyDescription; friend struct BareAnyDescription; diff --git a/types/array_description.h b/types/array_description.h index 7e3658f3e..1f37e84d0 100644 --- a/types/array_description.h +++ b/types/array_description.h @@ -98,10 +98,24 @@ struct ArrayDescription return val->empty(); } + virtual LengthModel getArrayLengthModel() const override + { + return LengthModel::FIXED; + } + + virtual OwnershipModel getArrayIndirectionModel() const override + { + return OwnershipModel::NONE; + } + + virtual size_t getArrayFixedLength() const override + { + return N; + } + virtual size_t getArrayLength(void * val) const override { - const std::array * val2 = reinterpret_cast *>(val); - return val2->size(); + return N; } virtual void * @@ -135,6 +149,6 @@ struct ArrayDescription }; -DECLARE_TEMPLATE_VALUE_DESCRIPTION_2(ArrayDescription, std::array, typename, T, size_t, N); +DECLARE_TEMPLATE_VALUE_DESCRIPTION_2(ArrayDescription, std::array, typename, T, size_t, N, MLDB::has_default_description::value); } // namespace MLDB diff --git a/types/basic_value_descriptions.cc b/types/basic_value_descriptions.cc index 5a4777e97..e8f93041b 100644 --- a/types/basic_value_descriptions.cc +++ b/types/basic_value_descriptions.cc @@ -5,13 +5,16 @@ Jeremy Barnes, 19 August 2015 */ + #include "basic_value_descriptions.h" +#include "comparable_value_descriptions.h" +#include +#include namespace MLDB { - struct StringDescription - : public ValueDescriptionI { + : public OrderedComparableValueDescriptionI { virtual void parseJsonTyped(std::string * val, JsonParsingContext & context) const @@ -33,8 +36,8 @@ struct StringDescription template struct ValueDescriptionI; -class Utf8StringDescription - : public ValueDescriptionI { +struct Utf8StringDescription + : public OrderedComparableValueDescriptionI { virtual void parseJsonTyped(Utf8String * val, JsonParsingContext & context) const @@ -57,7 +60,7 @@ class Utf8StringDescription template struct ValueDescriptionI; struct Utf32StringDescription - : public ValueDescriptionI { + : public OrderedComparableValueDescriptionI { virtual void parseJsonTyped(Utf32String *val, JsonParsingContext & context) const { @@ -81,198 +84,120 @@ struct Utf32StringDescription template struct ValueDescriptionI; -struct CharDescription - : public ValueDescriptionI { - - virtual void parseJsonTyped(char * val, - JsonParsingContext & context) const - { - *val = context.expectInt(); - } - - virtual void printJsonTyped(const char * val, - JsonPrintingContext & context) const - { - context.writeInt(*val); - } -}; - -template struct ValueDescriptionI; - -struct SignedCharDescription - : public ValueDescriptionI { - - virtual void parseJsonTyped(signed char * val, - JsonParsingContext & context) const - { - *val = context.expectInt(); - } - - virtual void printJsonTyped(const signed char * val, - JsonPrintingContext & context) const - { - context.writeInt(*val); - } -}; - -template struct ValueDescriptionI; - -struct UnsignedCharDescription - : public ValueDescriptionI { - - virtual void parseJsonTyped(unsigned char * val, - JsonParsingContext & context) const - { - *val = context.expectInt(); - } - - virtual void printJsonTyped(const unsigned char * val, - JsonPrintingContext & context) const - { - context.writeInt(*val); - } -}; - -struct SignedShortIntDescription - : public ValueDescriptionI { - - virtual void parseJsonTyped(signed short int * val, - JsonParsingContext & context) const - { - *val = context.expectInt(); - } - - virtual void printJsonTyped(const signed short int * val, - JsonPrintingContext & context) const - { - context.writeInt(*val); - } -}; - -template struct ValueDescriptionI; - -struct UnsignedShortIntDescription - : public ValueDescriptionI { - - virtual void parseJsonTyped(unsigned short int * val, - JsonParsingContext & context) const - { - *val = context.expectInt(); - } - - virtual void printJsonTyped(const unsigned short int * val, - JsonPrintingContext & context) const - { - context.writeInt(*val); - } -}; - -template struct ValueDescriptionI; - -struct SignedIntDescription - : public ValueDescriptionI { - - virtual void parseJsonTyped(signed int * val, - JsonParsingContext & context) const - { - *val = context.expectInt(); +template +struct IntegralValueDescription: public StrongComparableValueDescriptionI { + + static constexpr int Width = sizeof(T); + static constexpr bool Signed = std::is_signed_v; + + virtual void parseJsonTyped(T * val, + JsonParsingContext & context) const override + { + if constexpr (Signed) { + if constexpr (Width <= sizeof(int)) + *val = context.expectInt(); + else if constexpr (Width <= sizeof(long)) + *val = context.expectLong(); + else + *val = context.expectLongLong(); + } + else { + if constexpr (Width <= sizeof(int)) + *val = context.expectUnsignedInt(); + else if constexpr (Width <= sizeof(long)) + *val = context.expectUnsignedLong(); + else + *val = context.expectUnsignedLongLong(); + } } - virtual void printJsonTyped(const signed int * val, - JsonPrintingContext & context) const - { - context.writeInt(*val); + virtual void printJsonTyped(const T * val, + JsonPrintingContext & context) const override + { + if constexpr (Signed) { + if constexpr (Width <= sizeof(int)) + context.writeInt(*val); + else if constexpr (Width <= sizeof(long)) + context.writeLong(*val); + else + context.writeLongLong(*val); + } + else { + if constexpr (Width <= sizeof(int)) + context.writeUnsignedInt(*val); + else if constexpr (Width <= sizeof(long)) + context.writeUnsignedLong(*val); + else + context.writeUnsignedLongLong(*val); + } + } + + virtual void extractBitField(const void * from, void * to, uint32_t bitOffset, uint32_t bitWidth) const override + { + const auto & fromV = *reinterpret_cast(from); + auto & toV = *reinterpret_cast(to); + ExcAssertLess(bitWidth, Width * 8); + ExcAssertLessEqual(bitOffset + bitWidth, Width * 8); + toV = (fromV >> bitOffset) & ((T(1) << bitWidth)-1); + } + + virtual void insertBitField(const void * from, void * to, uint32_t bitOffset, uint32_t bitWidth) const override + { + const auto & fromV = *reinterpret_cast(from); + auto & toV = *reinterpret_cast(to); + ExcAssertLessEqual(bitWidth, Width * 8); + ExcAssertLessEqual(bitOffset + bitWidth, Width * 8); + auto fromMask = (T(1) << bitWidth) - 1; + auto toMask = fromMask << bitOffset; + ExcAssertEqual((fromV & fromMask), 0); + toV = (toV & ~toMask) | (fromV << bitWidth); } }; -template struct ValueDescriptionI; -struct UnsignedIntDescription - : public ValueDescriptionI { +#define DEFINE_INTEGRAL_DESCRIPTION(Type, Desc) \ +struct Desc##Description : public IntegralValueDescription {}; \ +template struct ValueDescriptionI; \ +DEFINE_VALUE_DESCRIPTION(Type, Desc##Description) - virtual void parseJsonTyped(unsigned int * val, - JsonParsingContext & context) const - { - *val = context.expectInt(); - } - - virtual void printJsonTyped(const unsigned int * val, - JsonPrintingContext & context) const - { - context.writeInt(*val); - } -}; +DEFINE_INTEGRAL_DESCRIPTION(char, Char); +DEFINE_INTEGRAL_DESCRIPTION(unsigned char, UnsignedChar); +DEFINE_INTEGRAL_DESCRIPTION(signed char, SignedChar); +DEFINE_INTEGRAL_DESCRIPTION(unsigned short, UnsignedShort); +DEFINE_INTEGRAL_DESCRIPTION(signed short, SignedShort); +DEFINE_INTEGRAL_DESCRIPTION(unsigned int, UnsignedInt); +DEFINE_INTEGRAL_DESCRIPTION(signed int, SignedInt); +DEFINE_INTEGRAL_DESCRIPTION(unsigned long, UnsignedLong); +DEFINE_INTEGRAL_DESCRIPTION(signed long, SignedLong); +DEFINE_INTEGRAL_DESCRIPTION(unsigned long long, UnsignedLongLong); +DEFINE_INTEGRAL_DESCRIPTION(signed long long, SignedLongLong); -template struct ValueDescriptionI; -struct SignedLongDescription - : public ValueDescriptionI { +struct HalfValueDescription + : public PartialComparableValueDescriptionI { - virtual void parseJsonTyped(signed long * val, + virtual void parseJsonTyped(half * val, JsonParsingContext & context) const { - *val = context.expectLong(); - } - - virtual void printJsonTyped(const signed long * val, - JsonPrintingContext & context) const - { - context.writeLong(*val); + *val = context.expectFloat(); } -}; -template struct ValueDescriptionI; - -struct UnsignedLongDescription - : public ValueDescriptionI { - - virtual void parseJsonTyped(unsigned long * val, - JsonParsingContext & context) const - { - *val = context.expectUnsignedLong(); - } - - virtual void printJsonTyped(const unsigned long * val, - JsonPrintingContext & context) const + virtual void parseJson(void * val, + JsonParsingContext & context) const { - context.writeUnsignedLong(*val); + *(half *)val = context.expectFloat(); } -}; -struct SignedLongLongDescription - : public ValueDescriptionI { - - virtual void parseJsonTyped(signed long long * val, - JsonParsingContext & context) const - { - *val = context.expectLongLong(); - } - - virtual void printJsonTyped(const signed long long * val, + virtual void printJsonTyped(const half * val, JsonPrintingContext & context) const { - context.writeLongLong(*val); + context.writeFloat(*val); } }; -struct UnsignedLongLongDescription - : public ValueDescriptionI { - - virtual void parseJsonTyped(unsigned long long * val, - JsonParsingContext & context) const - { - *val = context.expectUnsignedLongLong(); - } - - virtual void printJsonTyped(const unsigned long long * val, - JsonPrintingContext & context) const - { - context.writeUnsignedLongLong(*val); - } -}; struct FloatValueDescription - : public ValueDescriptionI { + : public PartialComparableValueDescriptionI { virtual void parseJsonTyped(float * val, JsonParsingContext & context) const @@ -294,7 +219,7 @@ struct FloatValueDescription }; struct DoubleValueDescription - : public ValueDescriptionI { + : public PartialComparableValueDescriptionI { virtual void parseJsonTyped(double * val, JsonParsingContext & context) const @@ -310,7 +235,7 @@ struct DoubleValueDescription }; struct JsonValueDescription - : public ValueDescriptionI { + : public EqualityComparableValueDescriptionI { virtual void parseJsonTyped(Json::Value * val, JsonParsingContext & context) const @@ -331,7 +256,7 @@ struct JsonValueDescription }; struct BoolDescription - : public ValueDescriptionI { + : public StrongComparableValueDescriptionI { virtual void parseJsonTyped(bool * val, JsonParsingContext & context) const @@ -354,17 +279,7 @@ struct BoolDescription DEFINE_VALUE_DESCRIPTION(std::string, StringDescription); DEFINE_VALUE_DESCRIPTION(Utf8String, Utf8StringDescription); DEFINE_VALUE_DESCRIPTION(Utf32String, Utf32StringDescription); -DEFINE_VALUE_DESCRIPTION(char, CharDescription); -DEFINE_VALUE_DESCRIPTION(signed char, SignedCharDescription); -DEFINE_VALUE_DESCRIPTION(unsigned char, UnsignedCharDescription); -DEFINE_VALUE_DESCRIPTION(signed short int, SignedShortIntDescription); -DEFINE_VALUE_DESCRIPTION(unsigned short int, UnsignedShortIntDescription); -DEFINE_VALUE_DESCRIPTION(signed int, SignedIntDescription); -DEFINE_VALUE_DESCRIPTION(unsigned int, UnsignedIntDescription); -DEFINE_VALUE_DESCRIPTION(signed long, SignedLongDescription); -DEFINE_VALUE_DESCRIPTION(unsigned long, UnsignedLongDescription); -DEFINE_VALUE_DESCRIPTION(signed long long, SignedLongLongDescription); -DEFINE_VALUE_DESCRIPTION(unsigned long long, UnsignedLongLongDescription); +DEFINE_VALUE_DESCRIPTION(half, HalfValueDescription); DEFINE_VALUE_DESCRIPTION(float, FloatValueDescription); DEFINE_VALUE_DESCRIPTION(double, DoubleValueDescription); DEFINE_VALUE_DESCRIPTION(Json::Value, JsonValueDescription); diff --git a/types/compact_vector_description.h b/types/compact_vector_description.h index 03db86d48..ee994019d 100644 --- a/types/compact_vector_description.h +++ b/types/compact_vector_description.h @@ -66,6 +66,16 @@ struct CompactVectorDescription return val->empty(); } + virtual LengthModel getArrayLengthModel() const override + { + return LengthModel::VARIABLE; + } + + virtual OwnershipModel getArrayIndirectionModel() const override + { + return OwnershipModel::UNIQUE; + } + virtual size_t getArrayLength(void * val) const override { const compact_vector * val2 = reinterpret_cast *>(val); @@ -109,7 +119,8 @@ struct CompactVectorDescription DECLARE_TEMPLATE_VALUE_DESCRIPTION_6(CompactVectorDescription, compact_vector, typename, T, size_t, I, typename, S, - bool, Sf, typename, P, typename, A); + bool, Sf, typename, P, typename, A, + MLDB::has_default_description::value); diff --git a/types/comparable_value_descriptions.h b/types/comparable_value_descriptions.h new file mode 100644 index 000000000..4ab0beb58 --- /dev/null +++ b/types/comparable_value_descriptions.h @@ -0,0 +1,126 @@ +// This file is part of MLDB. Copyright 2015 mldb.ai inc. All rights reserved. + +/** basic_value_descriptions.cc + + Jeremy Barnes, 19 August 2015 +*/ + +#pragma once +#include "value_description.h" + +namespace MLDB { + +template +struct StrongComparableValueDescriptionI: public ValueDescriptionI { + static const Type & getValue(const void * val) { return *(const Type *)val; } + + virtual bool hasEqualityComparison() const override { return true; } + virtual bool compareEquality(const void * val1, const void * val2) const override + { + return getValue(val1) == getValue(val2); + } + virtual bool hasLessThanComparison() const override { return true; } + virtual bool compareLessThan(const void * val1, const void * val2) const override + { + return getValue(val1) < getValue(val2); + } + virtual bool hasStrongOrderingComparison() const override + { + return true; + } + virtual std::strong_ordering compareStrong(const void * val1, const void * val2) const override + { + return getValue(val1) <=> getValue(val2); + } + + virtual bool hasWeakOrderingComparison() const override { return true; } + virtual std::weak_ordering compareWeak(const void * val1, const void * val2) const override + { + return getValue(val1) <=> getValue(val2); + } + + virtual bool hasPartialOrderingComparison() const override { return true; } + virtual std::partial_ordering comparePartial(const void * val1, const void * val2) const override + { + return getValue(val1) <=> getValue(val2); + } +}; + +template +struct WeakComparableValueDescriptionI: public ValueDescriptionI { + static const Type & getValue(const void * val) { return *(const Type *)val; } + + virtual bool hasEqualityComparison() const override { return true; } + virtual bool compareEquality(const void * val1, const void * val2) const override + { + return getValue(val1) == getValue(val2); + } + virtual bool hasLessThanComparison() const override { return true; } + virtual bool compareLessThan(const void * val1, const void * val2) const override + { + return getValue(val1) < getValue(val2); + } + + virtual bool hasWeakOrderingComparison() const override { return true; } + virtual std::weak_ordering compareWeak(const void * val1, const void * val2) const override + { + return getValue(val1) <=> getValue(val2); + } + + virtual bool hasPartialOrderingComparison() const override { return true; } + virtual std::partial_ordering comparePartial(const void * val1, const void * val2) const override + { + return getValue(val1) <=> getValue(val2); + } +}; + +template +struct PartialComparableValueDescriptionI: public ValueDescriptionI { + static const Type & getValue(const void * val) { return *(const Type *)val; } + + virtual bool hasEqualityComparison() const override { return true; } + virtual bool compareEquality(const void * val1, const void * val2) const override + { + return getValue(val1) == getValue(val2); + } + virtual bool hasLessThanComparison() const override { return true; } + virtual bool compareLessThan(const void * val1, const void * val2) const override + { + return getValue(val1) < getValue(val2); + } + + virtual bool hasPartialOrderingComparison() const override { return true; } + virtual std::partial_ordering comparePartial(const void * val1, const void * val2) const override + { + return getValue(val1) <=> getValue(val2); + } +}; + +template +struct OrderedComparableValueDescriptionI: public ValueDescriptionI { + static const Type & getValue(const void * val) { return *(const Type *)val; } + + virtual bool hasEqualityComparison() const override { return true; } + virtual bool compareEquality(const void * val1, const void * val2) const override + { + return getValue(val1) == getValue(val2); + } + virtual bool hasLessThanComparison() const override { return true; } + virtual bool compareLessThan(const void * val1, const void * val2) const override + { + return getValue(val1) < getValue(val2); + } +}; + +template +struct EqualityComparableValueDescriptionI: public ValueDescriptionI { + static const Type & getValue(const void * val) { return *(const Type *)val; } + + virtual bool hasEqualityComparison() const override { return true; } + virtual bool compareEquality(const void * val1, const void * val2) const override + { + return getValue(val1) == getValue(val2); + } +}; + +} // namespace MLDB diff --git a/types/distribution_description.h b/types/distribution_description.h index 79ed47100..be34162a3 100644 --- a/types/distribution_description.h +++ b/types/distribution_description.h @@ -86,6 +86,16 @@ struct DistributionValueDescription return val2->size(); } + virtual LengthModel getArrayLengthModel() const override + { + return LengthModel::VARIABLE; + } + + virtual OwnershipModel getArrayIndirectionModel() const override + { + return OwnershipModel::UNIQUE; + } + virtual void * getArrayElement(void * val, uint32_t element) const override { distribution * val2 = reinterpret_cast *>(val); @@ -116,7 +126,7 @@ struct DistributionValueDescription } }; -DECLARE_TEMPLATE_VALUE_DESCRIPTION_2(DistributionValueDescription, distribution, typename, T, class, Underlying); +DECLARE_TEMPLATE_VALUE_DESCRIPTION_2(DistributionValueDescription, distribution, typename, T, class, Underlying, MLDB::has_default_description::value); MLDB::ValueDescriptionT > * getDefaultDescription(const distribution * = 0); diff --git a/types/dtoa_impl.cc b/types/dtoa_impl.cc index 37de12630..64113ff07 100644 --- a/types/dtoa_impl.cc +++ b/types/dtoa_impl.cc @@ -103,15 +103,16 @@ std::string dtoa_impl(double floatVal, int mode, int numDigits, int biasAgainstS toReturn.insert(2, "0"); } else { + auto ndigits = toReturn.size(); size_t lenScientific - = toReturn.size() // digits - + (toReturn.size() > 1 ? 1 : 0) // decimal point + = ndigits // digits + + (ndigits > 1 ? 1 : 0) // decimal point + 1 // e + std::to_string(decpt-1).size(); // exponent size_t lenNormal = toReturn.size() // digits - + (decpt > 1 ? decpt - 1 : 0); // extra zeros + + (decpt > 1 ? decpt - ndigits : 0); // extra zeros if (debug) { cerr << "working on decpt" << endl; @@ -121,8 +122,8 @@ std::string dtoa_impl(double floatVal, int mode, int numDigits, int biasAgainstS } if (decpt > 1 && lenNormal <= lenScientific + biasAgainstScientific) { // If it's short enough then just add zeros, so we don't get 10 -> 1e1 - if (debug) cerr << "appending " << decpt - 1 << " zeros" << endl; - toReturn.append(decpt - 1, '0'); + if (debug) cerr << "appending " << decpt - ndigits << " zeros" << endl; + toReturn.append(decpt - ndigits, '0'); ExcAssertEqual(toReturn.size(), lenNormal); } else { diff --git a/types/enum_description.h b/types/enum_description.h index 6cbda188d..86aa171f6 100644 --- a/types/enum_description.h +++ b/types/enum_description.h @@ -13,19 +13,17 @@ namespace MLDB { - /*****************************************************************************/ /* ENUM DESCRIPTION */ /*****************************************************************************/ -template +template> struct EnumDescription: public ValueDescriptionT { - using Underlying = std::underlying_type_t; - - EnumDescription() + EnumDescription(std::shared_ptr underlying = getDefaultDescriptionSharedT()) : ValueDescriptionT(ValueKind::ENUM), - hasDefault(false), defaultValue(Enum(0)) + hasDefault(false), defaultValue(Enum(0)), + underlying(std::move(underlying)) { } @@ -44,11 +42,11 @@ struct EnumDescription: public ValueDescriptionT { { auto it = print.find(e); if (it == print.end()) - return std::to_string((int)e); + return std::to_string((Underlying)e); else return it->second.first; } - virtual void parseJsonTyped(Enum * val, JsonParsingContext & context) const + virtual void parseJsonTyped(Enum * val, JsonParsingContext & context) const override { if (context.isNull()) { context.exception("NULL value found parsing enumeration " @@ -69,7 +67,7 @@ struct EnumDescription: public ValueDescriptionT { *val = (Enum)context.expectInt(); } - virtual void printJsonTyped(const Enum * val, JsonPrintingContext & context) const ATTRIBUTE_NO_SANITIZE_UNDEFINED + virtual void printJsonTyped(const Enum * val, JsonPrintingContext & context) const override ATTRIBUTE_NO_SANITIZE_UNDEFINED { auto it = print.find(static_cast(*val)); if (it == print.end()) @@ -77,20 +75,31 @@ struct EnumDescription: public ValueDescriptionT { else context.writeString(it->second.first); } - virtual bool isDefaultTyped(const Enum * val) const + virtual bool isDefaultTyped(const Enum * val) const override { if (!hasDefault) return false; return *val == defaultValue; } - virtual void setDefaultTyped(Enum * val) const + virtual void setDefaultTyped(Enum * val) const override { *val = defaultValue; } + virtual const ValueDescription & contained() const override + { + return *underlying; + } + + virtual std::shared_ptr containedPtr() const override + { + return underlying; + } + bool hasDefault; Enum defaultValue; + std::shared_ptr underlying; void setDefaultValue(Enum value) { @@ -104,7 +113,7 @@ struct EnumDescription: public ValueDescriptionT { throw MLDB::Exception("double added name '" + name + "' to enum '" + this->typeName + "'"); - print.insert({ value, { name, "" } }); + print.insert({ static_cast(value), { name, "" } }); } void addValue(const std::string & name, Enum value, @@ -116,7 +125,7 @@ struct EnumDescription: public ValueDescriptionT { } virtual std::vector > - getEnumValues() const + getEnumValues() const override { std::vector > result; for (auto & v: print) @@ -124,7 +133,7 @@ struct EnumDescription: public ValueDescriptionT { return result; } - virtual const std::vector getEnumKeys() const + virtual const std::vector getEnumKeys() const override { std::vector res; for (const auto & it: print) { @@ -133,6 +142,16 @@ struct EnumDescription: public ValueDescriptionT { return res; } + virtual void extractBitField(const void * from, void * to, uint32_t bitOffset, uint32_t bitWidth) const override + { + underlying->extractBitField(from, to, bitOffset, bitWidth); + } + + virtual void insertBitField(const void * from, void * to, uint32_t bitOffset, uint32_t bitWidth) const override + { + underlying->insertBitField(from, to, bitOffset, bitWidth); + } + std::unordered_map parse; std::map > print; }; diff --git a/types/exception_description.cc b/types/exception_description.cc new file mode 100644 index 000000000..c3d6e1483 --- /dev/null +++ b/types/exception_description.cc @@ -0,0 +1,74 @@ +/* exception_description.cc -*- C++ -*- + Jeremy Barnes, 29 March 2013 + Copyright (c) 2013 mldb.ai inc. All rights reserved. + + This file is part of MLDB. Copyright 2015 mldb.ai inc. All rights reserved. +*/ + +#include "exception_description.h" +#include "value_description.h" +#include "annotated_exception.h" + +namespace MLDB { + +struct ExceptionPtrDescription: public ValueDescriptionT { + + + virtual void parseJsonTyped(std::exception_ptr * val, + JsonParsingContext & context) const override + { + MLDB_THROW_UNIMPLEMENTED("can't parse exception pointers"); + } + + virtual void printJsonTyped(const std::exception_ptr * val, + JsonPrintingContext & context) const override + { + if (!(*val)) { + context.writeNull(); + return; + } + + MLDB_TRACE_EXCEPTIONS(false); + + context.startObject(); + + try { + std::rethrow_exception(*val); + } catch (const AnnotatedException & exc) { + context.startMember("message"); + context.writeStringUtf8(getUtf8ExceptionString()); + context.startMember("type"); + context.writeString(demangle(typeid(exc).name())); + context.startMember("httpCode"); + context.writeInt(exc.httpCode); + if (!exc.details.empty()) { + context.startMember("details"); + std::shared_ptr desc = getDefaultDescriptionSharedT(); + desc->printJson(&exc.details, context); + } + } catch (const std::exception & exc) { + context.startMember("message"); + context.writeStringUtf8(getUtf8ExceptionString()); + context.startMember("type"); + context.writeString(demangle(typeid(exc).name())); + } catch (...) { + context.startMember("message"); + context.writeStringUtf8(getUtf8ExceptionString()); + } + + context.endObject(); + } + + virtual bool isDefaultTyped(const std::exception_ptr * val) const override + { + return !(*val); + } +}; + +} // namespace MLDB + +namespace std { + +DEFINE_VALUE_DESCRIPTION_NS(std::exception_ptr, MLDB::ExceptionPtrDescription); + +} // namespace std diff --git a/types/exception_description.h b/types/exception_description.h new file mode 100644 index 000000000..48e7ce9a0 --- /dev/null +++ b/types/exception_description.h @@ -0,0 +1,17 @@ +/* exception_description.h -*- C++ -*- + Jeremy Barnes, 29 March 2013 + Copyright (c) 2013 mldb.ai inc. All rights reserved. + + This file is part of MLDB. Copyright 2015 mldb.ai inc. All rights reserved. +*/ + +#pragma once + +#include "value_description_fwd.h" +#include + +namespace std { + +PREDECLARE_VALUE_DESCRIPTION(std::exception_ptr); + +} // namespace std diff --git a/types/generic_array_description.cc b/types/generic_array_description.cc new file mode 100644 index 000000000..0480dfbaa --- /dev/null +++ b/types/generic_array_description.cc @@ -0,0 +1,201 @@ +/** generic_array_description.cc -*- C++ -*- + Jeremy Barnes, 4 January 2015 + This file is part of MLDB. Copyright 2015 mldb.ai inc. All rights reserved. + + Description of generic arrays +*/ + +#include "generic_array_description.h" + +namespace MLDB { + +GenericFixedLengthArrayDescription:: +GenericFixedLengthArrayDescription(size_t width, + size_t align, + const std::string & typeName, + std::shared_ptr inner, + size_t fixedLength) + : ValueDescription(ValueKind::ARRAY, nullptr, width, align, typeName), + inner(inner), fixedLength(fixedLength) +{ + ExcAssert(inner); + ExcAssertEqual(width, inner->width * fixedLength); +} + +void +GenericFixedLengthArrayDescription:: +parseJson(void * val, + JsonParsingContext & context) const +{ + if (!context.isArray()) + context.exception("expected array of " + inner->typeName); + + size_t i = 0; + auto onElement = [&] () + { + if (i >= fixedLength) + context.exception("too many elements in array"); + inner->parseJson(getElement(val, i++), context); + }; + + context.forEachElement(onElement); + + if (i != fixedLength) { + context.exception("not enough elements in array; expecting " + + std::to_string(fixedLength) + " but got " + + std::to_string(i)); + } +} + +void +GenericFixedLengthArrayDescription:: +printJson(const void * val, + JsonPrintingContext & context) const +{ + context.startArray(fixedLength); + + for (size_t i = 0; i < fixedLength; ++i) { + context.newArrayElement(); + inner->printJson(getElement(val, i), context); + } + + context.endArray(); +} + +bool +GenericFixedLengthArrayDescription:: +isDefault(const void * val) const +{ + return false; // for now +} + +LengthModel +GenericFixedLengthArrayDescription:: +getArrayLengthModel() const +{ + return LengthModel::FIXED; +} + +OwnershipModel +GenericFixedLengthArrayDescription:: +getArrayIndirectionModel() const +{ + return OwnershipModel::NONE; +} + +size_t +GenericFixedLengthArrayDescription:: +getArrayFixedLength() const +{ + return fixedLength; +} + +size_t +GenericFixedLengthArrayDescription:: +getArrayLength(void * val) const +{ + return fixedLength; +} + +void * +GenericFixedLengthArrayDescription:: +getArrayElement(void * val, uint32_t element) const +{ + return getElement(val, element); +} + +const void * +GenericFixedLengthArrayDescription:: +getArrayElement(const void * val, uint32_t element) const +{ + return getElement(val, element); +} + +const ValueDescription & +GenericFixedLengthArrayDescription:: +contained() const +{ + return *this->inner; +} + +std::shared_ptr +GenericFixedLengthArrayDescription:: +containedPtr() const +{ + return this->inner; +} + +void +GenericFixedLengthArrayDescription:: +setDefault(void * val) const +{ + for (size_t i = 0; i < fixedLength; ++i) { + inner->setDefault(getElement(val, i)); + } +} + +void +GenericFixedLengthArrayDescription:: +copyValue(const void * from, void * to) const +{ + for (size_t i = 0; i < fixedLength; ++i) { + inner->copyValue(getElement(from, i), getElement(to, i)); + } +} + +void +GenericFixedLengthArrayDescription:: +moveValue(void * from, void * to) const +{ + for (size_t i = 0; i < fixedLength; ++i) { + inner->moveValue(getElement(from, i), getElement(to, i)); + } +} + +void +GenericFixedLengthArrayDescription:: +swapValues(void * from, void * to) const +{ + for (size_t i = 0; i < fixedLength; ++i) { + inner->swapValues(getElement(from, i), getElement(to, i)); + } +} + +void +GenericFixedLengthArrayDescription:: +initializeDefault(void * mem) const +{ + for (size_t i = 0; i < fixedLength; ++i) { + inner->initializeDefault(getElement(mem, i)); + } +} + +void +GenericFixedLengthArrayDescription:: +initializeCopy(void * mem, const void * other) const +{ + for (size_t i = 0; i < fixedLength; ++i) { + inner->initializeCopy(getElement(mem, i), getElement(other, i)); + } +} + +void +GenericFixedLengthArrayDescription:: +initializeMove(void * mem, void * other) const +{ + for (size_t i = 0; i < fixedLength; ++i) { + inner->initializeMove(getElement(mem, i), getElement(other, i)); + } +} + +void +GenericFixedLengthArrayDescription:: +destruct(void * mem) const +{ + for (size_t i = 0; i < fixedLength; ++i) { + inner->destruct(getElement(mem, i)); + } +} + +} // namespace MLDB + diff --git a/types/generic_array_description.h b/types/generic_array_description.h new file mode 100644 index 000000000..1a04982b7 --- /dev/null +++ b/types/generic_array_description.h @@ -0,0 +1,67 @@ +/** generic_array_description.h -*- C++ -*- + Jeremy Barnes, 4 January 2015 + This file is part of MLDB. Copyright 2015 mldb.ai inc. All rights reserved. + + Description of generic arrays +*/ + +#pragma once + +#include "mldb/types/value_description.h" + +namespace MLDB { + +// Value description for a generic fixed-length array of values. Does not need to mirror +// a C++ type. Models std::array. + +struct GenericFixedLengthArrayDescription + : public ValueDescription { + + GenericFixedLengthArrayDescription(size_t width, + size_t align, + const std::string & typeName, + std::shared_ptr inner, + size_t fixedLength); + + std::shared_ptr inner; + size_t fixedLength = 0; + + inline std::byte * getElement(void * valIn, size_t elNum) const + { + std::byte * val = (std::byte *)valIn; + ExcAssertLess(elNum, fixedLength); + return val + (inner->width * elNum); + } + + inline const std::byte * getElement(const void * valIn, size_t elNum) const + { + const std::byte * val = (const std::byte *)valIn; + ExcAssertLess(elNum, fixedLength); + return val + (inner->width * elNum); + } + + virtual void parseJson(void * val, + JsonParsingContext & context) const override; + virtual void printJson(const void * val, + JsonPrintingContext & context) const override; + virtual bool isDefault(const void * val) const override; + virtual LengthModel getArrayLengthModel() const override; + virtual OwnershipModel getArrayIndirectionModel() const override; + virtual size_t getArrayFixedLength() const override; + virtual size_t getArrayLength(void * val) const override; + virtual void * getArrayElement(void * val, uint32_t element) const override; + virtual const void * getArrayElement(const void * val, uint32_t element) const override; + virtual const ValueDescription & contained() const override; + virtual std::shared_ptr containedPtr() const override; + virtual void setDefault(void * val) const override; + virtual void copyValue(const void * from, void * to) const override; + virtual void moveValue(void * from, void * to) const override; + virtual void swapValues(void * from, void * to) const override; + virtual void initializeDefault(void * mem) const override; + virtual void initializeCopy(void * mem, const void * other) const override; + virtual void initializeMove(void * mem, void * other) const override; + virtual void destruct(void * mem) const override; +}; + +} // namespace MLDB + diff --git a/types/generic_atom_description.cc b/types/generic_atom_description.cc new file mode 100644 index 000000000..30eddbdeb --- /dev/null +++ b/types/generic_atom_description.cc @@ -0,0 +1,107 @@ +/** generic_atom_description.cc -*- C++ -*- + Jeremy Barnes, 4 January 2015 + This file is part of MLDB. Copyright 2015 mldb.ai inc. All rights reserved. + + Description of generic atom types +*/ + +#include "generic_atom_description.h" + +#define THROW_NOT_SUPPORTED do { throw MLDB::Exception(std::string("Not supported: ") + __PRETTY_FUNCTION__ + " at " + __FILE__ + ":" + std::to_string(__LINE__)); } while (false) // + " at " + __FILE__ + ":" + __LINE__) + +namespace MLDB { + +GenericAtomDescription:: +GenericAtomDescription(size_t width, + size_t align, + const std::string & typeName, + const std::type_info * type) + : ValueDescription(ValueKind::ATOM, type, width, align, typeName) +{ + if (width > MAX_WIDTH) + throw LogicError("Atoms can't be more than 64 bytes"); +} + +void +GenericAtomDescription:: +parseJson(void * val, + JsonParsingContext & context) const +{ + THROW_NOT_SUPPORTED; +} + +void +GenericAtomDescription:: +printJson(const void * val, + JsonPrintingContext & context) const +{ + THROW_NOT_SUPPORTED; +} + +bool +GenericAtomDescription:: +isDefault(const void * val) const +{ + return false; +} + +void +GenericAtomDescription:: +setDefault(void * val) const +{ + THROW_NOT_SUPPORTED; +} + +void +GenericAtomDescription:: +copyValue(const void * from, void * to) const +{ + memcpy(to, from, width); +} + +void +GenericAtomDescription:: +moveValue(void * from, void * to) const +{ + memcpy(to, from, width); +} + +void +GenericAtomDescription:: +swapValues(void * from, void * to) const +{ + std::byte tmp[MAX_WIDTH]; + memcpy(tmp, from, width); + memcpy(from, to, width); + memcpy(to, tmp, width); +} + +void +GenericAtomDescription:: +initializeDefault(void * mem) const +{ + THROW_NOT_SUPPORTED; +} + +void +GenericAtomDescription:: +initializeCopy(void * mem, const void * other) const +{ + memcpy(mem, other, width); +} + +void +GenericAtomDescription:: +initializeMove(void * mem, void * other) const +{ + memcpy(mem, other, width); +} + +void +GenericAtomDescription:: +destruct(void * mem) const +{ +} + +} // namespace MLDB + diff --git a/types/generic_atom_description.h b/types/generic_atom_description.h new file mode 100644 index 000000000..b72209964 --- /dev/null +++ b/types/generic_atom_description.h @@ -0,0 +1,43 @@ +/** generic_array_description.h -*- C++ -*- + Jeremy Barnes, 4 January 2015 + This file is part of MLDB. Copyright 2015 mldb.ai inc. All rights reserved. + + Description of generic arrays +*/ + +#pragma once + +#include "mldb/types/value_description.h" + +namespace MLDB { + +// Value description for a generic atomic type (whose representation is trivial) with a fixed +// number of bytes. + +struct GenericAtomDescription + : public ValueDescription { + + static constexpr size_t MAX_WIDTH = 64; // max number of bytes a generic atom can be + + GenericAtomDescription(size_t width, + size_t align, + const std::string & typeName, + const std::type_info * type = nullptr); + + virtual void parseJson(void * val, + JsonParsingContext & context) const override; + virtual void printJson(const void * val, + JsonPrintingContext & context) const override; + virtual bool isDefault(const void * val) const override; + virtual void setDefault(void * val) const override; + virtual void copyValue(const void * from, void * to) const override; + virtual void moveValue(void * from, void * to) const override; + virtual void swapValues(void * from, void * to) const override; + virtual void initializeDefault(void * mem) const override; + virtual void initializeCopy(void * mem, const void * other) const override; + virtual void initializeMove(void * mem, void * other) const override; + virtual void destruct(void * mem) const override; +}; + +} // namespace MLDB + diff --git a/types/generic_enum_description.h b/types/generic_enum_description.h new file mode 100644 index 000000000..4741822ad --- /dev/null +++ b/types/generic_enum_description.h @@ -0,0 +1,195 @@ +/** generic_enum_description.h -*- C++ -*- + Jeremy Barnes, 21 August 2015 + Copyright (c) 2015 mldb.ai inc. All rights reserved. + This file is part of MLDB. Copyright 2015 mldb.ai inc. All rights reserved. + + Value description for an enum. +*/ + +#pragma once + +#include "value_description.h" +#include "mldb/compiler/compiler.h" + +namespace MLDB { + + +/*****************************************************************************/ +/* GENERIC ENUM DESCRIPTION */ +/*****************************************************************************/ + +/** Enum description that's not based on a C++ type. */ + +struct GenericEnumDescription: public ValueDescription { + GenericEnumDescription(std::shared_ptr underlying, std::string typeName, + const std::type_info * type = nullptr) + : ValueDescription(ValueKind::ENUM, type, underlying->width, underlying->align, std::move(typeName)), + underlying(std::move(underlying)) + { + } + + using Enum = int; + std::shared_ptr defaultValue; + std::shared_ptr underlying; + std::unordered_map parse; + std::map > print; + + /** Parse the value of the enum which is already in a string. */ + Enum parseString(const std::string & s) const + { + auto it = parse.find(s); + if (it == parse.end()) + throw MLDB::Exception("unknown value for " + this->typeName + + ": " + s); + return it->second; + } + + /** Convert the value of the enum to a string that represents the value. */ + std::string printString(Enum e) const + { + auto it = print.find(e); + if (it == print.end()) + return std::to_string(e); + else return it->second.first; + } + + Enum getValue(const void * val) const + { + auto jval = underlying->printJsonStructured(val); + return jval.asInt(); + } + + void setValue(void * val, Enum to) const + { + // TODO: anything but JSON... + Json::Value jval(to); + StructuredJsonParsingContext context(jval); + underlying->parseJson(val, context); + } + + virtual void parseJson(void * val, JsonParsingContext & context) const override + { + if (context.isNull()) { + context.exception("NULL value found parsing enumeration " + + this->typeName + "; expected either a " + "string or an integer"); + } + + if (context.isString()) { + std::string s = context.expectStringAscii(); + auto it = parse.find(s); + if (it == parse.end()) + context.exception("unknown value for " + this->typeName + + ": " + s); + setValue(val, it->second); + return; + } + + // Otherwise, it was serialized directly as an integer + underlying->parseJson(val, context); + } + + virtual void printJson(const void * val, JsonPrintingContext & context) const override + { + auto val2 = getValue(val); + auto it = print.find(val2); + if (it == print.end()) + underlying->printJson(val, context); + else context.writeString(it->second.first); + } + + virtual bool isDefault(const void * val) const override + { + if (!defaultValue) + return false; + return underlying->compareEquality(val, defaultValue.get()); + } + + virtual void setDefault(void * val) const override + { + if (!defaultValue) + underlying->setDefault(val); + } + + virtual void copyValue(const void * from, void * to) const override + { + underlying->copyValue(from, to); + } + + virtual void moveValue(void * from, void * to) const override + { + underlying->moveValue(from, to); + } + + virtual void swapValues(void * from, void * to) const override + { + underlying->swapValues(from, to); + } + + virtual void initializeDefault(void * obj) const override + { + if (!defaultValue) { + underlying->initializeDefault(obj); + return; + } + underlying->initializeCopy(obj, defaultValue.get()); + } + + virtual void initializeCopy(void * obj, const void * other) const override + { + underlying->initializeCopy(obj, other); + } + + virtual void initializeMove(void * obj, void * other) const override + { + underlying->initializeMove(obj, other); + } + + virtual void destruct(void * obj) const override + { + underlying->destruct(obj); + } + + void setDefaultValue(Enum value) + { + throw MLDB::Exception("setDefaultValue"); + } + + void addValue(const std::string & name, Enum value) + { + if (!parse.insert(make_pair(name, value)).second) + throw MLDB::Exception("double added name '" + name + "' to enum '" + + this->typeName + "'"); + + print.insert({ value, { name, "" } }); + } + + void addValue(const std::string & name, Enum value, + const std::string & description) + { + if (!parse.insert(make_pair(name, value)).second) + throw MLDB::Exception("double added name to enum"); + print.insert({ value, { name, description } }); + } + + virtual std::vector > + getEnumValues() const override + { + std::vector > result; + for (auto & v: print) + result.emplace_back((int)v.first, v.second.first, v.second.second); + return result; + } + + virtual const std::vector getEnumKeys() const override + { + std::vector res; + for (const auto & it: print) { + res.push_back(it.second.first); + } + return res; + } +}; + + +} // namespace MLDB diff --git a/types/hash_wrapper.h b/types/hash_wrapper.h index b5be0701b..f36d173cf 100644 --- a/types/hash_wrapper.h +++ b/types/hash_wrapper.h @@ -135,8 +135,8 @@ typedef HashWrapper<2> VH; ///< Verb Hash template struct HashWrapperDescription; template struct IntWrapperDescription; -DECLARE_TEMPLATE_VALUE_DESCRIPTION_1(HashWrapper, HashWrapperDescription, int, Domain); -DECLARE_TEMPLATE_VALUE_DESCRIPTION_2(IntWrapper, IntWrapperDescription, typename, Int, int, Domain); +DECLARE_TEMPLATE_VALUE_DESCRIPTION_1(HashWrapper, HashWrapperDescription, int, Domain, true /* enable */); +DECLARE_TEMPLATE_VALUE_DESCRIPTION_2(IntWrapper, IntWrapperDescription, typename, Int, int, Domain, true /* enable */); // Allow it to be used as part of a REST interface diff --git a/types/json_parsing.cc b/types/json_parsing.cc index 2d7478f85..78f18bb4c 100644 --- a/types/json_parsing.cc +++ b/types/json_parsing.cc @@ -898,24 +898,6 @@ bool matchJsonNumber(ParseContext & context, JsonNumber & result) return true; } -#if 0 -/** Match a JSON number. */ -bool matchJsonNumber(ParseContext & context, JsonNumber & num) -{ - ParseContext::Revert_Token token(context); - try { - MLDB_TRACE_EXCEPTIONS(false); - auto res = expectJsonNumber(context); - token.ignore(); - num = res; - return true; - } - MLDB_CATCH_ALL { - return false; - } -} -#endif - /*****************************************************************************/ /* JSON PATH ENTRY */ /*****************************************************************************/ diff --git a/types/json_printing.cc b/types/json_printing.cc index 96f9c27af..ca91ad88b 100644 --- a/types/json_printing.cc +++ b/types/json_printing.cc @@ -801,8 +801,16 @@ Utf8StringJsonPrintingContext(Utf8String & str) StructuredJsonPrintingContext:: StructuredJsonPrintingContext(Json::Value & output) - : output(output), current(&output) { + reset(output); +} + +void +StructuredJsonPrintingContext:: +reset(Json::Value & newOutput) +{ + outputPtr = current = &newOutput; + path.clear(); path.reserve(8); } diff --git a/types/json_printing.h b/types/json_printing.h index b8bb60639..4501bfa25 100644 --- a/types/json_printing.h +++ b/types/json_printing.h @@ -24,6 +24,12 @@ void jsonEscape(const std::string & str, std::ostream & out); void jsonEscape(const std::string & str, std::string & out); +void jsonEscape(const char * str, size_t len, std::ostream & out); + +void jsonEscape(const char * str, size_t len, std::string & out); + +std::string jsonEscape(const char * str, size_t len); + bool isJsonValidAscii(char c); /*****************************************************************************/ @@ -244,11 +250,13 @@ struct Utf8StringJsonPrintingContext struct StructuredJsonPrintingContext : public JsonPrintingContext { - Json::Value & output; + Json::Value * outputPtr; Json::Value * current; StructuredJsonPrintingContext(Json::Value & output); + void reset(Json::Value & newOutput); + std::vector path; virtual void startObject(); diff --git a/types/map_description.h b/types/map_description.h index a5f8657f1..8b5e4750d 100644 --- a/types/map_description.h +++ b/types/map_description.h @@ -199,6 +199,6 @@ struct MapDescription } }; -DECLARE_TEMPLATE_VALUE_DESCRIPTION_4(MapDescription, std::map, typename, Key, typename, Value, typename, Compare, typename, Alloc); +DECLARE_TEMPLATE_VALUE_DESCRIPTION_4(MapDescription, std::map, typename, Key, typename, Value, typename, Compare, typename, Alloc, (MLDB::all_have_default_descriptions::value)); } // namespace MLDB diff --git a/types/meta_value_description.cc b/types/meta_value_description.cc index e7f5472f0..1811920ac 100644 --- a/types/meta_value_description.cc +++ b/types/meta_value_description.cc @@ -12,23 +12,26 @@ #include "mldb/types/structure_description.h" #include "mldb/types/vector_description.h" #include "mldb/types/pointer_description.h" +#include "mldb/types/optional_description.h" +#include "mldb/types/generic_array_description.h" +#include "mldb/types/generic_enum_description.h" +#include -namespace MLDB { +using namespace std; -DEFINE_ENUM_DESCRIPTION(ValueKind); +namespace MLDB { -ValueKindDescription:: -ValueKindDescription() +DEFINE_ENUM_DESCRIPTION_INLINE(ValueKind) { addValue("ATOM", ValueKind::ATOM, "Atomic structured type; normally JSON"); addValue("INTEGER", ValueKind::INTEGER, "Integral type"); - addValue("FLOAT", ValueKind::INTEGER, "Floating point type"); + addValue("FLOAT", ValueKind::FLOAT, "Floating point type"); addValue("BOOLEAN", ValueKind::BOOLEAN, "Boolean type"); addValue("STRING", ValueKind::STRING, "String type"); addValue("ENUM", ValueKind::ENUM, "Enumerated type"); - addValue("OPTIONAL", ValueKind::ENUM, "Optional type"); - addValue("LINK", ValueKind::ENUM, "Link (reference to other object)"); + addValue("OPTIONAL", ValueKind::OPTIONAL, "Optional type"); + addValue("LINK", ValueKind::LINK, "Link (reference to other object)"); addValue("ARRAY", ValueKind::ARRAY, "Array type"); addValue("STRUCTURE",ValueKind::STRUCTURE,"Structure type"); addValue("TUPLE", ValueKind::TUPLE, "Tuple type"); @@ -37,10 +40,20 @@ ValueKindDescription() addValue("ANY", ValueKind::ANY, "Can be any type"); } -DEFINE_STRUCTURE_DESCRIPTION(EnumValueRepr); +DEFINE_ENUM_DESCRIPTION_INLINE(OwnershipModel) +{ + addValue("NONE", OwnershipModel::NONE, "Indirect values are not owned"); + addValue("SHARED", OwnershipModel::SHARED, "Ownership of indirect values is shared"); + addValue("UNIQUE", OwnershipModel::UNIQUE, "Ownership of indirect values is exclusive"); +} -EnumValueReprDescription:: -EnumValueReprDescription() +DEFINE_ENUM_DESCRIPTION_INLINE(LengthModel) +{ + addValue("FIXED", LengthModel::FIXED, "Length is fixed & implicit"); + addValue("VARIABLE", LengthModel::VARIABLE, "Length is variable & stored with data"); +} + +DEFINE_STRUCTURE_DESCRIPTION_INLINE(EnumValueRepr) { addField("val", &EnumValueRepr::val, "Integral value of enumeration"); @@ -50,10 +63,7 @@ EnumValueReprDescription() "Human-readable comment on meaning of value"); } -DEFINE_STRUCTURE_DESCRIPTION(StructureFieldRepr); - -StructureFieldReprDescription:: -StructureFieldReprDescription() +DEFINE_STRUCTURE_DESCRIPTION_INLINE(StructureFieldRepr) { addField("name", &StructureFieldRepr::fieldName, "Name of the field in the structure"); @@ -67,10 +77,7 @@ StructureFieldReprDescription() "Default value of field"); } -DEFINE_STRUCTURE_DESCRIPTION(ValueDescriptionRepr); - -ValueDescriptionReprDescription:: -ValueDescriptionReprDescription() +DEFINE_STRUCTURE_DESCRIPTION_INLINE(ValueDescriptionRepr) { addField("kind", &ValueDescriptionRepr::kind, "Broad categorization of type"); @@ -90,17 +97,61 @@ ValueDescriptionReprDescription() "Type that is contained"); addField("elements", &ValueDescriptionRepr::tupleElements, "Elements of tuple"); + addField("lengthModel", &ValueDescriptionRepr::lengthModel, + "Array or map length model"); + addField("elementModel", &ValueDescriptionRepr::elementModel, + "Array element ownership model"); + addField("fixedLength", &ValueDescriptionRepr::fixedLength, + "Array length when this is fixed and implicit in the definition"); + addField("width", &ValueDescriptionRepr::width, + "width in bytes of an ATOM type", (size_t)0); + addField("align", &ValueDescriptionRepr::align, + "alignment in bytes of an ATOM type", (size_t)0); } -static Json::Value getDefaultValue(const ValueDescription & description) +Json::Value getDefaultValue(const ValueDescription & description) { - void * val = description.constructDefault(); - if (!val) - return Json::Value(); + void * ptr = nullptr; + if (description.align < 8) { + ptr = malloc(description.width); + if (!ptr) { + MLDB_THROW_BAD_ALLOC("Couldn't allocate memory for default value"); + } + ExcAssertEqual(((size_t)ptr) % description.align, 0); + } + else { + int res = posix_memalign(&ptr, description.align, description.width); + if (res != 0) { + using namespace std; + cerr << "align: " << description.align << endl; + cerr << "width: " << description.width << endl; + cerr << "type: " << description.typeName << endl; + throw MLDB::Exception(errno, "posix_memalign"); + } + } + try { + description.initializeDefault(ptr); + } MLDB_CATCH_ALL { + free(ptr); + throw; + } + + auto destruct = [desc=&description] (void * ptr) + { + try { + desc->destruct(ptr); + } MLDB_CATCH_ALL { + free(ptr); + throw; + } + free(ptr); + }; + + std::shared_ptr result(ptr, std::move(destruct)); + Json::Value jval; StructuredJsonPrintingContext context(jval); - description.printJson(val, context); - description.destroy(val); + description.printJson(result.get(), context); return jval; } @@ -115,12 +166,18 @@ getRepr(const ValueDescription & desc, bool detailed) result.cppType = demangle(desc.type->name()); result.documentationUri = desc.documentationUri; //result.parents = desc.parents; - + + result.width = desc.width; + result.align = desc.align; + switch (desc.kind) { - case ValueKind::ATOM: case ValueKind::INTEGER: case ValueKind::FLOAT: case ValueKind::BOOLEAN: + break; + case ValueKind::ATOM: + //result.contained = desc.containedPtr().get(); + break; case ValueKind::STRING: break; case ValueKind::ENUM: @@ -130,6 +187,7 @@ getRepr(const ValueDescription & desc, bool detailed) result.enumValues.emplace_back (EnumValueRepr{std::get<0>(v), std::get<1>(v), std::get<2>(v)}); } + result.contained = &desc.contained(); break; case ValueKind::OPTIONAL: result.contained = &desc.contained(); @@ -143,6 +201,16 @@ getRepr(const ValueDescription & desc, bool detailed) break; case ValueKind::ARRAY: result.contained = &desc.contained(); + result.lengthModel.emplace(desc.getArrayLengthModel()); + result.elementModel.emplace(desc.getArrayIndirectionModel()); + + switch (desc.getArrayLengthModel()) { + case LengthModel::FIXED: + result.fixedLength.emplace(desc.getArrayFixedLength()); + break; + case LengthModel::VARIABLE: + break; + } break; case ValueKind::STRUCTURE: { if (!detailed) @@ -313,9 +381,88 @@ isDefaultTyped(ValueDescription * const * val) const void ValueDescriptionNakedConstPtrDescription:: parseJsonTyped(ValueDescription const * * val, - JsonParsingContext & context) const + JsonParsingContext & context) const { - throw MLDB::Exception("Can't parse value descriptions"); + static const auto reprDescription = getDefaultDescriptionSharedT(); + ValueDescriptionRepr repr; + reprDescription->parseJsonTyped(&repr, context); + + ValueDescription * valOut = nullptr; + + switch (repr.kind) { + case ValueKind::INTEGER: + case ValueKind::FLOAT: + case ValueKind::BOOLEAN: + case ValueKind::STRING: + // These should already be here... + *val = ValueDescription::get(repr.typeName).get(); + ExcAssert(*val); + return; + + case ValueKind::ATOM: + // May need to handle completely generically + *val = ValueDescription::get(repr.typeName).get(); + if (!(*val)) { + // We use the contained type instead, if it's there + // So for example an atom which is a dressed-up integer will fall back to using the + // underlying integer representation + + ExcAssert(repr.contained); + std::shared_ptr containedPtr(repr.contained, [] (auto) {}); + auto result = std::make_unique(containedPtr); + valOut = result.release(); + break; + } + return; + + case ValueKind::ENUM: { + auto result = std::make_unique(std::shared_ptr(repr.contained, [] (auto) {}), repr.typeName); + for (auto & val: repr.enumValues) { + result->addValue(val.name, val.val, val.comment); + } + valOut = result.release(); + break; + } + case ValueKind::ARRAY: { + ExcAssert(repr.lengthModel); + switch (*repr.lengthModel) { + case LengthModel::FIXED: { + ExcAssert(repr.contained); + std::shared_ptr containedPtr(repr.contained, [] (auto) {}); + auto result = std::make_unique(repr.width, repr.align, repr.typeName, containedPtr, *repr.fixedLength); + valOut = result.release(); + break; + } + case LengthModel::VARIABLE: + throw MLDB::Exception("not clear how to deal with reconstituting value descriptions of variable length arrays"); + } + break; + } + case ValueKind::STRUCTURE: { + auto result = std::make_unique(false /* null accepted */, repr.typeName); + for (auto & field: repr.structureFields) { + result->addFieldDesc(field.fieldName, field.offset, field.comment, std::shared_ptr(field.description, [] (auto) {})); + } + valOut = result.release(); + break; + } + + case ValueKind::OPTIONAL: + case ValueKind::LINK: + case ValueKind::TUPLE: + case ValueKind::VARIANT: + case ValueKind::MAP: + case ValueKind::ANY: + throw MLDB::Exception("can't parse value description for this type: " + repr.typeName + " " + jsonEncodeStr(repr)); + } + ExcAssert(valOut); + + valOut->documentationUri = repr.documentationUri; + valOut->typeName = repr.typeName; + valOut->width = repr.width; + valOut->align = repr.align; + + *val = valOut; } void diff --git a/types/meta_value_description.h b/types/meta_value_description.h index f92c1e38c..8e0e76b17 100644 --- a/types/meta_value_description.h +++ b/types/meta_value_description.h @@ -10,10 +10,17 @@ #include "mldb/types/value_description_fwd.h" #include #include "mldb/ext/jsoncpp/value.h" +#include "mldb/types/optional.h" namespace MLDB { +// Return a JSON representation of the default value of this particular +// value description. +Json::Value getDefaultValue(const ValueDescription & description); + DECLARE_ENUM_DESCRIPTION(ValueKind); +DECLARE_ENUM_DESCRIPTION(OwnershipModel); +DECLARE_ENUM_DESCRIPTION(LengthModel); struct EnumValueRepr { int val; @@ -44,6 +51,12 @@ struct ValueDescriptionRepr { std::vector enumValues; std::vector tupleElements; const ValueDescription * contained = nullptr; + Optional lengthModel; + Optional elementModel; + Optional fixedLength; + + size_t width = 0; // for atomic types + size_t align = 0; // for atomic types }; DECLARE_STRUCTURE_DESCRIPTION(ValueDescriptionRepr); diff --git a/types/optional_description.h b/types/optional_description.h index 2db854f7e..1ccafa035 100644 --- a/types/optional_description.h +++ b/types/optional_description.h @@ -91,6 +91,6 @@ struct OptionalDescription } }; -DECLARE_TEMPLATE_VALUE_DESCRIPTION_1(OptionalDescription, Optional, typename, T); +DECLARE_TEMPLATE_VALUE_DESCRIPTION_1(OptionalDescription, Optional, typename, T, MLDB::has_default_description::value); } // namespace MLDB diff --git a/types/pair_description.h b/types/pair_description.h index fda7c2192..6f35c036b 100644 --- a/types/pair_description.h +++ b/types/pair_description.h @@ -105,6 +105,6 @@ struct PairDescription } }; -DECLARE_TEMPLATE_VALUE_DESCRIPTION_2(PairDescription, std::pair, typename, T1, typename, T2); +DECLARE_TEMPLATE_VALUE_DESCRIPTION_2(PairDescription, std::pair, typename, T1, typename, T2, (MLDB::all_have_default_descriptions::value)); } // namespace MLDB diff --git a/types/path.cc b/types/path.cc index 667d9c7e6..85e2dab0f 100644 --- a/types/path.cc +++ b/types/path.cc @@ -10,6 +10,7 @@ #include "mldb/types/hash_wrapper.h" #include "mldb/types/value_description.h" #include "mldb/types/vector_description.h" +#include "mldb/types/comparable_value_descriptions.h" #include "mldb/types/annotated_exception.h" #include "mldb/ext/highwayhash.h" #include "mldb/types/itoa.h" @@ -1556,7 +1557,7 @@ operator >> (std::istream & stream, Path & id) /*****************************************************************************/ struct PathElementDescription - : public ValueDescriptionI { + : public OrderedComparableValueDescriptionI { virtual void parseJsonTyped(PathElement * val, JsonParsingContext & context) const; @@ -1610,7 +1611,7 @@ isDefaultTyped(const PathElement * val) const } struct PathDescription - : public ValueDescriptionI { + : public OrderedComparableValueDescriptionI { virtual void parseJsonTyped(Path * val, JsonParsingContext & context) const; diff --git a/types/path.h b/types/path.h index d0b0218d5..2f94f092b 100644 --- a/types/path.h +++ b/types/path.h @@ -14,6 +14,7 @@ #include #include #include +#include // NOTE TO MLDB DEVELOPERS: This is an API header file. No includes // should be added, especially value_description.h. @@ -49,6 +50,12 @@ struct PathElement { PathElement(std::string str); PathElement(const char * str, size_t len); PathElement(const char * str, size_t len, int digits); + + PathElement(const std::string_view & str) + : PathElement(str.data(), str.length()) + { + } + PathElement(const char * str) : PathElement(str, std::strlen(str)) { diff --git a/types/periodic_utils.cc b/types/periodic_utils.cc index e1e72c79c..41470c571 100644 --- a/types/periodic_utils.cc +++ b/types/periodic_utils.cc @@ -324,6 +324,24 @@ toString() const } } +double +TimePeriod:: +toSeconds() const +{ + switch (granularity) { + case MILLISECONDS: return number * 0.001; + case SECONDS: return number; + case MINUTES: return number * 60; + case HOURS: return number * 3600; + case DAYS: return number * 86400; + case WEEKS: return number * 86400 * 7; + case MONTHS: return number * 86400 * 30; + case YEARS: return number * 86400 * 365.25; + default: + throw MLDB::Exception("unknown time period"); + } +} + void TimePeriod:: parse(const std::string & str) diff --git a/types/periodic_utils.h b/types/periodic_utils.h index 04927ee45..0a0da9329 100644 --- a/types/periodic_utils.h +++ b/types/periodic_utils.h @@ -143,6 +143,9 @@ struct TimePeriod { void parse(const std::string & val); + // Return the granularity mapped to a number of seconds + double toSeconds() const; + TimePeriod operator + (const TimePeriod & other) const; TimePeriod & operator += (const TimePeriod & other) diff --git a/types/pointer_description.h b/types/pointer_description.h index 612871fe5..adf73525b 100644 --- a/types/pointer_description.h +++ b/types/pointer_description.h @@ -10,6 +10,7 @@ #pragma once #include +#include #include "value_description.h" @@ -67,11 +68,21 @@ struct PointerDescription return *static_cast(obj); } + static const T*& constCast(const void* obj) + { + return *static_cast(obj); + } + virtual void* getLink(void* obj) const override { return cast(obj); } + virtual const void* getConstLink(const void* obj) const override + { + return constCast(obj); + } + virtual void set( void* obj, void* value, const ValueDescription* valueDesc) const override { @@ -165,11 +176,21 @@ struct UniquePtrDescription return *static_cast< std::unique_ptr* >(obj); } + static std::unique_ptr& constCast(const void* obj) + { + return *static_cast* >(obj); + } + virtual void* getLink(void* obj) const override { return cast(obj).get(); } + virtual const void* getConstLink(const void* obj) const override + { + return constCast(obj).get(); + } + virtual void set( void* obj, void* value, const ValueDescription* valueDesc) const override { @@ -189,20 +210,20 @@ struct UniquePtrDescription } }; -DECLARE_TEMPLATE_VALUE_DESCRIPTION_1(UniquePtrDescription, std::unique_ptr, typename, T); +DECLARE_TEMPLATE_VALUE_DESCRIPTION_1(UniquePtrDescription, std::unique_ptr, typename, T, MLDB::has_default_description::value); template struct SharedPtrDescription : public ValueDescriptionI, ValueKind::LINK, SharedPtrDescription > { - SharedPtrDescription(std::shared_ptr > inner - = getDefaultDescriptionShared((T *)0)) + SharedPtrDescription(std::shared_ptr>> inner + = getDefaultDescriptionShared((std::remove_const_t *)0)) : inner(inner) { } - SharedPtrDescription(ValueDescriptionT * inner) + SharedPtrDescription(ValueDescriptionT> * inner) : inner(inner) { } @@ -211,7 +232,7 @@ struct SharedPtrDescription { } - std::shared_ptr > inner; + std::shared_ptr> > inner; virtual void parseJsonTyped(std::shared_ptr * val, JsonParsingContext & context) const override @@ -221,8 +242,9 @@ struct SharedPtrDescription context.expectNull(); return; } - val->reset(new T()); - inner->parseJsonTyped(val->get(), context); + auto newVal = std::make_shared>(); + inner->parseJsonTyped(newVal.get(), context); + *val = std::move(newVal); } virtual void printJsonTyped(const std::shared_ptr * val, @@ -248,10 +270,14 @@ struct SharedPtrDescription return OwnershipModel::SHARED; } + static std::shared_ptr>& cast(void* obj) + { + return *static_cast< std::shared_ptr>* >(obj); + } - static std::shared_ptr& cast(void* obj) + static const std::shared_ptr& constCast(const void* obj) { - return *static_cast< std::shared_ptr* >(obj); + return *static_cast* >(obj); } virtual void* getLink(void* obj) const override @@ -259,6 +285,11 @@ struct SharedPtrDescription return cast(obj).get(); } + virtual const void* getConstLink(const void* obj) const override + { + return constCast(obj).get(); + } + virtual void set( void* obj, void* value, const ValueDescription* valueDesc) const override { @@ -273,16 +304,16 @@ struct SharedPtrDescription // Casting is necessary to make sure the ref count is incremented. if (valueDesc->getOwnershipModel() == OwnershipModel::SHARED) cast(obj) = cast(value); - else cast(obj).reset(static_cast(valueDesc->getLink(value))); + else cast(obj).reset(static_cast*>(valueDesc->getLink(value))); } virtual void initialize() override { - this->inner = getDefaultDescriptionSharedT(); + this->inner = getDefaultDescriptionSharedT>(); } }; -DECLARE_TEMPLATE_VALUE_DESCRIPTION_1(SharedPtrDescription, std::shared_ptr, typename, T); +DECLARE_TEMPLATE_VALUE_DESCRIPTION_1(SharedPtrDescription, std::shared_ptr, typename, T, MLDB::has_default_description::value); #if 0 template diff --git a/types/set_description.h b/types/set_description.h index c5c0e8ef5..4d5bca311 100644 --- a/types/set_description.h +++ b/types/set_description.h @@ -80,6 +80,16 @@ struct SetDescription return val2->size(); } + virtual LengthModel getArrayLengthModel() const override + { + return LengthModel::VARIABLE; + } + + virtual OwnershipModel getArrayIndirectionModel() const override + { + return OwnershipModel::UNIQUE; + } + virtual void * getArrayElement(void * val, uint32_t element) const override { throw MLDB::Exception("can't mutate set elements"); @@ -118,7 +128,7 @@ struct SetDescription }; -DECLARE_TEMPLATE_VALUE_DESCRIPTION_1(SetDescription, std::set, typename, T); +DECLARE_TEMPLATE_VALUE_DESCRIPTION_1(SetDescription, std::set, typename, T, MLDB::has_default_description::value); } // namespace MLDB diff --git a/types/span_description.h b/types/span_description.h new file mode 100644 index 000000000..181f76d02 --- /dev/null +++ b/types/span_description.h @@ -0,0 +1,247 @@ +/** span_description.h -*- C++ -*- + Jeremy Barnes, 21 August 2015 + Copyright (c) 2015 mldb.ai inc. All rights reserved. + + This file is part of MLDB. Copyright 2015 mldb.ai inc. All rights reserved. + + Value description implementations for spans. +*/ + +#pragma once + +#include +#include "list_description_base.h" +#include "value_description.h" +#include + +namespace MLDB { + + +/*****************************************************************************/ +/* DEFAULT DESCRIPTION FOR SPAN */ +/*****************************************************************************/ + +template +struct SpanDescription + : public ValueDescriptionI, ValueKind::ARRAY, SpanDescription > { + + using InnerT = std::remove_const_t; + std::shared_ptr > inner; + + SpanDescription(ValueDescriptionT * inner) + : inner(inner) + { + } + + SpanDescription(std::shared_ptr > inner + = getDefaultDescriptionShared((InnerT *)0)) + : inner(std::move(inner)) + { + } + + // Constructor to create a partially-evaluated span description. + SpanDescription(ConstructOnly) + { + } + + virtual void parseJson(void * val, JsonParsingContext & context) const override + { + throw MLDB::Exception("Can't parse Spans"); + } + + virtual void parseJsonTyped(std::span * val, JsonParsingContext & context) const override + { + throw MLDB::Exception("Can't parse Spans"); + } + + virtual void printJson(const void * val, JsonPrintingContext & context) const override + { + const std::span * val2 = reinterpret_cast *>(val); + return printJsonTyped(val2, context); + } + + virtual void printJsonTyped(const std::span * val, JsonPrintingContext & context) const override + { + size_t sz = val->size(); + context.startArray(sz); + + auto it = val->begin(); + for (size_t i = 0; i < sz; ++i, ++it) { + ExcAssert(it != val->end()); + context.newArrayElement(); + InnerT v(*it); + inner->printJsonTyped(&v, context); + } + + context.endArray(); + } + + virtual bool isDefault(const void * val) const override + { + const std::span * val2 = reinterpret_cast *>(val); + return isDefaultTyped(val2); + } + + virtual bool isDefaultTyped(const std::span * val) const override + { + return val->empty(); + } + + virtual size_t getArrayLength(void * val) const override + { + const std::span * val2 = reinterpret_cast *>(val); + return val2->size(); + } + + virtual LengthModel getArrayLengthModel() const override + { + return LengthModel::VARIABLE; + } + + virtual OwnershipModel getArrayIndirectionModel() const override + { + return OwnershipModel::UNIQUE; + } + + virtual void * getArrayElement(void * val, uint32_t element) const override + { + throw MLDB::Exception("Can't mutate Spans"); + } + + virtual const void * getArrayElement(const void * val, uint32_t element) const override + { + const std::span * val2 = reinterpret_cast *>(val); + ExcAssertLess(element, val2->size()); + return &val2[element]; + } + + virtual void setArrayLength(void * val, size_t newLength) const override + { + throw MLDB::Exception("Can't mutate Spans"); + } + + virtual const ValueDescription & contained() const override + { + return *this->inner; + } + + virtual std::shared_ptr containedPtr() const override + { + return this->inner; + } + + virtual void initialize() override + { + this->inner = getDefaultDescriptionSharedT(); + } +}; + +#if 0 +template +struct SpanDescription + : public ValueDescriptionI, ValueKind::ARRAY, SpanDescription > { + + using InnerT = std::remove_const_t; + std::shared_ptr > inner; + + SpanDescription(ValueDescriptionT * inner) + : inner(inner) + { + } + + SpanDescription(std::shared_ptr > inner + = getDefaultDescriptionShared((InnerT *)0)) + : inner(std::move(inner)) + { + } + + // Constructor to create a partially-evaluated span description. + SpanDescription(ConstructOnly) + { + } + + virtual void parseJson(void * val, JsonParsingContext & context) const override + { + throw MLDB::Exception("Can't parse Spans"); + } + + virtual void parseJsonTyped(std::span * val, JsonParsingContext & context) const override + { + throw MLDB::Exception("Can't parse Spans"); + } + + virtual void printJson(const void * val, JsonPrintingContext & context) const override + { + const std::span * val2 = reinterpret_cast *>(val); + return printJsonTyped(val2, context); + } + + virtual void printJsonTyped(const std::span * val, JsonPrintingContext & context) const override + { + size_t sz = val->size(); + context.startArray(sz); + + auto it = val->begin(); + for (size_t i = 0; i < sz; ++i, ++it) { + ExcAssert(it != val->end()); + context.newArrayElement(); + InnerT v(*it); + inner->printJsonTyped(&v, context); + } + + context.endArray(); + } + + virtual bool isDefault(const void * val) const override + { + const std::span * val2 = reinterpret_cast *>(val); + return isDefaultTyped(val2); + } + + virtual bool isDefaultTyped(const std::span * val) const override + { + return val->empty(); + } + + virtual size_t getArrayLength(void * val) const override + { + const std::span * val2 = reinterpret_cast *>(val); + return val2->size(); + } + + virtual void * getArrayElement(void * val, uint32_t element) const override + { + throw MLDB::Exception("Can't mutate Spans"); + } + + virtual const void * getArrayElement(const void * val, uint32_t element) const override + { + const std::span * val2 = reinterpret_cast *>(val); + return &val2->at(element); + } + + virtual void setArrayLength(void * val, size_t newLength) const override + { + throw MLDB::Exception("Can't mutate Spans"); + } + + virtual const ValueDescription & contained() const override + { + return *this->inner; + } + + virtual std::shared_ptr containedPtr() const + { + return this->inner; + } + + virtual void initialize() override + { + this->inner = getDefaultDescriptionSharedT(); + } +}; +#endif + +DECLARE_TEMPLATE_VALUE_DESCRIPTION_2(SpanDescription, std::span, typename, T, size_t, Sz, MLDB::has_default_description::value); + +} // namespace MLDB diff --git a/types/string.cc b/types/string.cc index 9c3af3233..4a0d8930a 100644 --- a/types/string.cc +++ b/types/string.cc @@ -15,17 +15,22 @@ #include #include "mldb/arch/demangle.h" #include -#include #include #include #include +#include using namespace std; namespace MLDB { +/*****************************************************************************/ +/* EXCEPTION UTF8STRING CONSTRUCTOR */ +/*****************************************************************************/ + // Put this here, since it needs Utf8String to work + Exception::Exception(const Utf8String & msg) : message(msg.rawString()) { @@ -38,14 +43,27 @@ Exception::Exception(Utf8String && msg) Exception:: Exception(int errnum, const Utf8String & msg, const char * function) -: Exception(errnum, msg.rawString(), function) + : Exception(errnum, msg.rawString(), function) { } +namespace { +thread_local std::va_list exception_args; +} /* file scope */ + +#define MLDB_IMPLEMENT_EXCEPTION_CLASS_UTF8(Name) \ +void throw##Name(const char * function, const char * file, int line, const Utf8String msg, ...) \ +{ \ + throw Name(format(#Name ": %s at %s:%d : ", function, file, line) \ + + ((va_start(exception_args, msg), format(msg.c_str(), exception_args)))); \ +} \ + +MLDB_FOR_EACH_EXCEPTION_CLASS(MLDB_IMPLEMENT_EXCEPTION_CLASS_UTF8) + /*****************************************************************************/ /* UTF8STRING */ -/****************************************************************************/ +/*****************************************************************************/ Utf8String Utf8String::fromLatin1(const std::string & lat1Str) diff --git a/types/structure_description.cc b/types/structure_description.cc new file mode 100644 index 000000000..5b7ac04e5 --- /dev/null +++ b/types/structure_description.cc @@ -0,0 +1,628 @@ +/** structure_description.cc -*- C++ -*- + Jeremy Barnes, 21 August 2015 + Copyright (c) 2015 mldb.ai inc. All rights reserved. + + This file is part of MLDB. Copyright 2015 mldb.ai inc. All rights reserved. + + Value desriptions for structures. +*/ + +#include "structure_description.h" +#include + +using namespace std; + +namespace MLDB { + + +/*****************************************************************************/ +/* STRUCTURE DESCRIPTION BASE */ +/*****************************************************************************/ + + +StructureDescriptionBase:: +StructureDescriptionBase(const std::type_info * type, + ValueDescription * owner, + const std::string & structName, + bool nullAccepted) + : type(type), + structName(structName), + nullAccepted(nullAccepted), + owner(owner) +{ + ExcAssert(!structName.empty()); +} + +void +StructureDescriptionBase:: +operator = (const StructureDescriptionBase & other) +{ + type = other.type; + structName = other.structName; + nullAccepted = other.nullAccepted; + + fieldNames.clear(); + orderedFields.clear(); + fields.clear(); + fieldNames.reserve(other.fields.size()); + + // Don't set owner + for (auto & f: other.orderedFields) { + std::string_view s = f->first; + fieldNames.emplace_back(::strndup(s.data(), s.size())); + auto it = fields.insert(make_pair(fieldNames.back().get(), f->second)) + .first; + orderedFields.push_back(it); + } +} + +void +StructureDescriptionBase:: +operator = (StructureDescriptionBase && other) +{ + type = std::move(other.type); + structName = std::move(other.structName); + nullAccepted = std::move(other.nullAccepted); + fields = std::move(other.fields); + fieldNames = std::move(other.fieldNames); + orderedFields = std::move(other.orderedFields); + // don't set owner +} + +StructureDescriptionBase::Exception:: +Exception(JsonParsingContext & context, + const std::string & message) + : MLDB::Exception("at " + context.printPath() + ": " + message) +{ +} + +StructureDescriptionBase::Exception:: +~Exception() throw () +{ +} + +void +StructureDescriptionBase:: +parseJson(void * output, JsonParsingContext & context) const +{ + try { + + if (!onEntry(output, context)) return; + + if (nullAccepted && context.isNull()) { + context.expectNull(); + return; + } + + if (!context.isObject()) { + std::string typeName; + if (context.isNumber()) + typeName = "number"; + else if (context.isBool()) + typeName = "boolean"; + else if (context.isString()) + typeName = "string"; + else if (context.isNull()) + typeName = "null"; + else if (context.isArray()) + typeName = "array"; + else typeName = "<>"; + + std::string msg + = "expected object of type " + + structName + ", but instead a " + + typeName + " was provided"; + + if (context.isString()) + msg += ". Did you accidentally JSON encode your object into a string?"; + + context.exception(msg); + } + + auto onMember = [&] () + { + try { + auto n = context.fieldNameView(); + + auto it = fields.find(n); + if (it == fields.end()) { + context.onUnknownField(owner); + } + else { + it->second.description + ->parseJson(addOffset(output, + it->second.offset), + context); + } + } + catch (const Exception & exc) { + throw; + } + catch (const std::exception & exc) { + throw Exception(context, exc.what()); + } + catch (...) { + throw; + } + }; + + + context.forEachMember(onMember); + + onExit(output, context); + } + catch (const Exception & exc) { + throw; + } + catch (const std::exception & exc) { + throw Exception(context, exc.what()); + } + catch (...) { + throw; + } +} + +void +StructureDescriptionBase:: +printJson(const void * input, JsonPrintingContext & context) const +{ + //cerr << "--- Start object " << demangle(this->type->name()) << " at " << input << endl; + + context.startObject(); + + for (const auto & it: orderedFields) { + auto & fd = it->second; + const void * mbr = addOffset(input, fd.offset); + + //cerr << "field " << demangle(this->type->name()) << "::" << fd.fieldName << " at " << mbr << endl; + //const unsigned char * mbrc = (const unsigned char *)mbr; + //cerr << " first 4 bytes: " << format("%02x %02x %02x %02x", mbrc[0], mbrc[1], mbrc[2], mbrc[3]) << endl; + + // Skip inactive fields + if (fd.isActive && !fd.isActive(input)) { + //cerr << " skipping field " << fd.fieldName << " as isActive is false" << endl; + continue; + } + + if (fd.bitField.has_value()) { + auto & bitField = *fd.bitField; + constexpr size_t MAX_WIDTH=64; + char data[MAX_WIDTH]; + ExcCheckLessEqual(fd.description->width, MAX_WIDTH, "Type is too wide to be accessed as a bit field"); + memset(data, 0, fd.description->width); + //bitField.extract(mbr, data); + fd.description->extractBitField(mbr, data, bitField.startBit, bitField.bitWidth); + //cerr << "Extracting bit field " << it->first << ": bytes "; + //const unsigned char * mbrBytes = (const unsigned char *)mbr; + //cerr << format("%02x %02x %02x %02x", mbrBytes[0], mbrBytes[1], mbrBytes[2], mbrBytes[3]); + //cerr << " bits " << bitField.startBit << ":" << bitField.bitWidth << " = " << fd.description->printJsonString(data) << endl; + context.startMember(it->first.data(), it->first.length()); + fd.description->printJson(data, context); + //cerr << " bit field value " << fd.description->printJsonString(data) << endl; + } + else { + if (fd.description->isDefault(mbr)) { + //cerr << " skipping due to default value" << endl; + continue; + } + context.startMember(it->first.data(), it->first.length()); + fd.description->printJson(mbr, context); + //cerr << " member value " << fd.description->printJsonString(mbr); + } + } + + context.endObject(); +} + +// Comparison object to allow const char * objects to be looked up +// in the map and so for comparisons to be done with no memory +// allocations. +bool +StructureDescriptionBase::StrCompare:: +operator () (const std::string_view & v1, const std::string_view & v2) const +{ + return v1 < v2; + +#if 0 + char c1 = *s1++, c2 = *s2++; + + if (c1 < c2) return true; + if (c1 > c2) return false; + if (c1 == 0) return false; + + c1 = *s1++; c2 = *s2++; + + if (c1 < c2) return true; + if (c1 > c2) return false; + if (c1 == 0) return false; + + return std::strcmp(s1, s2) < 0; +#endif +} + +StructureDescriptionBase::FieldDescription & +StructureDescriptionBase:: +addFieldDesc(std::string name, + size_t offset, + std::string comment, + std::shared_ptr description) +{ + ExcAssert(description); + + if (fields.count(name.c_str())) + throw MLDB::Exception("field '" + name + "' added twice"); + + fieldNames.emplace_back(::strdup(name.c_str())); + const char * fieldName = fieldNames.back().get(); + + auto it = fields.insert + (Fields::value_type(fieldName, FieldDescription())) + .first; + + FieldDescription & fd = it->second; + fd.fieldName = fieldName; + fd.comment = comment; + fd.description = description; + fd.offset = offset; + fd.width = description->width; + fd.fieldNum = fields.size() - 1; + orderedFields.push_back(it); + //using namespace std; + //cerr << "offset = " << fd.offset << endl; + + fixupAlign(offset + description->width, description->align); + + hasLess = hasLess && description->hasLessThanComparison(); + hasEquality = hasEquality && description->hasLessThanComparison(); + hasPartial = hasPartial && description->hasPartialOrderingComparison(); + hasWeak = hasWeak && description->hasWeakOrderingComparison(); + hasStrong = hasStrong && description->hasStrongOrderingComparison(); + + return fd; +} + +/// Add a bit field, specified by the containing field and a bit offset +void +StructureDescriptionBase:: +addBitFieldDesc(std::string name, + size_t offset, + std::string comment, + std::shared_ptr containingDescription, + uint32_t bitOffset, + uint32_t bitWidth) +{ + size_t containingWidth = containingDescription->width * 8; + ExcAssertLessEqual(bitOffset + bitWidth, containingWidth); + FieldDescription & fd = addFieldDesc(std::move(name), offset, std::move(comment), containingDescription); + +#if 0 + auto extract = [=] (const void * obj, void * val) + { + containingDescription->extractBitField(obj, val, bitOffset, bitWidth); + }; + + auto insert = [=] (void * obj, const void * val) + { + containingDescription->insertBitField(val, obj, bitOffset, bitWidth); + }; +#endif + + ValueDescription::BitFieldDescription bitFieldDescription = { bitOffset, bitWidth }; + + fd.bitField.emplace(std::move(bitFieldDescription)); +} + +/// Add a discriminated field, including the function used to know whether it is active +/// or not and a string description of that function. +void +StructureDescriptionBase:: +addDiscriminatedFieldDesc(std::string name, + size_t offset, + std::string comment, + std::shared_ptr desc, + std::function isActive, + std::string isActiveStr) +{ + FieldDescription & fd = addFieldDesc(std::move(name), offset, std::move(comment), std::move(desc)); + fd.isActive = std::move(isActive); + fd.isActiveStr = std::move(isActiveStr); +} + +const StructureDescriptionBase::FieldDescription * +StructureDescriptionBase:: +hasField(const void * val, const std::string & field) const +{ + auto it = fields.find(field.c_str()); + if (it != fields.end()) + return &it->second; + return nullptr; +} + +const StructureDescriptionBase::FieldDescription * +StructureDescriptionBase:: +getFieldDescription(const void * val, const void * field) const +{ + ssize_t offset = (const char *)field - (const char *)val; + for (auto & f: fields) { + if (f.second.offset >= offset + && f.second.offset + f.second.width <= offset) + return &f.second; + } + return nullptr; +} + +void +StructureDescriptionBase:: +forEachField(const void * val, + const std::function & onField) const +{ + for (auto f: orderedFields) { + onField(f->second); + } +} + +const StructureDescriptionBase::FieldDescription & +StructureDescriptionBase:: +getField(const std::string & field) const +{ + auto it = fields.find(field.c_str()); + if (it != fields.end()) + return it->second; + throw MLDB::Exception("structure has no field " + field); +} + +const StructureDescriptionBase::FieldDescription & +StructureDescriptionBase:: +getFieldByNumber(int fieldNum) const +{ + for (auto & f: fields) { + if (f.second.fieldNum == fieldNum) + return f.second; + } + + throw MLDB::Exception("structure has no field with given number"); +} + +int +StructureDescriptionBase:: +getVersion() const +{ + return this->version; +} + +bool +StructureDescriptionBase:: +hasEqualityComparison() const +{ + return hasEquality; +} + +bool +StructureDescriptionBase:: +compareEquality(const void * val1, const void * val2) const +{ + for (auto & [name,f]: fields) { + if (!f.description->compareEquality(f.getFieldPtr(val1), f.getFieldPtr(val2))) + return false; + } + return true; +} + +bool +StructureDescriptionBase:: +hasLessThanComparison() const +{ + return hasLess; +} + +bool +StructureDescriptionBase:: +compareLessThan(const void * val1, const void * val2) const +{ + for (auto it: orderedFields) { + auto [name,f] = *it; + //using namespace std; + //cerr << "field " << name << ": " + // << f.description->printJsonString(f.getFieldPtr(val1)) << " vs " + // << f.description->printJsonString(f.getFieldPtr(val2)) << ": " + // << f.description->compareLessThan(f.getFieldPtr(val1), f.getFieldPtr(val2)) + // << " vs " << f.description->compareLessThan(f.getFieldPtr(val2), f.getFieldPtr(val1)) + // << endl; + if (f.description->compareLessThan(f.getFieldPtr(val1), f.getFieldPtr(val2))) + return true; + if (f.description->compareLessThan(f.getFieldPtr(val2), f.getFieldPtr(val1))) + return false; + } + return false; +} + +bool +StructureDescriptionBase:: +hasStrongOrderingComparison() const +{ + return hasStrong; +} + +std::strong_ordering +StructureDescriptionBase:: +compareStrong(const void * val1, const void * val2) const +{ + throw MLDB::Exception("not implemented: StructureDescriptionBase::compareStrong"); +} + +bool +StructureDescriptionBase:: +hasWeakOrderingComparison() const +{ + return hasWeak; +} + +std::weak_ordering +StructureDescriptionBase:: +compareWeak(const void * val1, const void * val2) const +{ + throw MLDB::Exception("not implemented: StructureDescriptionBase::compareWeak"); +} + +bool +StructureDescriptionBase:: +hasPartialOrderingComparison() const +{ + return hasPartial; +} + +std::partial_ordering +StructureDescriptionBase:: +comparePartial(const void * val1, const void * val2) const +{ + throw MLDB::Exception("not implemented: StructureDescriptionBase::comparePartial"); +} + + + +/*****************************************************************************/ +/* GENERIC STRUCTURE DESCRIPTION */ +/*****************************************************************************/ + +GenericStructureDescription:: +GenericStructureDescription(bool nullAccepted, + const std::string & structName) + : ValueDescription(ValueKind::STRUCTURE, nullptr, 0 /* width */, 0 /* align */, structName), + StructureDescriptionBase(nullptr, this, structName, nullAccepted) +{ +} + +void +GenericStructureDescription:: +parseJson(void * val, JsonParsingContext & context) const +{ + return StructureDescriptionBase::parseJson(val, context); +} + +void +GenericStructureDescription:: +printJson(const void * val, JsonPrintingContext & context) const +{ + return StructureDescriptionBase::printJson(val, context); +} + +bool +GenericStructureDescription:: +isDefault(const void * val) const +{ + return false; +} + +void +GenericStructureDescription:: +setDefault(void * val) const +{ + for (auto & [name, desc]: this->fields) { + auto field = desc.getFieldPtr(val); + desc.description->setDefault(field); + } +} + +void +GenericStructureDescription:: +copyValue(const void * from, void * to) const +{ + for (auto & [name, desc]: this->fields) { + auto fromField = desc.getFieldPtr(from); + auto toField = desc.getFieldPtr(to); + desc.description->copyValue(fromField, toField); + } +} + +void +GenericStructureDescription:: +moveValue(void * from, void * to) const +{ + for (auto & [name, desc]: this->fields) { + auto fromField = desc.getFieldPtr(from); + auto toField = desc.getFieldPtr(to); + desc.description->moveValue(fromField, toField); + } +} + +void +GenericStructureDescription:: +swapValues(void * from, void * to) const +{ + for (auto & [name, desc]: this->fields) { + auto fromField = desc.getFieldPtr(from); + auto toField = desc.getFieldPtr(to); + desc.description->swapValues(fromField, toField); + } +} + +void +GenericStructureDescription:: +initializeDefault(void * mem) const +{ + for (auto & [name, desc]: this->fields) { + desc.description->initializeDefault(desc.getFieldPtr(mem)); + } +} + +void +GenericStructureDescription:: +initializeCopy(void * mem, const void * val) const +{ + for (auto & [name, desc]: this->fields) { + auto fromField = desc.getFieldPtr(val); + auto toField = desc.getFieldPtr(mem); + desc.description->initializeCopy(toField, fromField); + } +} + +void +GenericStructureDescription:: +initializeMove(void * mem, void * val) const +{ + for (auto & [name, desc]: this->fields) { + auto fromField = desc.getFieldPtr(val); + auto toField = desc.getFieldPtr(mem); + desc.description->initializeMove(toField, fromField); + } +} + +void +GenericStructureDescription:: +destruct(void * val) const +{ + for (auto & [name, desc]: this->fields) { + auto field = desc.getFieldPtr(val); + desc.description->destruct(field); + } +} + +bool +GenericStructureDescription:: +onEntry(void * output, JsonParsingContext & context) const +{ + return true; +} + +void +GenericStructureDescription:: +onExit(void * output, JsonParsingContext & context) const +{ +} + +void +GenericStructureDescription:: +fixupAlign(size_t knownWidth, size_t knownAlign) +{ + if (knownAlign > this->align) { + this->align = knownAlign; + } + + if (knownWidth > this->width) { + this->width = knownWidth; + while (this->width % this->align != 0) + ++this->width; + } +} + +} // namespace MLDB diff --git a/types/structure_description.h b/types/structure_description.h index b8216618a..0932ab3ba 100644 --- a/types/structure_description.h +++ b/types/structure_description.h @@ -12,6 +12,7 @@ #include "value_description.h" #include "utility_descriptions.h" #include +#include namespace MLDB { @@ -26,8 +27,8 @@ struct StructureDescriptionBase { StructureDescriptionBase(const std::type_info * type, ValueDescription * owner, - const std::string & structName = "", - bool nullAccepted = false); + const std::string & structName, + bool nullAccepted); StructureDescriptionBase(const StructureDescriptionBase & other) = delete; StructureDescriptionBase(StructureDescriptionBase && other) = delete; @@ -41,6 +42,8 @@ struct StructureDescriptionBase { int version = -1; ///< The version number of this structure + bool hasLess = true, hasEquality = true, hasWeak = true, hasStrong = true, hasPartial = true; + struct OldVersion { int version = -1; std::shared_ptr desc; @@ -62,26 +65,10 @@ struct StructureDescriptionBase { // in the map and so for comparisons to be done with no memory // allocations. struct StrCompare { - inline bool operator () (const char * s1, const char * s2) const - { - char c1 = *s1++, c2 = *s2++; - - if (c1 < c2) return true; - if (c1 > c2) return false; - if (c1 == 0) return false; - - c1 = *s1++; c2 = *s2++; - - if (c1 < c2) return true; - if (c1 > c2) return false; - if (c1 == 0) return false; - - return std::strcmp(s1, s2) < 0; - } - + bool operator () (const std::string_view & s1, const std::string_view & s2) const; }; - typedef std::map Fields; + typedef std::map Fields; Fields fields; /* A deleter that works with buffers allocated with malloc */ @@ -108,6 +95,191 @@ struct StructureDescriptionBase { virtual bool onEntry(void * output, JsonParsingContext & context) const = 0; virtual void onExit(void * output, JsonParsingContext & context) const = 0; + + FieldDescription & + addFieldDesc(std::string name, + size_t offset, + std::string comment, + std::shared_ptr description); + + /// Add a bit field, specified by the containing field and a bit offset + void addBitFieldDesc(std::string name, + size_t offset, + std::string comment, + std::shared_ptr containingDescription, + uint32_t bitOffset, + uint32_t bitWidth); + + /// Add a discriminated field, including the function used to know whether it is active + /// or not and a string description of that function. + void addDiscriminatedFieldDesc(std::string name, + size_t offset, + std::string comment, + std::shared_ptr desc, + std::function isActive, + std::string isActiveStr); + + virtual const FieldDescription * + hasField(const void * val, const std::string & field) const; + + virtual const FieldDescription * + getFieldDescription(const void * val, const void * field) const; + + virtual void forEachField(const void * val, + const std::function & onField) const; + + virtual const FieldDescription & + getField(const std::string & field) const; + + virtual const FieldDescription & + getFieldByNumber(int fieldNum) const; + + virtual int getVersion() const; + + virtual void fixupAlign(size_t knownWidth, size_t knownAlign) = 0; + + // Comparisons + virtual bool hasEqualityComparison() const; + virtual bool compareEquality(const void * val1, const void * val2) const; + virtual bool hasLessThanComparison() const; + virtual bool compareLessThan(const void * val1, const void * val2) const; + virtual bool hasStrongOrderingComparison() const; + virtual std::strong_ordering compareStrong(const void * val1, const void * val2) const; + virtual bool hasWeakOrderingComparison() const; + virtual std::weak_ordering compareWeak(const void * val1, const void * val2) const; + virtual bool hasPartialOrderingComparison() const; + virtual std::partial_ordering comparePartial(const void * val1, const void * val2) const; +}; + + +/*****************************************************************************/ +/* GENERIC STRUCTURE DESCRIPTION */ +/*****************************************************************************/ + +struct GenericStructureDescription: + public ValueDescription, + public StructureDescriptionBase { + + GenericStructureDescription(bool nullAccepted, + const std::string & structName); + + virtual void parseJson(void * val, JsonParsingContext & context) const override; + virtual void printJson(const void * val, JsonPrintingContext & context) const override; + virtual bool isDefault(const void * val) const override; + virtual void setDefault(void * val) const override; + virtual void copyValue(const void * from, void * to) const override; + virtual void moveValue(void * from, void * to) const override; + virtual void swapValues(void * from, void * to) const override; + virtual void initializeDefault(void * mem) const override; + virtual void initializeCopy(void * mem, const void * other) const override; + virtual void initializeMove(void * mem, void * other) const override; + virtual void destruct(void *) const override; + + virtual bool onEntry(void * output, JsonParsingContext & context) const override; + virtual void onExit(void * output, JsonParsingContext & context) const override; + + virtual size_t getFieldCount(const void * val) const override + { + return fields.size(); + } + + virtual bool hasFixedFieldCount() const override + { + return true; + } + + virtual size_t getFixedFieldCount() const override + { + return fields.size(); + } + + virtual const FieldDescription * + hasField(const void * val, const std::string & field) const override + { + return StructureDescriptionBase::hasField(val, field); + } + + virtual const FieldDescription * + getFieldDescription(const void * val, const void * field) const override + { + return StructureDescriptionBase::getFieldDescription(val, field); + } + + virtual void forEachField(const void * val, + const std::function & onField) const override + { + return StructureDescriptionBase::forEachField(val, onField); + } + + virtual const FieldDescription & + getField(const std::string & field) const override + { + return StructureDescriptionBase::getField(field); + } + + virtual const FieldDescription & + getFieldByNumber(int fieldNum) const override + { + return StructureDescriptionBase::getFieldByNumber(fieldNum); + } + + virtual int getVersion() const override + { + return StructureDescriptionBase::getVersion(); + } + + virtual void fixupAlign(size_t knownWidth, size_t knownAlign) override; + + // Comparisons + virtual bool hasEqualityComparison() const override + { + return StructureDescriptionBase::hasEqualityComparison(); + } + + virtual bool compareEquality(const void * val1, const void * val2) const override + { + return StructureDescriptionBase::compareEquality(val1, val2); + } + + virtual bool hasLessThanComparison() const override + { + return StructureDescriptionBase::hasLessThanComparison(); + } + + virtual bool compareLessThan(const void * val1, const void * val2) const override + { + return StructureDescriptionBase::compareLessThan(val1, val2); + } + + virtual bool hasStrongOrderingComparison() const override + { + return StructureDescriptionBase::hasStrongOrderingComparison(); + } + + virtual std::strong_ordering compareStrong(const void * val1, const void * val2) const override + { + return StructureDescriptionBase::compareStrong(val1, val2); + } + + virtual bool hasWeakOrderingComparison() const override + { + return StructureDescriptionBase::hasWeakOrderingComparison(); + } + + virtual std::weak_ordering compareWeak(const void * val1, const void * val2) const override + { + return StructureDescriptionBase::compareWeak(val1, val2); + } + + virtual bool hasPartialOrderingComparison() const override + { + return StructureDescriptionBase::hasPartialOrderingComparison(); + } + + virtual std::partial_ordering comparePartial(const void * val1, const void * val2) const override + { + return StructureDescriptionBase::comparePartial(val1, val2); + } }; @@ -124,7 +296,7 @@ struct StructureDescription : public ValueDescriptionT, public StructureDescriptionBase { StructureDescription(bool nullAccepted = false, - const std::string & structName = "") + const std::string & structName = type_name()) : ValueDescriptionT(ValueKind::STRUCTURE), StructureDescriptionBase(&typeid(Struct), this, structName, nullAccepted) @@ -181,6 +353,15 @@ struct StructureDescription addFieldDesc(name, field, comment, getDefaultDescriptionSharedT()); } + template + void addField(std::string name, + Base2 Base1::* field1, + V Base2::* field2, + std::string comment) + { + addFieldDesc(name, field1, field2, comment, getDefaultDescriptionSharedT()); + } + /** Add a field, but override the default value description to use. Note that description needs to be convertible to std::shared_ptr >, but GCC 5.1 is confused @@ -192,29 +373,25 @@ struct StructureDescription std::string comment, std::shared_ptr description) { - ExcAssert(description); - - if (fields.count(name.c_str())) - throw MLDB::Exception("field '" + name + "' added twice"); - - fieldNames.emplace_back(::strdup(name.c_str())); - const char * fieldName = fieldNames.back().get(); - - auto it = fields.insert - (Fields::value_type(fieldName, FieldDescription())) - .first; - - FieldDescription & fd = it->second; - fd.fieldName = fieldName; - fd.comment = comment; - fd.description = description; Struct * p = nullptr; - fd.offset = (size_t)&(p->*field); - fd.width = sizeof(V); - fd.fieldNum = fields.size() - 1; - orderedFields.push_back(it); - //using namespace std; - //cerr << "offset = " << fd.offset << endl; + size_t offset = (size_t)&(p->*field); + StructureDescriptionBase::addFieldDesc(std::move(name), offset, std::move(comment), std::move(description)); + } + + /** Add a field, which is part of a sub-structure. + */ + template + void addFieldDesc(std::string name, + Base2 Base1::* field1, + V Base2::* field2, + std::string comment, + std::shared_ptr description) + { + Struct * p1 = nullptr; + Base2 * p2 = nullptr; + size_t offset1 = (size_t)&(p1->*field1); + size_t offset2 = (size_t)&(p2->*field2); + StructureDescriptionBase::addFieldDesc(std::move(name), offset1 + offset2, std::move(comment), std::move(description)); } /** Add a description with a default value. */ @@ -227,27 +404,8 @@ struct StructureDescription std::shared_ptr > baseDesc = getDefaultDescriptionSharedT()) { - if (fields.count(name.c_str())) - throw MLDB::Exception("field '" + name + "' added twice"); - - fieldNames.emplace_back(::strdup(name.c_str())); - const char * fieldName = fieldNames.back().get(); - - auto it = fields.insert - (Fields::value_type(fieldName, FieldDescription())) - .first; - auto desc = std::make_shared(defaultValue, baseDesc); - - FieldDescription & fd = it->second; - fd.fieldName = fieldName; - fd.comment = comment; - fd.description = std::move(desc); - Struct * p = nullptr; - fd.offset = (size_t)&(p->*field); - fd.width = sizeof(V); - fd.fieldNum = fields.size() - 1; - orderedFields.push_back(it); + return addFieldDesc(std::move(name), field, std::move(comment), std::move(desc)); } /** Add a description with an automatic default value derived @@ -265,79 +423,186 @@ struct StructureDescription addField(std::move(name), field, comment, defValue, baseDesc); } + template + void addBitField(std::string name, + V Base::* containingField, + uint32_t bitStart, + uint32_t bitWidth, + std::function extract, + std::string comment) + { + addBitFieldDesc(std::move(name), containingField, bitStart, bitWidth, + std::move(extract), std::move(comment), + getDefaultDescriptionSharedT()); + } + + template + void addBitFieldCast(std::string name, + Bits Base::* containingFieldBits, + uint32_t bitStart, + uint32_t bitWidth, + std::function extract, + std::string comment) + { + static_assert(sizeof(Bits) == sizeof(V)); + typedef V Base::* ContainingField; + auto containingField = (ContainingField)containingFieldBits; + addBitFieldDesc(std::move(name), containingField, bitStart, bitWidth, + std::move(extract), std::move(comment), + getDefaultDescriptionSharedT()); + } + + template + void addBitField(std::string name, + V Base::* containingField, + uint32_t bitStart, + uint32_t bitWidth, + std::string comment) + { + addBitFieldCast(std::move(name), containingField, bitStart, bitWidth, std::move(comment)); + } + + template + void addBitFieldCast(std::string name, + V Base::* containingFieldBits, + uint32_t bitStart, + uint32_t bitWidth, + std::string comment) + { + static_assert(sizeof(Field) == sizeof(V)); + typedef Field Base::* ContainingField; + auto containingField = (ContainingField)containingFieldBits; + + std::shared_ptr desc = getDefaultDescriptionSharedT(); + + std::function extract = [bitStart,bitWidth,containingField,desc] (const void * obj) -> Field + { + const Field * containing = &(reinterpret_cast(obj)->*containingField); + //using namespace std; + //cerr << " extract: containing = " << (uint64_t)*containing << endl; + Field result; + desc->extractBitField(containing, &result, bitStart, bitWidth); + //cerr << " extract: result = " << (uint64_t)result << endl; + return result; + }; + + addBitFieldDesc(std::move(name), containingField, bitStart, bitWidth, + std::move(extract), std::move(comment), + desc); + } + + template + void addBitFieldDesc(std::string name, + V Base::* containingField, + uint32_t bitStart, + uint32_t bitWidth, + std::function extract, + std::string comment, + std::shared_ptr description) + { + Struct * p = nullptr; + size_t offset = (size_t)&(p->*containingField); + StructureDescriptionBase::addBitFieldDesc(std::move(name), offset, std::move(comment), std::move(description), + bitStart, bitWidth); + } + + template + void addDiscriminatedField(std::string name, + V Base::* field, + std::function isActive, + std::string comment, + std::string isActiveComment) + { + addDiscriminatedFieldDesc(std::move(name), field, std::move(isActive), + std::move(comment), + std::move(isActiveComment), + getDefaultDescriptionSharedT()); + } + + template + void addDiscriminatedFieldDesc(std::string name, + V Base::* field, + std::function isActive, + std::string comment, + std::string isActiveComment, + std::shared_ptr description) + { + Struct * p = nullptr; + size_t offset = (size_t)&(p->*field); + StructureDescriptionBase:: + addDiscriminatedFieldDesc(std::move(name), offset, std::move(comment), std::move(description), + isActive, isActiveComment); + } + + using ValueDescriptionT::parents; template void addParent(ValueDescriptionT * description_ = getDefaultDescription((V *)0)); + template + void addParentAsField(const std::string & name, const std::string & comment, + std::shared_ptr> description_ = getDefaultDescriptionSharedT()); + + virtual void parseJson(void * val, JsonParsingContext & context) const override + { + return StructureDescriptionBase::parseJson(val, context); + } + + virtual void printJson(const void * val, JsonPrintingContext & context) const override + { + return StructureDescriptionBase::printJson(val, context); + } + virtual size_t getFieldCount(const void * val) const override { return fields.size(); } + virtual bool hasFixedFieldCount() const override + { + return true; + } + virtual const FieldDescription * hasField(const void * val, const std::string & field) const override { - auto it = fields.find(field.c_str()); - if (it != fields.end()) - return &it->second; - return nullptr; + return StructureDescriptionBase::hasField(val, field); + } + + virtual size_t getFixedFieldCount() const override + { + return fields.size(); } virtual const FieldDescription * getFieldDescription(const void * val, const void * field) const override { - ssize_t offset = (const char *)field - (const char *)val; - for (auto & f: fields) { - if (f.second.offset >= offset - && f.second.offset + f.second.width <= offset) - return &f.second; - } - return nullptr; + return StructureDescriptionBase::getFieldDescription(val, field); } virtual void forEachField(const void * val, const std::function & onField) const override { - for (auto f: orderedFields) { - onField(f->second); - } + return StructureDescriptionBase::forEachField(val, onField); } virtual const FieldDescription & getField(const std::string & field) const override { - auto it = fields.find(field.c_str()); - if (it != fields.end()) - return it->second; - throw MLDB::Exception("structure has no field " + field); + return StructureDescriptionBase::getField(field); } virtual const FieldDescription & getFieldByNumber(int fieldNum) const override { - for (auto & f: fields) { - if (f.second.fieldNum == fieldNum) - return f.second; - } - - throw MLDB::Exception("structure has no field with given number"); + return StructureDescriptionBase::getFieldByNumber(fieldNum); } virtual int getVersion() const override { - return this->version; - } - - virtual void parseJson(void * val, JsonParsingContext & context) const override - { - return StructureDescriptionBase::parseJson(val, context); - } - - virtual void printJson(const void * val, JsonPrintingContext & context) const override - { - return StructureDescriptionBase::printJson(val, context); + return StructureDescriptionBase::getVersion(); } void collectUnparseableJson(Json::Value Struct::* member) @@ -357,6 +622,63 @@ struct StructureDescription getEntry(0, obj->*member) = context.expectJson(); }; } + + virtual void fixupAlign(size_t knownWidth, size_t knownAlign) override + { + ExcAssertLessEqual(knownWidth, this->width); + ExcAssertLessEqual(knownAlign, this->align); + } + + // Comparisons + virtual bool hasEqualityComparison() const override + { + return StructureDescriptionBase::hasEqualityComparison(); + } + + virtual bool compareEquality(const void * val1, const void * val2) const override + { + return StructureDescriptionBase::compareEquality(val1, val2); + } + + virtual bool hasLessThanComparison() const override + { + return StructureDescriptionBase::hasLessThanComparison(); + } + + virtual bool compareLessThan(const void * val1, const void * val2) const override + { + return StructureDescriptionBase::compareLessThan(val1, val2); + } + + virtual bool hasStrongOrderingComparison() const override + { + return StructureDescriptionBase::hasStrongOrderingComparison(); + } + + virtual std::strong_ordering compareStrong(const void * val1, const void * val2) const override + { + return StructureDescriptionBase::compareStrong(val1, val2); + } + + virtual bool hasWeakOrderingComparison() const override + { + return StructureDescriptionBase::hasWeakOrderingComparison(); + } + + virtual std::weak_ordering compareWeak(const void * val1, const void * val2) const override + { + return StructureDescriptionBase::compareWeak(val1, val2); + } + + virtual bool hasPartialOrderingComparison() const override + { + return StructureDescriptionBase::hasPartialOrderingComparison(); + } + + virtual std::partial_ordering comparePartial(const void * val1, const void * val2) const override + { + return StructureDescriptionBase::comparePartial(val1, val2); + } }; /** Base class for an implementation of a structure description. It @@ -382,6 +704,15 @@ RegisterValueDescriptionI StructureDescriptionImpl:: regme; +template +/*constexpr*/ size_t getParentOffset() +{ + constexpr size_t BASE = 0x1000; // can't use a null pointer + Struct * p = reinterpret_cast(BASE); + Parent * p2 = static_cast(p); + size_t ofs = reinterpret_cast(p2) - BASE; + return ofs; +} template template @@ -394,18 +725,15 @@ addParent(ValueDescriptionT * description_) StructureDescription * desc2 = dynamic_cast *>(description_); if (!desc2) { + auto name = type_name(*description_); delete description_; - throw MLDB::Exception("parent description is not a structure"); + throw MLDB::Exception("parent description is not a structure: it is " + name); } std::shared_ptr > description(desc2); parents.push_back(description); - constexpr size_t BASE = 0x1000; // can't use a null pointer - Struct * p = reinterpret_cast(BASE); - V * p2 = static_cast(p); - - size_t ofs = reinterpret_cast(p2) - BASE; + size_t ofs = getParentOffset(); //using namespace std; //cerr << "parent " << description_->typeName << " of " << this->typeName << " is at offset " << ofs << endl; @@ -432,8 +760,29 @@ addParent(ValueDescriptionT * description_) fd.offset = ofd.offset + ofs; fd.width = ofd.width; fd.fieldNum = fields.size() - 1; + + if (ofd.isActive) { + fd.isActive = ofd.isActive; + //MLDB_THROW_UNIMPLEMENTED("TODO: copy isActive"); + } + fd.isActiveStr = ofd.isActiveStr; + + if (ofd.bitField.has_value()) { + fd.bitField = *ofd.bitField; + //MLDB_THROW_UNIMPLEMENTED("TODO: copy bitfield"); + } + orderedFields.push_back(it); } } +template +template +void StructureDescription:: +addParentAsField(const std::string & name, const std::string & comment, + std::shared_ptr> description) +{ + StructureDescriptionBase::addFieldDesc(name, getParentOffset(), comment, description); +} + } // namespace MLDB diff --git a/types/testing/json_parsing_test.cc b/types/testing/json_parsing_test.cc index f13c06142..a4b9b0e30 100644 --- a/types/testing/json_parsing_test.cc +++ b/types/testing/json_parsing_test.cc @@ -72,6 +72,8 @@ BOOST_AUTO_TEST_CASE( test1 ) testFp("1.0E-3", 1.0E-3); testFp("Inf", INFINITY); testFp("-Inf", -INFINITY); + testFp("45000.00", 45000.00); + testUnsigned("45000", 45000); testHex4("0026", 38); testHex4("001A", 26); @@ -117,11 +119,16 @@ void testExpectStringUtf8(ParseContext * context) //cerr << "c = " << c << " " << (char)c << endl; if (c < 0 || c > 127) { + // Unicode c = context->expect_utf8_code_point(); + + char * p1 = buffer + pos; + char * p2 = p1; + pos += utf8::append(c, p2) - p1; + + continue; } - else { - ++(*context); - } + ++(*context); if (c == '\\') { c = *(*context)++; @@ -168,3 +175,11 @@ BOOST_AUTO_TEST_CASE(test_utf8_parsing) BOOST_CHECK_EQUAL(context.expectStringUtf8(), "hellô"); } + +BOOST_AUTO_TEST_CASE(test_match_number) +{ + std::string s = "e"; + ParseContext context(s, s.c_str(), s.c_str() + s.length()); + JsonNumber num; + BOOST_CHECK(!matchJsonNumber(context, num)); +} \ No newline at end of file diff --git a/types/testing/value_description_test.cc b/types/testing/value_description_test.cc index b63300e86..75a4f7b96 100644 --- a/types/testing/value_description_test.cc +++ b/types/testing/value_description_test.cc @@ -550,3 +550,43 @@ BOOST_AUTO_TEST_CASE(test_array_description) BOOST_CHECK_EQUAL(std::get<2>(testArray), 3); } } + + +struct ThingWithNoValueDescription { + +}; + +BOOST_AUTO_TEST_CASE(test_has_default_description) +{ + auto return1 = getDefaultDescriptionMaybe((ThingWithNoValueDescription *)0); + cerr << "return type 1 = " << type_name(return1) << endl; + auto return2 = getDefaultDescriptionMaybe((int *)0); + cerr << "return type 2 = " << type_name(return2) << endl; + auto return3 = getDefaultDescriptionMaybe((RecursiveStructure *)0); + cerr << "return type 3 = " << type_name(return3) << endl; + auto return4 = getDefaultDescriptionMaybe((std::vector *)0); + cerr << "return type 4 = " << type_name(return4) << endl; + auto return5 = getDefaultDescriptionMaybe((std::vector *)0); + cerr << "return type 5 = " << type_name(return5) << endl; + BOOST_CHECK_EQUAL(has_default_description::value, true); + BOOST_CHECK_EQUAL(has_default_description::value, false); + BOOST_CHECK_EQUAL((all_have_default_descriptions<>::value), true); + BOOST_CHECK_EQUAL((all_have_default_descriptions::value), true); + BOOST_CHECK_EQUAL((all_have_default_descriptions::value), true); + BOOST_CHECK_EQUAL((all_have_default_descriptions::value), false); + BOOST_CHECK_EQUAL((all_have_default_descriptions::value), false); + BOOST_CHECK_EQUAL((all_have_default_descriptions::value), false); +} + +BOOST_AUTO_TEST_CASE(containers_have_no_default_description) +{ + BOOST_CHECK_EQUAL((has_default_description>::value), true); + BOOST_CHECK_EQUAL((has_default_description>::value), true); + BOOST_CHECK_EQUAL((has_default_description>::value), true); + BOOST_CHECK_EQUAL((has_default_description>::value), false); + BOOST_CHECK_EQUAL((has_default_description::value), true); + BOOST_CHECK_EQUAL((has_default_description>::value), true); + BOOST_CHECK_EQUAL((has_default_description>::value), false); + BOOST_CHECK_EQUAL((has_default_description>::value), true); + BOOST_CHECK_EQUAL((has_default_description>::value), false); +} diff --git a/types/tuple_description.h b/types/tuple_description.h index 0ce531e81..949da96fc 100644 --- a/types/tuple_description.h +++ b/types/tuple_description.h @@ -24,11 +24,11 @@ namespace std { template MLDB::TupleDescription * -getDefaultDescription(tuple * = 0); +getDefaultDescription(tuple * = 0, std::enable_if_t::value> * = 0); template MLDB::TupleDescription * -getDefaultDescriptionUninitialized(tuple * = 0); +getDefaultDescriptionUninitialized(tuple * = 0, std::enable_if_t::value> * = 0); } // namespace std @@ -148,6 +148,21 @@ struct TupleDescription return sizeof...(T); } + virtual size_t getArrayFixedLength() const override + { + return sizeof...(T); + } + + virtual LengthModel getArrayLengthModel() const override + { + return LengthModel::FIXED; + } + + virtual OwnershipModel getArrayIndirectionModel() const override + { + return OwnershipModel::NONE; + } + virtual void * getArrayElement(void * val, uint32_t element) const override { return ((char*) val) + elements.at(element).offset; @@ -238,14 +253,14 @@ namespace std { template MLDB::TupleDescription * -getDefaultDescription(std::tuple *) +getDefaultDescription(std::tuple *, std::enable_if_t::value> *) { return new MLDB::TupleDescription(); } template MLDB::TupleDescription * -getDefaultDescriptionUninitialized(std::tuple *) +getDefaultDescriptionUninitialized(std::tuple *, std::enable_if_t::value> *) { return new MLDB::TupleDescription(MLDB::constructOnly); } diff --git a/types/types.mk b/types/types.mk index b2bd7e372..4e44d1a5e 100644 --- a/types/types.mk +++ b/types/types.mk @@ -14,6 +14,7 @@ JSONCPP_SOURCES := \ LIBVALUE_DESCRIPTION_SOURCES := \ value_description.cc \ + structure_description.cc \ basic_value_descriptions.cc \ libc_value_descriptions.cc \ json_parsing.cc \ @@ -22,7 +23,8 @@ LIBVALUE_DESCRIPTION_SOURCES := \ dtoa_impl.cc \ meta_value_description.cc \ distribution_description.cc \ -# string.cc \ + generic_array_description.cc \ + generic_atom_description.cc \ LIBVALUE_DESCRIPTION_LINK := \ arch base icui18n icuuc icudata @@ -45,7 +47,8 @@ LIBTYPES_SOURCES := \ regex.cc \ periodic_utils_value_descriptions.cc \ path.cc \ - annotated_exception.cc + exception_description.cc \ + annotated_exception.cc \ LIBTYPES_LINK := \ diff --git a/types/utility_descriptions.h b/types/utility_descriptions.h index f2d282ddc..b52555b10 100644 --- a/types/utility_descriptions.h +++ b/types/utility_descriptions.h @@ -31,13 +31,26 @@ struct BridgedValueDescription: public ValueDescription { virtual void copyValue(const void * from, void * to) const override; virtual void moveValue(void * from, void * to) const override; virtual void swapValues(void * from, void * to) const override; - virtual void * constructDefault() const override; - virtual void * constructCopy(const void * from) const override; - virtual void * constructMove(void * from) const override; - virtual void destroy(void *) const override; + virtual void initializeDefault(void * mem) const override; + virtual void initializeCopy(void * mem, const void * from) const override; + virtual void initializeMove(void * mem, void * from) const override; + virtual void destruct(void * obj) const override; + virtual bool hasEqualityComparison() const override; + virtual bool compareEquality(const void * val1, const void * val2) const override; + virtual bool hasLessThanComparison() const override; + virtual bool compareLessThan(const void * val1, const void * val2) const override; + virtual bool hasStrongOrderingComparison() const override; + virtual std::strong_ordering compareStrong(const void * val1, const void * val2) const override; + virtual bool hasWeakOrderingComparison() const override; + virtual std::weak_ordering compareWeak(const void * val1, const void * val2) const override; + virtual bool hasPartialOrderingComparison() const override; + virtual std::partial_ordering comparePartial(const void * val1, const void * val2) const override; virtual void * optionalMakeValue(void * val) const override; virtual const void * optionalGetValue(const void * val) const override; + virtual size_t getArrayFixedLength() const override; virtual size_t getArrayLength(void * val) const override; + virtual LengthModel getArrayLengthModel() const override; + virtual OwnershipModel getArrayIndirectionModel() const override; virtual void * getArrayElement(void * val, uint32_t element) const override; virtual const void * getArrayElement(const void * val, uint32_t element) const override; virtual const ValueDescription & @@ -50,6 +63,7 @@ struct BridgedValueDescription: public ValueDescription { virtual const ValueDescription & contained() const override; virtual OwnershipModel getOwnershipModel() const override; virtual void* getLink(void* obj) const override; + virtual const void* getConstLink(const void* obj) const override; virtual void set(void* obj, void* value, const ValueDescription* valueDesc) const override; virtual void convertAndCopy(const void * from, const ValueDescription & fromDesc, @@ -80,20 +94,20 @@ struct PureValueDescription : public ValueDescriptionT { ValueDescriptionT(ValueKind::ATOM) { } - virtual void parseJson(void * val, JsonParsingContext & context) const {}; - virtual void printJson(const void * val, JsonPrintingContext & context) const + virtual void parseJson(void * val, JsonParsingContext & context) const override {}; + virtual void printJson(const void * val, JsonPrintingContext & context) const override { context.writeNull(); }; - virtual bool isDefault(const void * val) const { return false; } - virtual void setDefault(void * val) const {} - virtual void copyValue(const void * from, void * to) const {} - virtual void moveValue(void * from, void * to) const {} - virtual void swapValues(void * from, void * to) const {} - virtual void * constructDefault() const {return nullptr;} - virtual void * constructCopy(const void *) const {return nullptr;} - virtual void * constructMove(void *) const {return nullptr;} - virtual void destroy(void *) const {} + virtual bool isDefault(const void * val) const override { return false; } + virtual void setDefault(void * val) const override {} + virtual void copyValue(const void * from, void * to) const override {} + virtual void moveValue(void * from, void * to) const override {} + virtual void swapValues(void * from, void * to) const override {} + virtual void initializeDefault(void * mem) const override {} + virtual void initializeCopy(void * mem, const void *) const override {} + virtual void initializeMove(void * mem, void *) const override {} + virtual void destruct(void *) const override {} }; @@ -127,9 +141,9 @@ struct ValueDescriptionWithDefault : public BridgedValueDescription { *val = defaultValue; } - virtual void * constructDefault() const override + virtual void initializeDefault(void * mem) const override { - return new T(defaultValue); + new (mem) T(defaultValue); } T defaultValue; @@ -180,57 +194,72 @@ struct DescriptionFromBase return addOffset(ptr, offset()); } - virtual void parseJson(void * val, JsonParsingContext & context) const + virtual void parseJson(void * val, JsonParsingContext & context) const override { inner->parseJson(fixPtr(val), context); } - virtual void parseJsonTyped(T * val, JsonParsingContext & context) const + virtual void parseJsonTyped(T * val, JsonParsingContext & context) const override { inner->parseJson(fixPtr(val), context); } - virtual void printJson(const void * val, JsonPrintingContext & context) const + virtual void printJson(const void * val, JsonPrintingContext & context) const override { inner->printJson(fixPtr(val), context); } - virtual void printJsonTyped(const T * val, JsonPrintingContext & context) const + virtual void printJsonTyped(const T * val, JsonPrintingContext & context) const override { inner->printJson(fixPtr(val), context); } - virtual bool isDefault(const void * val) const + virtual bool isDefault(const void * val) const override { return inner->isDefault(fixPtr(val)); } - virtual bool isDefaultTyped(const T * val) const + virtual bool isDefaultTyped(const T * val) const override { return inner->isDefault(fixPtr(val)); } - virtual size_t getArrayLength(void * val) const + virtual size_t getArrayLength(void * val) const override { return inner->getArrayLength(fixPtr(val)); } - virtual void * getArrayElement(void * val, uint32_t element) const + virtual size_t getArrayFixedLength() const override + { + return inner->getArrayFixedLength(); + } + + virtual LengthModel getArrayLengthModel() const override + { + return inner->getArrayLengthModel(); + } + + virtual OwnershipModel getArrayIndirectionModel() const override + { + return inner->getArrayIndirectionModel(); + } + + virtual void * getArrayElement(void * val, uint32_t element) const override { return inner->getArrayElement(fixPtr(val), element); } - virtual const void * getArrayElement(const void * val, uint32_t element) const + virtual const void * getArrayElement(const void * val, uint32_t element) const override { return inner->getArrayElement(fixPtr(val), element); } - virtual void setArrayLength(void * val, size_t newLength) const + virtual void setArrayLength(void * val, size_t newLength) const override { inner->setArrayLength(fixPtr(val), newLength); } - virtual const ValueDescription & contained() const + virtual const ValueDescription & contained() const override { return inner->contained(); } diff --git a/types/value_description.cc b/types/value_description.cc index 4af4c7124..2877c5f00 100644 --- a/types/value_description.cc +++ b/types/value_description.cc @@ -14,7 +14,6 @@ #include "value_description.h" #include "structure_description.h" - using namespace std; @@ -51,10 +50,14 @@ std::ostream & operator << (std::ostream & stream, ValueKind kind) ValueDescription:: ValueDescription(ValueKind kind, const std::type_info * type, + uint32_t width, + uint32_t align, const std::string & typeName) : kind(kind), type(type), - typeName(typeName.empty() ? demangle(type->name()) : typeName), + width(width), + align(align), + typeName(typeName.empty() ? (type ? demangle(type->name()) : "") : typeName), jsConverters(nullptr), jsConvertersInitialized(false) { @@ -92,53 +95,143 @@ printJsonString(const void * val) const return result; } +bool +ValueDescription:: +hasEqualityComparison() const +{ + return false; +} + +bool +ValueDescription:: +compareEquality(const void * val1, const void * val2) const +{ + MLDB_THROW_UNIMPLEMENTED_ON_THIS("type " + typeName + " does not support equality comparison"); +} + +bool +ValueDescription:: +hasLessThanComparison() const +{ + return false; +} + +bool +ValueDescription:: +compareLessThan(const void * val1, const void * val2) const +{ + MLDB_THROW_UNIMPLEMENTED_ON_THIS("type " + typeName + " does not support less than comparison"); +} + +bool +ValueDescription:: +hasStrongOrderingComparison() const +{ + return false; +} + +std::strong_ordering +ValueDescription:: +compareStrong(const void * val1, const void * val2) const +{ + MLDB_THROW_UNIMPLEMENTED_ON_THIS("type " + typeName + " does not support strongly ordered comparison"); +} + +bool +ValueDescription:: +hasWeakOrderingComparison() const +{ + return false; +} + +std::weak_ordering +ValueDescription:: +compareWeak(const void * val1, const void * val2) const +{ + MLDB_THROW_UNIMPLEMENTED_ON_THIS("type " + typeName + " does not support weakly ordered comparison"); +} + +bool +ValueDescription:: +hasPartialOrderingComparison() const +{ + return false; +} + +std::partial_ordering +ValueDescription:: +comparePartial(const void * val1, const void * val2) const +{ + MLDB_THROW_UNIMPLEMENTED_ON_THIS("type " + typeName + " does not support partially ordered comparison"); +} void * ValueDescription:: optionalMakeValue(void * val) const { - throw MLDB::Exception("type is not optional"); + MLDB_THROW_UNIMPLEMENTED_ON_THIS("type is not optional"); } const void * ValueDescription:: optionalGetValue(const void * val) const { - throw MLDB::Exception("type is not optional"); + MLDB_THROW_UNIMPLEMENTED_ON_THIS("type is not optional"); } size_t ValueDescription:: getArrayLength(void * val) const { - throw MLDB::Exception("type is not an array"); + MLDB_THROW_UNIMPLEMENTED_ON_THIS("type " + typeName + " is not an array"); +} + +size_t +ValueDescription:: +getArrayFixedLength() const +{ + MLDB_THROW_UNIMPLEMENTED_ON_THIS("type " + typeName + " is not an array"); +} + +LengthModel +ValueDescription:: +getArrayLengthModel() const +{ + MLDB_THROW_UNIMPLEMENTED_ON_THIS("type " + typeName + " is not an array"); +} + +OwnershipModel +ValueDescription:: +getArrayIndirectionModel() const +{ + MLDB_THROW_UNIMPLEMENTED_ON_THIS("type " + typeName + " is not an array"); } void * ValueDescription:: getArrayElement(void * val, uint32_t element) const { - throw MLDB::Exception("type is not an array"); + MLDB_THROW_UNIMPLEMENTED_ON_THIS("type " + typeName + " is not an array"); } std::vector > ValueDescription:: getTupleElementDescriptions() const { - throw MLDB::Exception("type '" + typeName + "' is not a tuple " + MLDB::type_name(*this)); + MLDB_THROW_UNIMPLEMENTED_ON_THIS("type '" + typeName + "' is not a tuple " + MLDB::type_name(*this)); } size_t ValueDescription:: getTupleLength() const { - throw MLDB::Exception("type '" + typeName + "' is not a tuple " + MLDB::type_name(*this)); + MLDB_THROW_UNIMPLEMENTED_ON_THIS("type '" + typeName + "' is not a tuple " + MLDB::type_name(*this)); } const void * ValueDescription:: getArrayElement(const void * val, uint32_t element) const { - throw MLDB::Exception("type is not an array"); + MLDB_THROW_UNIMPLEMENTED_ON_THIS("type " + typeName + " is not an array"); } /** Return the value description for the nth array element. This is @@ -156,70 +249,91 @@ void ValueDescription:: setArrayLength(void * val, size_t newLength) const { - throw MLDB::Exception("type is not an array"); + MLDB_THROW_UNIMPLEMENTED_ON_THIS("type " + typeName + " is not an array"); } const ValueDescription & ValueDescription:: getKeyValueDescription() const { - throw MLDB::Exception("type '" + typeName + "' has no key"); + MLDB_THROW_UNIMPLEMENTED_ON_THIS("type '" + typeName + "' has no key"); } const ValueDescription & ValueDescription:: contained() const { - throw MLDB::Exception("type '" + typeName + "' does not contain another"); + MLDB_THROW_UNIMPLEMENTED_ON_THIS("type '" + typeName + "' does not contain another"); } std::shared_ptr ValueDescription:: containedPtr() const { - throw MLDB::Exception("type '" + typeName + "' does not contain another"); + MLDB_THROW_UNIMPLEMENTED_ON_THIS("type '" + typeName + "' does not contain another"); } OwnershipModel ValueDescription:: getOwnershipModel() const { - throw MLDB::Exception("type '" + typeName + "' does not define an ownership type"); + MLDB_THROW_UNIMPLEMENTED_ON_THIS("type '" + typeName + "' does not define an ownership type"); } void* ValueDescription:: getLink(void* obj) const { - throw MLDB::Exception("type '" + typeName + "' is not a link"); + MLDB_THROW_UNIMPLEMENTED_ON_THIS("type '" + typeName + "' is not a link"); +} + +const void* +ValueDescription:: +getConstLink(const void* obj) const +{ + MLDB_THROW_UNIMPLEMENTED_ON_THIS("type '" + typeName + "' is not a link"); } void ValueDescription:: set(void* obj, void* value, const ValueDescription* valueDesc) const { - throw MLDB::Exception("type '" + typeName + "' can't be written to"); + MLDB_THROW_UNIMPLEMENTED_ON_THIS("type '" + typeName + "' can't be written to"); } size_t ValueDescription:: getFieldCount(const void * val) const { - throw MLDB::Exception("type '" + typeName + "' doesn't support fields"); + MLDB_THROW_UNIMPLEMENTED_ON_THIS("type '" + typeName + "' doesn't support fields"); +} + +bool +ValueDescription:: +hasFixedFieldCount() const +{ + MLDB_THROW_UNIMPLEMENTED_ON_THIS("type '" + typeName + "' doesn't support fields"); +} + +size_t +ValueDescription:: +getFixedFieldCount() const +{ + MLDB_THROW_UNIMPLEMENTED_ON_THIS("type '" + typeName + "' doesn't support fields"); } const ValueDescription::FieldDescription * ValueDescription:: hasField(const void * val, const std::string & name) const { - throw MLDB::Exception("type '" + typeName + "' doesn't support fields"); + MLDB_THROW_UNIMPLEMENTED_ON_THIS("type '" + typeName + "' doesn't support fields"); } const ValueDescription::FieldDescription * ValueDescription:: getFieldDescription(const void * val, const void * field) const { - throw MLDB::Exception("type '" + typeName + "' doesn't support fields"); + MLDB_THROW_UNIMPLEMENTED_ON_THIS("type '" + typeName + "' doesn't support fields"); } void @@ -227,35 +341,35 @@ ValueDescription:: forEachField(const void * val, const std::function & onField) const { - throw MLDB::Exception("type '" + typeName + "' doesn't support fields"); + MLDB_THROW_UNIMPLEMENTED_ON_THIS("type '" + typeName + "' doesn't support fields"); } const ValueDescription::FieldDescription & ValueDescription:: getField(const std::string & field) const { - throw MLDB::Exception("type '" + typeName + "' doesn't support fields"); + MLDB_THROW_UNIMPLEMENTED_ON_THIS("type '" + typeName + "' doesn't support fields"); } const ValueDescription::FieldDescription & ValueDescription:: getFieldByNumber(int fieldNum) const { - throw MLDB::Exception("type '" + typeName + "' doesn't support fields"); + MLDB_THROW_UNIMPLEMENTED_ON_THIS("type '" + typeName + "' doesn't support fields"); } const std::vector ValueDescription:: getEnumKeys() const { - throw MLDB::Exception("type '" + typeName + "' is not an enum"); + MLDB_THROW_UNIMPLEMENTED_ON_THIS("type '" + typeName + "' is not an enum"); } std::vector > ValueDescription:: getEnumValues() const { - throw MLDB::Exception("type '" + typeName + "' is not an enum"); + MLDB_THROW_UNIMPLEMENTED_ON_THIS("type '" + typeName + "' is not an enum"); } int @@ -314,9 +428,13 @@ initialize() namespace { std::recursive_mutex registryMutex; -std::unordered_map > & registry() +struct RegistryEntry { + std::shared_ptr desc; + std::vector aliases; +}; +std::unordered_map & registry() { - static std::unordered_map > result; + static std::unordered_map result; return result; } @@ -328,7 +446,7 @@ get(std::string const & name) { std::unique_lock guard(registryMutex); auto i = registry().find(name); - return registry().end() != i ? i->second : nullptr; + return registry().end() != i ? i->second.desc : nullptr; } std::shared_ptr @@ -367,9 +485,9 @@ registerValueDescription(const std::type_info & type, std::shared_ptr desc(createFn()); ExcAssert(desc); - registry()[desc->typeName] = desc; - registry()[type.name()] = desc; - registry()[demangle(type.name())] = desc; + registry()[desc->typeName].desc = desc; + registry()[type.name()].desc = desc; + registry()[demangle(type.name())].desc = desc; initFn(*desc); #if 0 cerr << "type " << demangle(type.name()) @@ -392,9 +510,9 @@ registerValueDescriptionFunctions(const std::type_info & type, std::shared_ptr desc(create()); ExcAssert(desc); - registry()[desc->typeName] = desc; - registry()[type.name()] = desc; - registry()[demangle(type.name())] = desc; + registry()[desc->typeName].desc = desc; + registry()[type.name()].desc = desc; + registry()[demangle(type.name())].desc = desc; initialize(*desc); #if 0 cerr << "type " << demangle(type.name()) @@ -407,183 +525,73 @@ registerValueDescriptionFunctions(const std::type_info & type, #endif } -void -ValueDescription:: -convertAndCopy(const void * from, - const ValueDescription & fromDesc, - void * to) const -{ - Json::Value val; - StructuredJsonPrintingContext context(val); - fromDesc.printJson(from, context); - - StructuredJsonParsingContext context2(val); - parseJson(to, context2); -} - -/*****************************************************************************/ -/* STRUCTURE DESCRIPTION BASE */ -/*****************************************************************************/ - - -StructureDescriptionBase:: -StructureDescriptionBase(const std::type_info * type, - ValueDescription * owner, - const std::string & structName, - bool nullAccepted) - : type(type), - structName(structName.empty() ? demangle(type->name()) : structName), - nullAccepted(nullAccepted), - owner(owner) +void registerValueDescriptionAlias(const std::type_info & type, const std::string & alias) { -} - -void -StructureDescriptionBase:: -operator = (const StructureDescriptionBase & other) -{ - type = other.type; - structName = other.structName; - nullAccepted = other.nullAccepted; - - fieldNames.clear(); - orderedFields.clear(); - fields.clear(); - fieldNames.reserve(other.fields.size()); - - // Don't set owner - for (auto & f: other.orderedFields) { - const char * s = f->first; - fieldNames.emplace_back(::strdup(s)); - auto it = fields.insert(make_pair(fieldNames.back().get(), f->second)) - .first; - orderedFields.push_back(it); + auto desc = ValueDescription::get(type); + if (!desc) { + throw MLDB::Exception("registering value description alias '" + alias + "' of type '" + + demangle(type.name()) + "': type isn't registered"); } + + std::unique_lock guard(registryMutex); + registry()[alias].desc = desc; + registry()[type.name()].aliases.push_back(alias); } -void -StructureDescriptionBase:: -operator = (StructureDescriptionBase && other) +std::vector +getValueDescriptionAliases(const std::type_info & type) { - type = std::move(other.type); - structName = std::move(other.structName); - nullAccepted = std::move(other.nullAccepted); - fields = std::move(other.fields); - fieldNames = std::move(other.fieldNames); - orderedFields = std::move(other.orderedFields); - // don't set owner + std::unique_lock guard(registryMutex); + auto it = registry().find(type.name()); + if (it == registry().end()) { + return {}; + } + return it->second.aliases; } -StructureDescriptionBase::Exception:: -Exception(JsonParsingContext & context, - const std::string & message) - : MLDB::Exception("at " + context.printPath() + ": " + message) +void registerForeignValueDescription(const std::string & typeName, + std::shared_ptr desc, + const std::vector & aliases) { + std::unique_lock guard(registryMutex); + if (registry().count(typeName)) + throw MLDB::Exception("Foreign value description overwrites a native one"); + registry()[typeName].desc = desc; + registry()[typeName].aliases = aliases; + + for (auto & alias: aliases) { + if (registry().count(alias)) + throw MLDB::Exception("Foreign value description alias overwrites a native one"); + registry()[alias].desc = desc; + } } -StructureDescriptionBase::Exception:: -~Exception() throw () +void +ValueDescription:: +extractBitField(const void * from, void * to, uint32_t bitOffset, uint32_t bitWidth) const { + MLDB_THROW_UNIMPLEMENTED_ON_THIS("Only integral types support insertion/extraction of bit fields"); } void -StructureDescriptionBase:: -parseJson(void * output, JsonParsingContext & context) const -{ - try { - - if (!onEntry(output, context)) return; - - if (nullAccepted && context.isNull()) { - context.expectNull(); - return; - } - - if (!context.isObject()) { - std::string typeName; - if (context.isNumber()) - typeName = "number"; - else if (context.isBool()) - typeName = "boolean"; - else if (context.isString()) - typeName = "string"; - else if (context.isNull()) - typeName = "null"; - else if (context.isArray()) - typeName = "array"; - else typeName = "<>"; - - std::string msg - = "expected object of type " - + structName + ", but instead a " - + typeName + " was provided"; - - if (context.isString()) - msg += ". Did you accidentally JSON encode your object into a string?"; - - context.exception(msg); - } - - auto onMember = [&] () - { - try { - auto n = context.fieldName(); // TODO: use FieldNameView - - auto it = fields.find(n.c_str()); - if (it == fields.end()) { - context.onUnknownField(owner); - } - else { - it->second.description - ->parseJson(addOffset(output, - it->second.offset), - context); - } - } - catch (const Exception & exc) { - throw; - } - catch (const std::exception & exc) { - throw Exception(context, exc.what()); - } - catch (...) { - throw; - } - }; - - - context.forEachMember(onMember); - - onExit(output, context); - } - catch (const Exception & exc) { - throw; - } - catch (const std::exception & exc) { - throw Exception(context, exc.what()); - } - catch (...) { - throw; - } +ValueDescription:: +insertBitField(const void * from, void * to, uint32_t bitOffset, uint32_t bitWidth) const +{ + MLDB_THROW_UNIMPLEMENTED_ON_THIS("Only integral types support insertion/extraction of bit fields"); } void -StructureDescriptionBase:: -printJson(const void * input, JsonPrintingContext & context) const +ValueDescription:: +convertAndCopy(const void * from, + const ValueDescription & fromDesc, + void * to) const { - context.startObject(); - - for (const auto & it: orderedFields) { - auto & fd = it->second; + Json::Value val; + StructuredJsonPrintingContext context(val); + fromDesc.printJson(from, context); - const void * mbr = addOffset(input, fd.offset); - if (fd.description->isDefault(mbr)) - continue; - context.startMember(it->first); - fd.description->printJson(mbr, context); - } - - context.endObject(); + StructuredJsonParsingContext context2(val); + parseJson(to, context2); } @@ -593,7 +601,7 @@ printJson(const void * input, JsonPrintingContext & context) const BridgedValueDescription:: BridgedValueDescription(std::shared_ptr impl) - : ValueDescription(impl->kind, impl->type, impl->typeName), + : ValueDescription(impl->kind, impl->type, impl->width, impl->align, impl->typeName), impl(std::move(impl)) { this->documentationUri = this->impl->documentationUri; @@ -660,36 +668,36 @@ swapValues(void * from, void * to) const swapValues(from, to); } -void * +void BridgedValueDescription:: -constructDefault() const +initializeDefault(void * mem) const { ExcAssert(impl); - return impl->constructDefault(); + impl->initializeDefault(mem); } -void * +void BridgedValueDescription:: -constructCopy(const void * from) const +initializeCopy(void * mem, const void * from) const { ExcAssert(impl); - return impl->constructCopy(from); + return impl->initializeCopy(mem, from); } -void * +void BridgedValueDescription:: -constructMove(void * from) const +initializeMove(void * mem, void * from) const { ExcAssert(impl); - return impl->constructMove(from); + return impl->initializeMove(mem, from); } void BridgedValueDescription:: -destroy(void * val) const +destruct(void * val) const { ExcAssert(impl); - impl->destroy(val); + impl->destruct(val); } void * @@ -700,6 +708,86 @@ optionalMakeValue(void * val) const return impl->optionalMakeValue(val); } +bool +BridgedValueDescription:: +hasEqualityComparison() const +{ + ExcAssert(impl); + return impl->hasEqualityComparison(); +} + +bool +BridgedValueDescription:: +compareEquality(const void * val1, const void * val2) const +{ + ExcAssert(impl); + return impl->compareEquality(val1, val2); +} + +bool +BridgedValueDescription:: +hasLessThanComparison() const +{ + ExcAssert(impl); + return impl->hasLessThanComparison(); +} + +bool +BridgedValueDescription:: +compareLessThan(const void * val1, const void * val2) const +{ + ExcAssert(impl); + return impl->compareLessThan(val1, val2); +} + +bool +BridgedValueDescription:: +hasStrongOrderingComparison() const +{ + ExcAssert(impl); + return impl->hasStrongOrderingComparison(); +} + +std::strong_ordering +BridgedValueDescription:: +compareStrong(const void * val1, const void * val2) const +{ + ExcAssert(impl); + return impl->compareStrong(val1, val2); +} + +bool +BridgedValueDescription:: +hasWeakOrderingComparison() const +{ + ExcAssert(impl); + return impl->hasWeakOrderingComparison(); +} + +std::weak_ordering +BridgedValueDescription:: +compareWeak(const void * val1, const void * val2) const +{ + ExcAssert(impl); + return impl->compareWeak(val1, val2); +} + +bool +BridgedValueDescription:: +hasPartialOrderingComparison() const +{ + ExcAssert(impl); + return impl->hasPartialOrderingComparison(); +} + +std::partial_ordering +BridgedValueDescription:: +comparePartial(const void * val1, const void * val2) const +{ + ExcAssert(impl); + return impl->comparePartial(val1, val2); +} + const void * BridgedValueDescription:: optionalGetValue(const void * val) const @@ -708,6 +796,14 @@ optionalGetValue(const void * val) const return impl->optionalGetValue(val); } +size_t +BridgedValueDescription:: +getArrayFixedLength() const +{ + ExcAssert(impl); + return impl->getArrayFixedLength(); +} + size_t BridgedValueDescription:: getArrayLength(void * val) const @@ -716,6 +812,22 @@ getArrayLength(void * val) const return impl->getArrayLength(val); } +LengthModel +BridgedValueDescription:: +getArrayLengthModel() const +{ + ExcAssert(impl); + return impl->getArrayLengthModel(); +} + +OwnershipModel +BridgedValueDescription:: +getArrayIndirectionModel() const +{ + ExcAssert(impl); + return impl->getArrayIndirectionModel(); +} + void * BridgedValueDescription:: getArrayElement(void * val, uint32_t element) const @@ -796,6 +908,14 @@ getLink(void* obj) const return impl->getLink(obj); } +const void* +BridgedValueDescription:: +getConstLink(const void* obj) const +{ + ExcAssert(impl); + return impl->getConstLink(obj); +} + void BridgedValueDescription:: set(void* obj, void* value, const ValueDescription* valueDesc) const diff --git a/types/value_description.h b/types/value_description.h index b7d35dd2c..8f1088a34 100644 --- a/types/value_description.h +++ b/types/value_description.h @@ -23,6 +23,8 @@ #include "json_printing.h" #include "mldb/ext/jsoncpp/value.h" #include "mldb/types/string.h" +#include +#include namespace MLDB { @@ -40,12 +42,16 @@ namespace MLDB { struct ValueDescription { ValueDescription(ValueKind kind, const std::type_info * type, + uint32_t width, + uint32_t align, const std::string & typeName = ""); virtual ~ValueDescription(); ValueKind kind; const std::type_info * type; + uint32_t width; + uint32_t align; std::string typeName; std::string documentationUri; @@ -60,16 +66,30 @@ struct ValueDescription { virtual void copyValue(const void * from, void * to) const = 0; virtual void moveValue(void * from, void * to) const = 0; virtual void swapValues(void * from, void * to) const = 0; - virtual void * constructDefault() const = 0; - virtual void * constructCopy(const void * other) const = 0; - virtual void * constructMove(void * other) const = 0; - virtual void destroy(void *) const = 0; + virtual void initializeDefault(void * obj) const = 0; + virtual void initializeCopy(void * obj, const void * other) const = 0; + virtual void initializeMove(void * obj, void * other) const = 0; + virtual void destruct(void *) const = 0; + + // Comparisons + virtual bool hasEqualityComparison() const; + virtual bool compareEquality(const void * val1, const void * val2) const; + virtual bool hasLessThanComparison() const; + virtual bool compareLessThan(const void * val1, const void * val2) const; + virtual bool hasStrongOrderingComparison() const; + virtual std::strong_ordering compareStrong(const void * val1, const void * val2) const; + virtual bool hasWeakOrderingComparison() const; + virtual std::weak_ordering compareWeak(const void * val1, const void * val2) const; + virtual bool hasPartialOrderingComparison() const; + virtual std::partial_ordering comparePartial(const void * val1, const void * val2) const; - virtual void * optionalMakeValue(void * val) const; virtual const void * optionalGetValue(const void * val) const; + virtual size_t getArrayFixedLength() const; virtual size_t getArrayLength(void * val) const; + virtual LengthModel getArrayLengthModel() const; + virtual OwnershipModel getArrayIndirectionModel() const; // NONE = inline, SHARED = external, shared, UNIQUE = external, unique virtual void * getArrayElement(void * val, uint32_t element) const; virtual const void * getArrayElement(const void * val, uint32_t element) const; @@ -100,6 +120,7 @@ struct ValueDescription { virtual OwnershipModel getOwnershipModel() const; virtual void* getLink(void* obj) const; + virtual const void* getConstLink(const void* obj) const; virtual void set(void* obj, void* value, const ValueDescription* valueDesc) const; @@ -110,6 +131,22 @@ struct ValueDescription { const ValueDescription & fromDesc, void * to) const; + // Extract the bit range. From points to an initialized object from this + // ValueDescription, to points to an initialized object of the same type. + virtual void extractBitField(const void * from, void * to, uint32_t bitOffset, uint32_t bitWidth) const; + + // Extract the bit range. From points to an initialized object from this + // ValueDescription to insert into, to points to an initialized object of the same type into + // which the value should be inserted. + virtual void insertBitField(const void * from, void * to, uint32_t bitOffset, uint32_t bitWidth) const; + + struct BitFieldDescription { + uint32_t startBit; + uint32_t bitWidth; + //std::function extract; + //std::function insert; + }; + struct FieldDescription { std::string fieldName; std::string comment; @@ -118,6 +155,13 @@ struct ValueDescription { int width; int fieldNum; + /// For unions: return whether the field is active or not based upon the + /// state of the object. + std::function isActive; + + /// String version of active condition + std::string isActiveStr; + void* getFieldPtr(void* obj) const { return ((char*) obj) + offset; @@ -127,10 +171,16 @@ struct ValueDescription { { return ((const char*) obj) + offset; } + + std::optional bitField; }; virtual size_t getFieldCount(const void * val) const; + virtual bool hasFixedFieldCount() const; + + virtual size_t getFixedFieldCount() const; + virtual const FieldDescription * hasField(const void * val, const std::string & name) const; @@ -236,6 +286,19 @@ void registerValueDescriptionFunctions(const std::type_info & type, void (*initialize) (ValueDescription &), bool isDefault); +/** Register an alias to a pre-existing type. This allows non-C++ names to be used + whilst maintaining the ability to find the equivalent C++ type. +*/ +void registerValueDescriptionAlias(const std::type_info & type, const std::string & alias); + +// Return the aliases for this type +std::vector getValueDescriptionAliases(const std::type_info & type); + +// Register a foreign value description (for a type that doesn't have a C++ equivalent) +void registerForeignValueDescription(const std::string & typeName, + std::shared_ptr desc, + const std::vector & aliases = {}); + template struct RegisterValueDescription { static ValueDescription * create() { return getDefaultDescription((T*)0); } @@ -262,6 +325,11 @@ struct RegisterValueDescriptionI { static const RegisterValueDescription registerValueDescription##type; \ } +#define REGISTER_VALUE_DESCRIPTION_ALIAS_NAMED(type, name) \ +namespace { static const struct DoRegisterAlias##type##name { DoRegisterAlias##type##name() { MLDB::registerValueDescriptionAlias(typeid(type), #name); }} doRegisterAlias##type##name; } + +#define REGISTER_VALUE_DESCRIPTION_ALIAS(type) REGISTER_VALUE_DESCRIPTION_ALIAS_NAMED(type, type) + template void doSwap(T1 & t1, T2 & t2) { @@ -281,7 +349,7 @@ template struct ValueDescriptionT : public ValueDescription { ValueDescriptionT(ValueKind kind = ValueKind::ATOM) - : ValueDescription(kind, &typeid(T)) + : ValueDescription(kind, &typeid(T), sizeof(T), alignof(T)) { } @@ -336,7 +404,7 @@ struct ValueDescriptionT : public ValueDescription { virtual void setDefaultTyped(T * val) const { - *val = T(); + return setDefault(val, typename std::is_default_constructible::type()); } virtual void copyValue(const void * from, void * to) const override @@ -359,24 +427,24 @@ struct ValueDescriptionT : public ValueDescription { doSwap(*from2, *to2); } - virtual void * constructDefault() const override + virtual void initializeDefault(void * obj) const override { - return constructDefault(typename std::is_default_constructible::type()); + return initializeDefault(obj, typename std::is_default_constructible::type()); } - virtual void * constructCopy(const void * val) const override + virtual void initializeCopy(void * obj, const void * val) const override { - return constructCopy(val, typename std::is_copy_constructible::type()); + return initializeCopy(obj, val, typename std::is_copy_constructible::type()); } - virtual void * constructMove(void * val) const override + virtual void initializeMove(void * obj, void * val) const override { - return constructMove(val, typename std::is_move_constructible::type()); + return initializeMove(obj, val, typename std::is_move_constructible::type()); } - virtual void destroy(void * val) const override + virtual void destruct(void * val) const override { - delete (T*)val; + ((T*)val)->~T(); } virtual void set( @@ -467,24 +535,55 @@ struct ValueDescriptionT : public ValueDescription { { throw MLDB::Exception("type is not move constructible"); } -}; -template -struct GetDefaultDescriptionMaybe { - static std::shared_ptr get() + // Template parameter so not instantiated for types that are not + // default constructible + template + void setDefault(void * obj, X) const { - return nullptr; + *reinterpret_cast(obj) = T(); } -}; -template -struct GetDefaultDescriptionMaybe { - static std::shared_ptr get() + void setDefault(void * obj, std::false_type) const { - return getDefaultDescriptionShared((T *)0); + throw MLDB::Exception("type is not default initializable"); + } + + template + void initializeDefault(void * obj, X) const + { + new (obj) T(); + } + + void initializeDefault(void * obj, std::false_type) const + { + throw MLDB::Exception("type is not default initializable"); + } + + template + void initializeCopy(void * obj, const void * from, X) const + { + new (obj) T(*((T*)from)); + } + + void initializeCopy(void * obj, const void *, std::false_type) const + { + throw MLDB::Exception("type is not copy initializable"); + } + + template + void initializeMove(void * obj, void * from, X) const + { + new (obj) T(std::move(*((T*)from))); + } + + void initializeMove(void * obj, void *, std::false_type) const + { + throw MLDB::Exception("type is not move initializable"); } }; + /** Return the default description for the given type if it exists, or otherwise return a null pointer. */ @@ -493,7 +592,7 @@ template inline std::shared_ptr maybeGetDefaultDescriptionShared(T * = 0) { - auto result = GetDefaultDescriptionMaybe::get(); + std::shared_ptr result = getDefaultDescriptionSharedMaybe((T*)0); if (!result) { // Look to see if it's registered in the registry so that we can // get it @@ -648,7 +747,7 @@ Json::Value jsonEncode(const T & obj) Json::Value output; StructuredJsonPrintingContext context(output); desc->printJson(&obj, context); - return std::move(context.output); + return std::move(*context.outputPtr); } // jsonEncode implementation for any type which: @@ -703,6 +802,9 @@ extern template struct ValueDescriptionT; extern template struct ValueDescriptionT; extern template struct ValueDescriptionT; extern template struct ValueDescriptionT; +extern template struct ValueDescriptionT; +extern template struct ValueDescriptionT; +extern template struct ValueDescriptionT; extern template struct ValueDescriptionT; extern template struct ValueDescriptionT; extern template struct ValueDescriptionT; diff --git a/types/value_description_fwd.h b/types/value_description_fwd.h index f4aaac660..5c39b008c 100644 --- a/types/value_description_fwd.h +++ b/types/value_description_fwd.h @@ -16,6 +16,8 @@ namespace MLDB { +using half = _Float16; + class Utf8String; class Utf32String; struct JsonParsingContext; @@ -85,6 +87,12 @@ enum class OwnershipModel : int32_t { SHARED }; +/// Models the length of an array +enum class LengthModel : int32_t { + FIXED, + VARIABLE +}; + template struct ValueDescriptionI; std::ostream & operator << (std::ostream & stream, ValueKind kind); @@ -103,16 +111,21 @@ std::shared_ptr > getDefaultDescriptionShared(T *); template -std::shared_ptr > -getDefaultDescriptionSharedT() +auto getDefaultDescriptionSharedT() { using namespace MLDB; return getDefaultDescriptionShared((T *)0); } template -ValueDescriptionT * -getDefaultDescriptionUninitialized(T *) +auto getDefaultDescriptionSharedGenericT() +{ + using namespace MLDB; + return getDefaultDescriptionSharedGeneric((T *)0); +} + +template +auto getDefaultDescriptionUninitialized(T *) { using namespace MLDB; return getDefaultDescription((T *)0); @@ -124,19 +137,22 @@ getDefaultDescriptionUninitialized(T *) #define DECLARE_STRUCTURE_DESCRIPTION_NAMED(Name, Type) \ struct Name; \ \ - MLDB::ValueDescriptionT * \ + MLDB::ValueDescriptionT * \ getDefaultDescription(Type *); \ \ - MLDB::ValueDescriptionT * \ + MLDB::ValueDescriptionT * \ getDefaultDescriptionUninitialized(Type *); \ + \ + std::shared_ptr \ + getDefaultDescriptionSharedGeneric(Type *); \ #define DEFINE_STRUCTURE_DESCRIPTION_NAMED(Name, Type) \ \ struct Name \ - : public MLDB::StructureDescription { \ + : public MLDB::StructureDescription { \ Name(); \ \ - Name(const MLDB::ConstructOnly &); \ + Name(const MLDB::ConstructOnly &); \ \ virtual void initialize() \ { \ @@ -150,30 +166,36 @@ getDefaultDescriptionUninitialized(T *) \ struct Name::Regme { \ bool done; \ - static ValueDescription * creator() { return new Name(); } \ + static MLDB::ValueDescription * creator() { return new Name(); } \ Regme() \ : done(false) \ { \ MLDB::registerValueDescriptionFunctions \ - (typeid(Type), creator, true); \ + (typeid(Type), creator, true); \ } \ }; \ \ - Name::Name(const MLDB::ConstructOnly &) \ + Name::Name(const MLDB::ConstructOnly &) \ { \ regme.done = true; \ } \ \ - MLDB::ValueDescriptionT * \ + MLDB::ValueDescriptionT * \ getDefaultDescription(Type *) \ { \ return new Name(); \ } \ \ - MLDB::ValueDescriptionT * \ + MLDB::ValueDescriptionT * \ getDefaultDescriptionUninitialized(Type *) \ { \ return new Name(::MLDB::constructOnly); \ + } \ + \ + std::shared_ptr \ + getDefaultDescriptionSharedGeneric(Type *) \ + { \ + return MLDB::ValueDescription::get(typeid(Type)); \ } \ Name::Regme Name::regme; \ @@ -193,29 +215,33 @@ getDefaultDescriptionUninitialized(T *) DEFINE_STRUCTURE_DESCRIPTION(type) \ type##Description::type##Description() +#define IMPLEMENT_STRUCTURE_DESCRIPTION_NAMED(name, type) \ + DECLARE_STRUCTURE_DESCRIPTION_NAMED(name, type) \ + DEFINE_STRUCTURE_DESCRIPTION_NAMED(name, type) \ + name::name() -#define DECLARE_ENUM_DESCRIPTION_NAMED(Name, Type) \ - \ - MLDB::ValueDescriptionT * \ - getDefaultDescription(Type *); \ - \ - MLDB::ValueDescriptionT * \ - getDefaultDescriptionUninitialized(Type *); \ +#define DECLARE_ENUM_DESCRIPTION_NAMED(Name, Type) \ + \ + MLDB::ValueDescriptionT * \ + getDefaultDescription(Type *); \ + \ + MLDB::ValueDescriptionT * \ + getDefaultDescriptionUninitialized(Type *); \ #define DEFINE_ENUM_DESCRIPTION_NAMED(Name, Type) \ \ struct Name \ - : public MLDB::EnumDescription { \ + : public MLDB::EnumDescription { \ Name(); \ }; \ \ - MLDB::ValueDescriptionT * \ + MLDB::ValueDescriptionT * \ getDefaultDescription(Type *) \ { \ return new Name(); \ } \ \ - MLDB::ValueDescriptionT * \ + MLDB::ValueDescriptionT * \ getDefaultDescriptionUninitialized(Type *) \ { \ return new Name(); \ @@ -238,35 +264,43 @@ getDefaultDescriptionUninitialized(T *) type##Description::type##Description() #define PREDECLARE_VALUE_DESCRIPTION(T) \ - MLDB::ValueDescriptionT * \ + MLDB::ValueDescriptionT * \ getDefaultDescription(T * = 0); \ - MLDB::ValueDescriptionT * \ + MLDB::ValueDescriptionT * \ getDefaultDescriptionUninitialized(T * = 0); \ - std::shared_ptr > \ + std::shared_ptr > \ getDefaultDescriptionShared(T * = 0); \ + std::shared_ptr \ + getDefaultDescriptionSharedGeneric(T * = 0); \ #define DECLARE_VALUE_DESCRIPTION(T) \ PREDECLARE_VALUE_DESCRIPTION(T) \ - extern template struct ValueDescriptionT; \ + extern template struct MLDB::ValueDescriptionT; \ #define DEFINE_VALUE_DESCRIPTION_NS(T, Desc) \ - MLDB::ValueDescriptionT * \ + MLDB::ValueDescriptionT * \ getDefaultDescription(T *) \ { \ return new Desc(); \ } \ \ - MLDB::ValueDescriptionT * \ + MLDB::ValueDescriptionT * \ getDefaultDescriptionUninitialized(T *) \ { \ return new Desc(); \ } \ \ - std::shared_ptr > \ + std::shared_ptr > \ getDefaultDescriptionShared(T *) \ { \ static std::shared_ptr result = std::make_shared(); \ return result; \ + } \ + \ + std::shared_ptr \ + getDefaultDescriptionSharedGeneric(T *) \ + { \ + return getDefaultDescriptionShared((T*)0); \ } \ #define DEFINE_VALUE_DESCRIPTION(T, Desc) \ @@ -276,39 +310,43 @@ getDefaultDescriptionUninitialized(T *) #define VD_SINGLE_ARG(...) __VA_ARGS__ -#define DECLARE_TEMPLATE_VALUE_DESCRIPTION_N(Impl, Type, ParamList, ArgList) \ +#define DECLARE_TEMPLATE_VALUE_DESCRIPTION_N(Impl, Type, ParamList, ArgList, Enable) \ template \ - ValueDescriptionT > * \ - getDefaultDescription(Type * = 0) \ + MLDB::ValueDescriptionT > * \ + getDefaultDescription(Type * = 0, std::enable_if_t * = 0) \ { \ return new Impl(); \ } \ \ template \ - struct ValueDescriptionInit >: public ValueDescriptionInitBase { \ - static ValueDescription * create() \ + struct ValueDescriptionInit >: public MLDB::ValueDescriptionInitBase { \ + static MLDB::ValueDescription * create() \ { \ - return new Impl(MLDB::ConstructOnly()); \ + return new Impl(MLDB::ConstructOnly()); \ } \ - } \ + }; \ + \ + template \ + struct has_default_description> : std::integral_constant {} \ -#define DECLARE_TEMPLATE_VALUE_DESCRIPTION_1(Impl, Type, ArgType1, Arg1) \ - DECLARE_TEMPLATE_VALUE_DESCRIPTION_N(Impl, Type, VD_SINGLE_ARG(ArgType1 Arg1), VD_SINGLE_ARG(Arg1)) -#define DECLARE_TEMPLATE_VALUE_DESCRIPTION_2(Impl, Type, ArgType1, Arg1, ArgType2, Arg2) \ - DECLARE_TEMPLATE_VALUE_DESCRIPTION_N(Impl, Type, VD_SINGLE_ARG(ArgType1 Arg1, ArgType2 Arg2), VD_SINGLE_ARG(Arg1, Arg2)) +#define DECLARE_TEMPLATE_VALUE_DESCRIPTION_1(Impl, Type, ArgType1, Arg1, Enable) \ + DECLARE_TEMPLATE_VALUE_DESCRIPTION_N(Impl, Type, VD_SINGLE_ARG(ArgType1 Arg1), VD_SINGLE_ARG(Arg1), Enable) -#define DECLARE_TEMPLATE_VALUE_DESCRIPTION_3(Impl, Type, ArgType1, Arg1, ArgType2, Arg2, ArgType3, Arg3) \ - DECLARE_TEMPLATE_VALUE_DESCRIPTION_N(Impl, Type, VD_SINGLE_ARG(ArgType1 Arg1, ArgType2 Arg2, ArgType3 Arg3), VD_SINGLE_ARG(Arg1, Arg2, Arg3)) +#define DECLARE_TEMPLATE_VALUE_DESCRIPTION_2(Impl, Type, ArgType1, Arg1, ArgType2, Arg2, Enable) \ + DECLARE_TEMPLATE_VALUE_DESCRIPTION_N(Impl, Type, VD_SINGLE_ARG(ArgType1 Arg1, ArgType2 Arg2), VD_SINGLE_ARG(Arg1, Arg2), Enable) -#define DECLARE_TEMPLATE_VALUE_DESCRIPTION_4(Impl, Type, ArgType1, Arg1, ArgType2, Arg2, ArgType3, Arg3, ArgType4, Arg4) \ - DECLARE_TEMPLATE_VALUE_DESCRIPTION_N(Impl, Type, VD_SINGLE_ARG(ArgType1 Arg1, ArgType2 Arg2, ArgType3 Arg3, ArgType4 Arg4), VD_SINGLE_ARG(Arg1, Arg2, Arg3, Arg4)) +#define DECLARE_TEMPLATE_VALUE_DESCRIPTION_3(Impl, Type, ArgType1, Arg1, ArgType2, Arg2, ArgType3, Arg3, Enable) \ + DECLARE_TEMPLATE_VALUE_DESCRIPTION_N(Impl, Type, VD_SINGLE_ARG(ArgType1 Arg1, ArgType2 Arg2, ArgType3 Arg3), VD_SINGLE_ARG(Arg1, Arg2, Arg3), Enable) -#define DECLARE_TEMPLATE_VALUE_DESCRIPTION_5(Impl, Type, ArgType1, Arg1, ArgType2, Arg2, ArgType3, Arg3, ArgType4, Arg4, ArgType5, Arg5) \ - DECLARE_TEMPLATE_VALUE_DESCRIPTION_N(Impl, Type, VD_SINGLE_ARG(ArgType1 Arg1, ArgType2 Arg2, ArgType3 Arg3, ArgType4 Arg4, ArgType5 Arg5), VD_SINGLE_ARG(Arg1, Arg2, Arg3, Arg4, Arg5)) +#define DECLARE_TEMPLATE_VALUE_DESCRIPTION_4(Impl, Type, ArgType1, Arg1, ArgType2, Arg2, ArgType3, Arg3, ArgType4, Arg4, Enable) \ + DECLARE_TEMPLATE_VALUE_DESCRIPTION_N(Impl, Type, VD_SINGLE_ARG(ArgType1 Arg1, ArgType2 Arg2, ArgType3 Arg3, ArgType4 Arg4), VD_SINGLE_ARG(Arg1, Arg2, Arg3, Arg4), Enable) -#define DECLARE_TEMPLATE_VALUE_DESCRIPTION_6(Impl, Type, ArgType1, Arg1, ArgType2, Arg2, ArgType3, Arg3, ArgType4, Arg4, ArgType5, Arg5, ArgType6, Arg6) \ - DECLARE_TEMPLATE_VALUE_DESCRIPTION_N(Impl, Type, VD_SINGLE_ARG(ArgType1 Arg1, ArgType2 Arg2, ArgType3 Arg3, ArgType4 Arg4, ArgType5 Arg5, ArgType6 Arg6), VD_SINGLE_ARG(Arg1, Arg2, Arg3, Arg4, Arg5, Arg6)) +#define DECLARE_TEMPLATE_VALUE_DESCRIPTION_5(Impl, Type, ArgType1, Arg1, ArgType2, Arg2, ArgType3, Arg3, ArgType4, Arg4, ArgType5, Arg5, Enable) \ + DECLARE_TEMPLATE_VALUE_DESCRIPTION_N(Impl, Type, VD_SINGLE_ARG(ArgType1 Arg1, ArgType2 Arg2, ArgType3 Arg3, ArgType4 Arg4, ArgType5 Arg5), VD_SINGLE_ARG(Arg1, Arg2, Arg3, Arg4, Arg5), Enable) + +#define DECLARE_TEMPLATE_VALUE_DESCRIPTION_6(Impl, Type, ArgType1, Arg1, ArgType2, Arg2, ArgType3, Arg3, ArgType4, Arg4, ArgType5, Arg5, ArgType6, Arg6, Enable) \ + DECLARE_TEMPLATE_VALUE_DESCRIPTION_N(Impl, Type, VD_SINGLE_ARG(ArgType1 Arg1, ArgType2 Arg2, ArgType3 Arg3, ArgType4 Arg4, ArgType5 Arg5, ArgType6 Arg6), VD_SINGLE_ARG(Arg1, Arg2, Arg3, Arg4, Arg5, Arg6), Enable) @@ -330,6 +368,7 @@ PREDECLARE_VALUE_DESCRIPTION(signed long); PREDECLARE_VALUE_DESCRIPTION(unsigned long); PREDECLARE_VALUE_DESCRIPTION(signed long long); PREDECLARE_VALUE_DESCRIPTION(unsigned long long); +PREDECLARE_VALUE_DESCRIPTION(half); PREDECLARE_VALUE_DESCRIPTION(float); PREDECLARE_VALUE_DESCRIPTION(double); PREDECLARE_VALUE_DESCRIPTION(Json::Value); @@ -338,4 +377,80 @@ PREDECLARE_VALUE_DESCRIPTION(bool); template ValueDescriptionT * getDefaultDescription(T ** ptr); +// Base case where there is no default description defined, return nullptr_t +inline std::nullptr_t getDefaultDescriptionMaybe(...) +{ + return nullptr; +} + +// If there is a default description defined, return it +template +auto getDefaultDescriptionMaybe(T *) -> decltype(getDefaultDescription((T*)0)) +{ + return getDefaultDescription((T*)0); +} + +// Base case where there is no default description defined, return nullptr_t +inline std::nullptr_t getDefaultDescriptionSharedMaybe(...) +{ + return nullptr; +} + +// If there is a default description defined, return it +template +auto getDefaultDescriptionSharedMaybe(T *) -> decltype(getDefaultDescription((T*)0), getDefaultDescriptionShared((T*)0)) +{ + return getDefaultDescriptionShared((T*)0); +} + +// Base case where there is no default description defined, return nullptr_t +inline std::shared_ptr getDefaultDescriptionSharedGenericMaybe(...) +{ + return nullptr; +} + +// If there is a default description defined, return it +template +auto getDefaultDescriptionSharedGenericMaybe(T *) -> decltype(getDefaultDescriptionSharedGeneric((T*)0)) +{ + return getDefaultDescriptionSharedGeneric((T*)0); +} + +// Allow overriding based on whether a type has a default description defined or not +template +struct has_default_description_probe : std::true_type {}; + +template +struct has_default_description_probe : std::false_type {}; + +template struct has_default_description : has_default_description_probe {}; + +template +inline constexpr bool has_default_description_v = has_default_description::value; + +template +using has_default_description_t = typename has_default_description::type; + +template +struct and_base : std::false_type {}; + +template<> +struct and_base : std::true_type {}; + +template +struct all_have_default_descriptions; + +template<> +struct all_have_default_descriptions<> : std::true_type {}; + +template +struct all_have_default_descriptions + : and_base::value, has_default_description_v> {}; + +template +inline constexpr bool all_have_default_descriptions_v = all_have_default_descriptions::value; + +template +using all_have_default_descriptions_t = typename all_have_default_descriptions::type; + } // namespace MLDB diff --git a/types/vector_description.h b/types/vector_description.h index 101c73cfd..604264bb5 100644 --- a/types/vector_description.h +++ b/types/vector_description.h @@ -75,6 +75,16 @@ struct VectorDescription return val->empty(); } + virtual LengthModel getArrayLengthModel() const override + { + return LengthModel::VARIABLE; + } + + virtual OwnershipModel getArrayIndirectionModel() const override + { + return OwnershipModel::UNIQUE; + } + virtual size_t getArrayLength(void * val) const override { const std::vector * val2 = reinterpret_cast *>(val); @@ -116,6 +126,6 @@ struct VectorDescription }; -DECLARE_TEMPLATE_VALUE_DESCRIPTION_2(VectorDescription, std::vector, typename, T, typename, A); +DECLARE_TEMPLATE_VALUE_DESCRIPTION_2(VectorDescription, std::vector, typename, T, typename, A, MLDB::has_default_description::value); } // namespace MLDB From 88aa0540b8e45218bdfdc07cef15bf0403b90515 Mon Sep 17 00:00:00 2001 From: Jeremy Barnes Date: Mon, 13 Jan 2025 08:08:57 -0500 Subject: [PATCH 06/39] (NEEDS TEST) Command Expression paranthesis, improvements --- utils/command.cc | 132 ++++++++++++++++ utils/command_expression.cc | 214 +++++++++----------------- utils/command_expression.h | 256 ++++++++++++++++++++++++++++---- utils/command_expression_fwd.h | 75 ++++++++++ utils/command_expression_impl.h | 48 +++++- utils/csv.cc | 1 + 6 files changed, 557 insertions(+), 169 deletions(-) create mode 100644 utils/command_expression_fwd.h diff --git a/utils/command.cc b/utils/command.cc index b319a6af5..7b00e7ae0 100644 --- a/utils/command.cc +++ b/utils/command.cc @@ -8,6 +8,7 @@ */ #include "command.h" +#include "command_expression.h" #include "mldb/arch/exception.h" #include "mldb/types/map_description.h" #include "mldb/types/structure_description.h" @@ -100,6 +101,137 @@ shellEscape(const std::string & str) return result; } +std::string +argumentRender(const Json::Value & val) +{ + using std::to_string; + + switch (val.type()) { + case Json::nullValue: return ""; + case Json::intValue: return to_string(val.asInt()); + case Json::uintValue: return to_string(val.asUInt()); + case Json::realValue: return to_string(val.asDouble()); + case Json::booleanValue: return to_string(val.asBool()); + case Json::stringValue: return val.asString(); + case Json::arrayValue: { + std::string str; + for (auto & v: val) { + if (!str.empty()) + str += " "; + str += shellEscape(argumentRender(v)); + } + return str; + } + default: + throw MLDB::Exception("can't render value " + val.toString() + " as string"); + } +} + +namespace PluginCommand { + +std::vector +commandRender(const Json::Value & val) +{ + //cerr << "commandRender " << val << endl; + + using std::to_string; + + switch (val.type()) { + case Json::nullValue: return { "" }; + case Json::intValue: return { to_string(val.asInt()) }; + case Json::uintValue: return { to_string(val.asUInt()) }; + case Json::realValue: return { to_string(val.asDouble()) }; + case Json::booleanValue: return { to_string(val.asBool()) }; + case Json::stringValue: return { val.asString() }; + case Json::arrayValue: { + std::vector str; + for (auto & v: val) { + str.push_back(argumentRender(v)); + } + return str; + } + default: + throw MLDB::Exception("can't render value " + val.toString() + " as command"); + } +} + +/*****************************************************************************/ +/* COMMAND TEMPLATE */ +/*****************************************************************************/ + +void +CommandTemplate:: +parse(const std::string & command) +{ + ParseContext context(command, + command.c_str(), command.c_str() + command.size()); + + while (context) { + commandLine.push_back + (CommandExpression::parseExpression + (context, true /* stop on whitespace */)); + context.skip_whitespace(); + } +} + +void +CommandTemplate:: +parse(const std::vector & cmdline) +{ + for (unsigned i = 0; i < cmdline.size(); ++i) + commandLine.push_back(CommandExpression::parse(cmdline[i])); +} + +Command +CommandTemplate:: +operator () (CommandExpressionContext & context) const +{ + Command result; + + for (auto & c: commandLine) { + Json::Value r = c->apply(context); + //cerr << "result of " << c->surfaceForm << " is " << r << endl; + vector vals = commandRender(r); + result.cmdLine.insert(result.cmdLine.end(), vals.begin(), vals.end()); + } + + return result; +} + + +Command +CommandTemplate:: +operator () (const std::initializer_list > & vals) const +{ + CommandExpressionContext context(vals); + return operator () (context); +} + +#if 0 +struct CommandTemplateDescription + : public StructureDescriptionImpl { + + CommandTemplateDescription(); +}; + +inline CommandTemplateDescription * getDefaultDescription(CommandTemplate*) +{ + return new CommandTemplateDescription(); +} +#endif + +DEFINE_STRUCTURE_DESCRIPTION(CommandTemplate); + +CommandTemplateDescription:: +CommandTemplateDescription() +{ + //addField("env", &CommandTemplate::env, "expression to generate the environment"); + addField("commandLine", &CommandTemplate::commandLine, "expression to generate the command line"); +} + +} // namespace PluginCommand + + /*****************************************************************************/ /* COMMAND */ /*****************************************************************************/ diff --git a/utils/command_expression.cc b/utils/command_expression.cc index bbb47fdec..debd5d2a3 100644 --- a/utils/command_expression.cc +++ b/utils/command_expression.cc @@ -188,6 +188,29 @@ Json::Value hash(const std::vector & params) return jsonHash(params[0]); } +// ceilDiv(x, y) = ceil(x/y) +Json::Value ceilDiv(const std::vector & params) +{ + if (params.size() != 2) + throw MLDB::Exception("ceilDiv() function takes exactly two arguments"); + auto modulus = params[1].asUInt(); + if (modulus == 0) + throw MLDB::Exception("ceilDiv(): divide by zero"); + + if (params[1].isUInt()) { + auto val = params[0].asUInt(); + //cerr << "ceilDiv(" << params[0].toStringNoNewLine() << "," << params[1].toStringNoNewLine() << ") = " + // << (val + (modulus - 1)) / modulus << endl; + return (val + (modulus - 1)) / modulus; + } + if (params[1].isInt()) { + auto val = params[0].asInt(); + // hmmm... plus or minus if it's negative? + return (val + (modulus - 1)) / modulus; + } + return ceil(params[0].asDouble() / params[1].asDouble()); +} + } // file scope @@ -222,6 +245,7 @@ builtins() value->addFunction("max", jsonMaxVector); value->addFunction("flatten", flatten); value->addFunction("hash", hash); + value->addFunction("ceilDiv", ceilDiv); return value; } @@ -249,8 +273,7 @@ applyFunction(const std::string & functionName, return it->second(functionArgs); } catch (const std::exception & exc) { throw MLDB::Exception("error trying to apply %s to args %s: %s", - functionName.c_str(), - MLDB::lexical_cast(functionArgs).c_str(), + functionName.c_str(), jsonEncodeStr(functionArgs).c_str(), exc.what()); } } @@ -279,11 +302,11 @@ parse(const std::string & val) std::shared_ptr CommandExpression:: -parseArgumentExpression(const std::string & val) +parseArgumentExpression(const std::string & val, int precedence) { ParseContext context(val, val.c_str(), val.c_str() + val.length()); - auto res = parseArgumentExpression(context); + auto res = parseArgumentExpression(context, precedence); context.expect_eof(); @@ -375,7 +398,7 @@ parseExpression(ParseContext & context, bool stopOnWhitespace) std::shared_ptr CommandExpression:: -parseArgumentExpression(ParseContext & context) +parseArgumentExpression(ParseContext & context, int precedence) { ParseContext::Hold_Token token(context); @@ -387,6 +410,10 @@ parseArgumentExpression(ParseContext & context) context.skip_whitespace(); + if (context.eof()) { + context.exception("expected expression"); + } + std::shared_ptr result; if (context.match_literal('\'')) { @@ -444,6 +471,13 @@ parseArgumentExpression(ParseContext & context) } result = std::make_shared(elements); } + else if (context.match_literal('(')) { + // Parenthesis + auto contained = parseArgumentExpression(context, 0 /* precedence */); + context.skip_whitespace(); + context.expect_literal(')'); + result = std::make_shared(contained); + } else if (context.match_literal('%')) { context.exception("nested expression literals not yet supported"); } @@ -482,17 +516,17 @@ parseArgumentExpression(ParseContext & context) result = std::make_shared(expressions, applyExpr); } - else if (isalpha(*context) || *context == '_') { + else if (context && (isalpha(*context) || *context == '_')) { // Must be a variable or argument name string entityName; bool isFunction = false; vector > args; - while (isalnum(*context) || *context == '_') + while (context && (isalnum(*context) || *context == '_')) entityName += *context++; - if (*context == ' ' && false) { + if (context && *context == ' ' && false) { context.skip_whitespace(); // Expression with space separated args isFunction = true; @@ -526,14 +560,25 @@ parseArgumentExpression(ParseContext & context) else result = addContext(std::make_shared(expectJson(context))); // Now look for operators that modify the output of the previous - while (true) { + while (context) { context.skip_whitespace(); + // -> gets greedily consumed as - if we don't check here + { + ParseContext::Revert_Token token(context); + if (context.match_literal("->")) { + break; + } + } + if (context.match_literal('.')) { string fieldName; - while (isalnum(*context) || *context == '_') + while (context && (isalnum(*context) || *context == '_')) fieldName += *context++; + if (fieldName == "") + context.exception("expected field name after '.'"); + result = std::make_shared(fieldName, result); } else if (context.match_literal('[')) { @@ -542,72 +587,32 @@ parseArgumentExpression(ParseContext & context) context.skip_whitespace(); context.expect_literal(']'); } - else if (context.match_literal('+')) { - auto rhs = parseArgumentExpression(context); + else if (precedence <= 10 && context.match_literal('+')) { + auto rhs = parseArgumentExpression(context, 10); result = std::make_shared(result, rhs); } - else if (context.match_literal('/')) { - auto rhs = parseArgumentExpression(context); + else if (precedence <= 10 && context.match_literal('-')) { + auto rhs = parseArgumentExpression(context, 10); + result = std::make_shared(result, rhs); + } + else if (precedence <= 20 && context.match_literal('*')) { + auto rhs = parseArgumentExpression(context, 20); + result = std::make_shared(result, rhs); + } + else if (precedence <= 20 && context.match_literal('/')) { + auto rhs = parseArgumentExpression(context, 20); result = std::make_shared(result, rhs); } + else if (precedence <= 20 && context.match_literal('%')) { + auto rhs = parseArgumentExpression(context, 20); + result = std::make_shared(result, rhs); + } else break; } return addContext(result); } -std::string -argumentRender(const Json::Value & val) -{ - using std::to_string; - - switch (val.type()) { - case Json::nullValue: return ""; - case Json::intValue: return to_string(val.asInt()); - case Json::uintValue: return to_string(val.asUInt()); - case Json::realValue: return to_string(val.asDouble()); - case Json::booleanValue: return to_string(val.asBool()); - case Json::stringValue: return val.asString(); - case Json::arrayValue: { - std::string str; - for (auto & v: val) { - if (!str.empty()) - str += " "; - str += shellEscape(argumentRender(v)); - } - return str; - } - default: - throw MLDB::Exception("can't render value " + val.toString() + " as string"); - } -} - -std::vector -commandRender(const Json::Value & val) -{ - //cerr << "commandRender " << val << endl; - - using std::to_string; - - switch (val.type()) { - case Json::nullValue: return { "" }; - case Json::intValue: return { to_string(val.asInt()) }; - case Json::uintValue: return { to_string(val.asUInt()) }; - case Json::realValue: return { to_string(val.asDouble()) }; - case Json::booleanValue: return { to_string(val.asBool()) }; - case Json::stringValue: return { val.asString() }; - case Json::arrayValue: { - std::vector str; - for (auto & v: val) { - str.push_back(argumentRender(v)); - } - return str; - } - default: - throw MLDB::Exception("can't render value " + val.toString() + " as command"); - } -} - std::string stringRender(const Json::Value & val) { @@ -636,7 +641,7 @@ stringRender(const Json::Value & val) /*****************************************************************************/ -/* COMMAND TEMPLATE */ +/* STRING TEMPLATE */ /*****************************************************************************/ void @@ -668,81 +673,8 @@ operator () (const std::initializer_list > & } -/*****************************************************************************/ -/* COMMAND TEMPLATE */ -/*****************************************************************************/ - -void -CommandTemplate:: -parse(const std::string & command) -{ - ParseContext context(command, - command.c_str(), command.c_str() + command.size()); - - while (context) { - commandLine.push_back - (CommandExpression::parseExpression - (context, true /* stop on whitespace */)); - context.skip_whitespace(); - } -} - -void -CommandTemplate:: -parse(const std::vector & cmdline) -{ - for (unsigned i = 0; i < cmdline.size(); ++i) - commandLine.push_back(CommandExpression::parse(cmdline[i])); -} - -Command -CommandTemplate:: -operator () (CommandExpressionContext & context) const -{ - Command result; - - for (auto & c: commandLine) { - Json::Value r = c->apply(context); - //cerr << "result of " << c->surfaceForm << " is " << r << endl; - vector vals = commandRender(r); - result.cmdLine.insert(result.cmdLine.end(), vals.begin(), vals.end()); - } - - return result; -} - - -Command -CommandTemplate:: -operator () (const std::initializer_list > & vals) const -{ - CommandExpressionContext context(vals); - return operator () (context); -} - -#if 0 -struct CommandTemplateDescription - : public StructureDescriptionImpl { - - CommandTemplateDescription(); -}; - -inline CommandTemplateDescription * getDefaultDescription(CommandTemplate*) -{ - return new CommandTemplateDescription(); -} -#endif - -DEFINE_STRUCTURE_DESCRIPTION(CommandTemplate); - -CommandTemplateDescription:: -CommandTemplateDescription() -{ - //addField("env", &CommandTemplate::env, "expression to generate the environment"); - addField("commandLine", &CommandTemplate::commandLine, "expression to generate the command line"); -} - DEFINE_VALUE_DESCRIPTION_NS(std::shared_ptr, CommandExpressionDescription); +DEFINE_VALUE_DESCRIPTION_NS(std::shared_ptr, ConstCommandExpressionDescription); DEFINE_VALUE_DESCRIPTION_NS(StringTemplate, StringTemplateDescription); } // namespace PluginCommand diff --git a/utils/command_expression.h b/utils/command_expression.h index eba0fdd5f..1d31d2a5a 100644 --- a/utils/command_expression.h +++ b/utils/command_expression.h @@ -8,10 +8,16 @@ #pragma once +#include "command_expression_fwd.h" + +#include +#include +#include +#include + #include "mldb/ext/jsoncpp/json.h" #include #include "mldb/arch/exception.h" -#include #include "mldb/base/parse_context.h" #include "mldb/utils/vector_utils.h" #include "mldb/base/exc_assert.h" @@ -80,7 +86,7 @@ struct CommandExpressionVariables { } /// Outer context we look in if we don't find something here - const CommandExpressionVariables * outer; + const CommandExpressionVariables * outer = nullptr; /// Value of local variables std::map values; @@ -90,7 +96,7 @@ struct CommandExpressionVariables { bool hasValue(const std::string & name) const { - return values.count(name); + return values.count(name) || (outer && outer->hasValue(name)); } void setValue(const std::string & key, const Json::Value & val) @@ -119,9 +125,15 @@ struct CommandExpressionVariables { return it->second; } + // Need to include command_expression_impl.h if you want to use this method template void setValue(const std::string & key, const T & val); + bool hasFunction(const std::string & name) const + { + return functions.count(name) || (outer && outer->hasFunction(name)); + } + Json::Value applyFunction(const std::string & functionName, const std::vector & functionArgs) const; @@ -257,6 +269,27 @@ struct CommandExpression { } } + // Return all child clauses that make up this one. Default returns no clauses. + virtual std::vector> childClauses() const + { + return {}; + } + + // Return variables which are not set and would definitely need to be to evaluate this + // expression. + virtual std::set unknowns(const CommandExpressionVariables & knowns) const + { + std::set result; + + for (auto & clause: childClauses()) { + for (auto & var: clause->unknowns(knowns)) { + result.insert(var); + } + } + + return result; + } + // Original form that was parsed to get it... used for printing std::string surfaceForm; @@ -264,23 +297,21 @@ struct CommandExpression { parseExpression(ParseContext & context, bool stopOnWhitespace = false); static std::shared_ptr - parseArgumentExpression(ParseContext & context); + parseArgumentExpression(ParseContext & context, int precedence = 0); static std::shared_ptr parse(const std::string & val); static std::shared_ptr - parseArgumentExpression(const std::string & expr); + parseArgumentExpression(const std::string & expr, int precedence = 0); static std::shared_ptr parse(const std::vector & vals); - - }; // Convert to strings and concatenate struct ConcatExpression : public CommandExpression { - virtual std::string applyString(const CommandExpressionContext & vars) const + virtual std::string applyString(const CommandExpressionContext & vars) const override { std::string result; @@ -290,12 +321,17 @@ struct ConcatExpression : public CommandExpression { return result; } + virtual std::vector> childClauses() const override + { + return clauses; + } + std::vector > clauses; }; struct ArrayExpression: public CommandExpression { - virtual Json::Value apply(const CommandExpressionContext & vars) const + virtual Json::Value apply(const CommandExpressionContext & vars) const override { Json::Value result(Json::arrayValue); @@ -305,6 +341,11 @@ struct ArrayExpression: public CommandExpression { return result; } + virtual std::vector> childClauses() const override + { + return clauses; + } + std::vector > clauses; }; @@ -316,7 +357,7 @@ struct ObjectExpression: public CommandExpression { { } - virtual Json::Value apply(const CommandExpressionContext & vars) const + virtual Json::Value apply(const CommandExpressionContext & vars) const override { Json::Value result(Json::objectValue); @@ -326,6 +367,16 @@ struct ObjectExpression: public CommandExpression { return result; } + virtual std::vector> childClauses() const override + { + std::vector> result; + for (auto & [c1, c2]: clauses) { + result.push_back(c1); + result.push_back(c2); + } + return result;; + } + std::vector, std::shared_ptr > > clauses; }; @@ -337,7 +388,7 @@ struct LiteralExpression : public CommandExpression { { } - virtual std::string applyString(const CommandExpressionContext & vars) const + virtual std::string applyString(const CommandExpressionContext & vars) const override { return literal; } @@ -352,7 +403,7 @@ struct JsonLiteralExpression : public CommandExpression { { } - virtual Json::Value apply(const CommandExpressionContext & vars) const + virtual Json::Value apply(const CommandExpressionContext & vars) const override { return literal; } @@ -366,7 +417,7 @@ struct InlineArrayExpression: public CommandExpression { { } - virtual Json::Value apply(const CommandExpressionContext & vars) const + virtual Json::Value apply(const CommandExpressionContext & vars) const override { Json::Value result(Json::arrayValue); for (auto & e: elements) @@ -374,9 +425,33 @@ struct InlineArrayExpression: public CommandExpression { return result; } + virtual std::vector> childClauses() const override + { + return elements; + } + std::vector > elements; }; +struct ParenthesisExpression: public CommandExpression { + ParenthesisExpression(std::shared_ptr expr) + : expr(expr) + { + } + + virtual Json::Value apply(const CommandExpressionContext & vars) const override + { + return expr->apply(vars); + } + + virtual std::vector> childClauses() const override + { + return {expr}; + } + + std::shared_ptr expr; +}; + /** Expression that iterates over one or more lists and calls an inner expression on the cross product of those expressions. Eg @@ -401,7 +476,7 @@ struct MapExpression: public CommandExpression { { } - virtual Json::Value apply(const CommandExpressionContext & vars) const + virtual Json::Value apply(const CommandExpressionContext & vars) const override { Json::Value result(Json::arrayValue); @@ -432,6 +507,26 @@ struct MapExpression: public CommandExpression { } } + virtual std::vector> childClauses() const override + { + std::vector> result; + result.push_back(outputExpression); + for (auto & [name, expr]: iterExpressions) + result.push_back(expr); + return result; + } + + virtual std::set unknowns(const CommandExpressionVariables & knowns) const override + { + auto outputUnknowns = outputExpression->unknowns(knowns); + for (auto & e: iterExpressions) { + auto iterUnknowns = e.expression->unknowns(knowns); + outputUnknowns.insert(iterUnknowns.begin(), iterUnknowns.end()); + outputUnknowns.erase(e.variableName); + } + return outputUnknowns; + } + std::vector iterExpressions; std::shared_ptr outputExpression; }; @@ -450,7 +545,7 @@ struct FunctionExpression : public CommandExpression { std::vector > args; virtual Json::Value - apply(const CommandExpressionContext & context) const + apply(const CommandExpressionContext & context) const override { //std::string functionNameValue = functionName->applyString(context); @@ -460,6 +555,12 @@ struct FunctionExpression : public CommandExpression { return context.applyFunction(functionNameValue, argValues); } + + virtual std::vector> childClauses() const override + { + return args; + } + }; struct VariableExpression : public CommandExpression { @@ -471,11 +572,16 @@ struct VariableExpression : public CommandExpression { std::string variableName; - virtual Json::Value apply(const CommandExpressionContext & vars) const + virtual Json::Value apply(const CommandExpressionContext & vars) const override { return vars.getValue(variableName); } - + + virtual std::set unknowns(const CommandExpressionVariables & knowns) const override + { + if (knowns.hasValue(variableName)) return {}; + return { variableName }; + } }; struct ExtractFieldExpression: public CommandExpression { @@ -487,13 +593,18 @@ struct ExtractFieldExpression: public CommandExpression { { } - virtual Json::Value apply(const CommandExpressionContext & vars) const + virtual Json::Value apply(const CommandExpressionContext & vars) const override { return expr->apply(vars)[fieldName]; } std::string fieldName; std::shared_ptr expr; + + virtual std::vector> childClauses() const override + { + return { expr }; + } }; struct ExtractElementExpression: public CommandExpression { @@ -505,16 +616,28 @@ struct ExtractElementExpression: public CommandExpression { { } - virtual Json::Value apply(const CommandExpressionContext & vars) const + virtual Json::Value apply(const CommandExpressionContext & vars) const override { + Json::Value val = expr->apply(vars); Json::Value index = element->apply(vars); - if (index.isString()) + if (index.isString()) { + if (!val.isMember(index.asString())) + throw MLDB::Exception("couldn't find field " + index.asString()); return expr->apply(vars)[index.asString()]; + } + if (!val.isValidIndex(index.asInt())) { + throw MLDB::Exception("couldn't find field " + std::to_string(index.asInt())); + } return expr->apply(vars)[index.asInt()]; } std::shared_ptr element; std::shared_ptr expr; + + virtual std::vector> childClauses() const override + { + return { element, expr }; + } }; struct ArithmeticExpression: public CommandExpression { @@ -534,13 +657,18 @@ struct BinaryArithmeticExpression: public CommandExpression { virtual Json::Value op(const Json::Value & lhs, const Json::Value & rhs) const = 0; - virtual Json::Value apply(const CommandExpressionContext & vars) const + virtual Json::Value apply(const CommandExpressionContext & vars) const override { Json::Value l = lhs->apply(vars); Json::Value r = rhs->apply(vars); return op(l, r); } + + virtual std::vector> childClauses() const override + { + return { lhs, rhs }; + } }; struct PlusExpression: public BinaryArithmeticExpression { @@ -552,7 +680,7 @@ struct PlusExpression: public BinaryArithmeticExpression { } virtual Json::Value op(const Json::Value & lhs, - const Json::Value & rhs) const + const Json::Value & rhs) const override { if (lhs.isNumeric() && rhs.isNumeric()) { if (lhs.isDouble() || rhs.isDouble()) { @@ -576,6 +704,29 @@ struct PlusExpression: public BinaryArithmeticExpression { } }; +struct MinusExpression: public BinaryArithmeticExpression { + + MinusExpression(std::shared_ptr lhs, + std::shared_ptr rhs) + : BinaryArithmeticExpression(lhs, rhs) + { + } + + virtual Json::Value op(const Json::Value & lhs, + const Json::Value & rhs) const override + { + if (lhs.isNumeric() && rhs.isNumeric()) { + if (lhs.isDouble() || rhs.isDouble()) { + return lhs.asDouble() + rhs.asDouble(); + } + return lhs.asInt() - rhs.asInt(); + } + else throw MLDB::Exception("don't know how to subtract %s and %s", + lhs.toString().c_str(), + rhs.toString().c_str()); + } +}; + struct DivideExpression: public BinaryArithmeticExpression { DivideExpression(std::shared_ptr lhs, @@ -585,12 +736,18 @@ struct DivideExpression: public BinaryArithmeticExpression { } virtual Json::Value op(const Json::Value & lhs, - const Json::Value & rhs) const + const Json::Value & rhs) const override { if (lhs.isNumeric() && rhs.isNumeric()) { if (lhs.isDouble() || rhs.isDouble()) { + if (rhs.asDouble() == 0.0) { + throw MLDB::Exception("divide by zero"); + } return lhs.asDouble() / rhs.asDouble(); } + if (rhs.asInt() == 0) { + throw MLDB::Exception("divide by zero"); + } return lhs.asInt() / rhs.asInt(); } else throw MLDB::Exception("don't know how to divide %s by %s", @@ -599,7 +756,51 @@ struct DivideExpression: public BinaryArithmeticExpression { } }; -PREDECLARE_VALUE_DESCRIPTION(std::shared_ptr); +struct ModulusExpression: public BinaryArithmeticExpression { + + ModulusExpression(std::shared_ptr lhs, + std::shared_ptr rhs) + : BinaryArithmeticExpression(lhs, rhs) + { + } + + virtual Json::Value op(const Json::Value & lhs, + const Json::Value & rhs) const override + { + if (lhs.isNumeric() && rhs.isNumeric()) { + if (rhs.asInt() == 0) { + throw MLDB::Exception("divide by zero in modulus"); + } + return lhs.asInt() % rhs.asInt(); + } + else throw MLDB::Exception("don't know how to take %s modulo %s", + lhs.toString().c_str(), + rhs.toString().c_str()); + } +}; + +struct TimesExpression: public BinaryArithmeticExpression { + + TimesExpression(std::shared_ptr lhs, + std::shared_ptr rhs) + : BinaryArithmeticExpression(lhs, rhs) + { + } + + virtual Json::Value op(const Json::Value & lhs, + const Json::Value & rhs) const override + { + if (lhs.isNumeric() && rhs.isNumeric()) { + if (lhs.isDouble() || rhs.isDouble()) { + return lhs.asDouble() * rhs.asDouble(); + } + return lhs.asInt() * rhs.asInt(); + } + else throw MLDB::Exception("don't know how to multiply %s by %s", + lhs.toString().c_str(), + rhs.toString().c_str()); + } +}; /** Renders the given JSON expression as a shell command. */ std::vector commandRender(const Json::Value & val); @@ -655,8 +856,6 @@ struct StringTemplate { std::string operator () (const std::initializer_list > & vals) const; }; -PREDECLARE_VALUE_DESCRIPTION(StringTemplate); - inline std::ostream & operator << (std::ostream & stream, const StringTemplate & tmpl) { return stream << tmpl.toString(); @@ -710,5 +909,10 @@ struct CommandTemplate { DECLARE_STRUCTURE_DESCRIPTION(CommandTemplate); } // namespace PluginCommand + +using PluginCommand::CommandExpression; +using PluginCommand::CommandExpressionContext; +using PluginCommand::CommandExpressionVariables; + } // namespace MLDB diff --git a/utils/command_expression_fwd.h b/utils/command_expression_fwd.h new file mode 100644 index 000000000..98bb98279 --- /dev/null +++ b/utils/command_expression_fwd.h @@ -0,0 +1,75 @@ +/* command_expression.h -*- C++ -*- + Jeremy Barnes, 27 August 2013 + This file is part of MLDB. Copyright 2015 mldb.ai inc. All rights reserved. + + Template for a command that can be reconstituted with calculated + arguments. +*/ + +#pragma once + +#include +#include "mldb/types/value_description_fwd.h" +#include + +namespace MLDB { + +namespace PluginCommand { + +struct CommandExpressionVariables; + +typedef std::function &)> + CommandExpressionFunction; + +/** Renders the given JSON expression as a string. */ +std::string stringRender(const Json::Value & val); + +struct CommandExpressionContext; + +struct CommandExpression; + +struct ConcatExpression; +struct ArrayExpression; +struct ObjectExpression; +struct LiteralExpression; +struct JsonLiteralExpression; +struct InlineArrayExpression; +struct ParenthesisExpression; +struct MapExpression; +struct FunctionExpression; +struct VariableExpression; +struct ExtractFieldExpression; +struct ExtractElementExpression; +struct ArithmeticExpression; +struct BinaryArithmeticExpression; +struct PlusExpression; +struct MinusExpression; +struct DivideExpression; +struct ModulusExpression; +struct TimesExpression; + +PREDECLARE_VALUE_DESCRIPTION(std::shared_ptr); +PREDECLARE_VALUE_DESCRIPTION(std::shared_ptr); + +/** Renders the given JSON expression as a shell command. */ +std::vector commandRender(const Json::Value & val); + + +struct StringTemplate; +PREDECLARE_VALUE_DESCRIPTION(StringTemplate); + +std::ostream & operator << (std::ostream & stream, const StringTemplate & tmpl); + + +struct CommandTemplate; + +DECLARE_STRUCTURE_DESCRIPTION(CommandTemplate); + +} // namespace PluginCommand + +using PluginCommand::CommandExpression; +using PluginCommand::CommandExpressionContext; +using PluginCommand::CommandExpressionVariables; + +} // namespace MLDB + diff --git a/utils/command_expression_impl.h b/utils/command_expression_impl.h index 7888bb644..ac2080ba7 100644 --- a/utils/command_expression_impl.h +++ b/utils/command_expression_impl.h @@ -214,17 +214,61 @@ bindFunction(const std::function & fn) struct CommandExpressionDescription : public ValueDescriptionT > { + virtual bool isDefaultTyped(const std::shared_ptr * val) const override + { + return !(*val); + } + virtual void parseJsonTyped(std::shared_ptr * val, - JsonParsingContext & context) const + JsonParsingContext & context) const override { + if (context.isNull()) { + *val = nullptr; + return; + } std::string str = context.expectStringAscii(); ParseContext pcontext(str, str.c_str(), str.c_str() + str.size()); *val = CommandExpression::parseExpression(pcontext, false); } virtual void printJsonTyped(const std::shared_ptr * val, - JsonPrintingContext & context) const + JsonPrintingContext & context) const override + { + if (!(*val)) { + context.writeNull(); + return; + } + context.writeString((*val)->surfaceForm); + } +}; + +struct ConstCommandExpressionDescription + : public ValueDescriptionT > { + + virtual bool isDefaultTyped(const std::shared_ptr * val) const override + { + return !(*val); + } + + virtual void parseJsonTyped(std::shared_ptr * val, + JsonParsingContext & context) const override + { + if (context.isNull()) { + *val = nullptr; + return; + } + std::string str = context.expectStringAscii(); + ParseContext pcontext(str, str.c_str(), str.c_str() + str.size()); + *val = CommandExpression::parseExpression(pcontext, false); + } + + virtual void printJsonTyped(const std::shared_ptr * val, + JsonPrintingContext & context) const override { + if (!(*val)) { + context.writeNull(); + return; + } context.writeString((*val)->surfaceForm); } }; diff --git a/utils/csv.cc b/utils/csv.cc index 55434b0c7..9f507c913 100644 --- a/utils/csv.cc +++ b/utils/csv.cc @@ -11,6 +11,7 @@ #include "mldb/base/parse_context.h" #include "mldb/arch/format.h" #include "mldb/utils/vector_utils.h" +#include "mldb/utils/ostream_vector.h" using namespace std; From 1719be1979b733409378ad213fe5503f08ce0e6d Mon Sep 17 00:00:00 2001 From: Jeremy Barnes Date: Mon, 13 Jan 2025 08:09:49 -0500 Subject: [PATCH 07/39] EnvOption: from anything string constructible (TRIVIAL) --- utils/environment.h | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/utils/environment.h b/utils/environment.h index 2b798ea1f..17339c519 100644 --- a/utils/environment.h +++ b/utils/environment.h @@ -63,6 +63,14 @@ inline bool from_string(const std::string & s, bool *) return from_string(s, (int *)0); } +// Anything that is constructible from a string can be passed +template +inline T from_string(const std::string & s, T *, decltype(T(s)) * = nullptr) +{ + return T(s); +} + + /*****************************************************************************/ /* ENV_OPTION */ /*****************************************************************************/ From fb5cd57479446e7395ee19cd2c9cd623cafc0deb Mon Sep 17 00:00:00 2001 From: Jeremy Barnes Date: Mon, 13 Jan 2025 08:36:29 -0500 Subject: [PATCH 08/39] Moved ostream_* back into namespace std (TRIVIAL) --- utils/ostream_array.h | 9 ++++++++- utils/ostream_set.h | 12 +++++++++++- utils/ostream_span.h | 8 +++++++- utils/ostream_vector.h | 10 ++++++++++ utils/vector_utils.h | 11 +---------- 5 files changed, 37 insertions(+), 13 deletions(-) diff --git a/utils/ostream_array.h b/utils/ostream_array.h index a49a62718..86ba555a7 100644 --- a/utils/ostream_array.h +++ b/utils/ostream_array.h @@ -1,3 +1,10 @@ +/* ostream_vector.h -*- C++ -*- + Jeremy Barnes, 6 November 2015 + Copyright (c) 2015 mldb.ai inc. All rights reserved. + + This file is part of MLDB. Copyright 2015 mldb.ai inc. All rights reserved. +*/ + #pragma once #include @@ -16,4 +23,4 @@ operator << (std::ostream & stream, const std::array & a) return stream << " ]"; } -} // namespace std \ No newline at end of file +} // namespace std diff --git a/utils/ostream_set.h b/utils/ostream_set.h index ffd3cd02a..f31d764a0 100644 --- a/utils/ostream_set.h +++ b/utils/ostream_set.h @@ -1,8 +1,16 @@ +/* ostream_set.h -*- C++ -*- + Jeremy Barnes, 6 November 2015 + Copyright (c) 2015 mldb.ai inc. All rights reserved. + + This file is part of MLDB. Copyright 2015 mldb.ai inc. All rights reserved. +*/ #pragma once #include #include +namespace std { + template std::ostream & operator << (std::ostream & stream, const std::set & s) @@ -11,4 +19,6 @@ operator << (std::ostream & stream, const std::set & s) for (const auto & e: s) stream << " " << e; return stream << " }"; -} \ No newline at end of file +} + +} // namespace std \ No newline at end of file diff --git a/utils/ostream_span.h b/utils/ostream_span.h index 77c3ae268..27f48e9b1 100644 --- a/utils/ostream_span.h +++ b/utils/ostream_span.h @@ -1,3 +1,10 @@ +/* ostream_span.h -*- C++ -*- + Jeremy Barnes, 6 November 2015 + Copyright (c) 2015 mldb.ai inc. All rights reserved. + + This file is part of MLDB. Copyright 2015 mldb.ai inc. All rights reserved. +*/ + #pragma once #include @@ -12,4 +19,3 @@ operator << (std::ostream & stream, const std::span & s) stream << " " << e; return stream << " ]"; } - diff --git a/utils/ostream_vector.h b/utils/ostream_vector.h index 0d36c386e..c32c769f5 100644 --- a/utils/ostream_vector.h +++ b/utils/ostream_vector.h @@ -1,8 +1,17 @@ +/* ostream_vector.h -*- C++ -*- + Jeremy Barnes, 6 November 2015 + Copyright (c) 2015 mldb.ai inc. All rights reserved. + + This file is part of MLDB. Copyright 2015 mldb.ai inc. All rights reserved. +*/ + #pragma once #include #include +namespace std { + template std::ostream & operator << (std::ostream & stream, const std::vector & v) @@ -13,3 +22,4 @@ operator << (std::ostream & stream, const std::vector & v) return stream << " ]"; } +} // namespace std diff --git a/utils/vector_utils.h b/utils/vector_utils.h index c65c4b400..fb02bf20c 100644 --- a/utils/vector_utils.h +++ b/utils/vector_utils.h @@ -15,6 +15,7 @@ #include #include +#include "ostream_vector.h" namespace MLDB { @@ -115,16 +116,6 @@ void make_vector_set(std::vector & vec) namespace std { -template -std::ostream & -operator << (std::ostream & stream, const vector & vec) -{ - stream << "["; - for (unsigned i = 0; i < vec.size(); ++i) - stream << " " << vec[i]; - return stream << " ]"; -} - template std::string to_string(const vector & vec) From b5fb0883a14a9e7e77ef3502a21d9889d2046dbe Mon Sep 17 00:00:00 2001 From: Jeremy Barnes Date: Mon, 13 Jan 2025 08:39:09 -0500 Subject: [PATCH 09/39] Extra tests for utils functionality (TRIVIAL) --- utils/testing/lexical_cast_test.cc | 5 + utils/testing/safe_clamp_test.cc | 153 +++++++++++++++++++++++++++++ utils/testing/testing.mk | 1 + 3 files changed, 159 insertions(+) create mode 100644 utils/testing/safe_clamp_test.cc diff --git a/utils/testing/lexical_cast_test.cc b/utils/testing/lexical_cast_test.cc index 932648696..359fff942 100644 --- a/utils/testing/lexical_cast_test.cc +++ b/utils/testing/lexical_cast_test.cc @@ -116,6 +116,10 @@ TEST_CASE("to string") CHECK(do_lexical_cast(123.456) == "123.456"); CHECK(do_lexical_cast(-123.456) == "-123.456"); CHECK(do_lexical_cast(1.234567890123456789) == "1.2345678901234567"); + CHECK(do_lexical_cast(45000.0) == "45000"); + CHECK( lexical_cast(45678.90) == "45678.9"); + CHECK( lexical_cast(0.00045) == "0.00045"); + CHECK( lexical_cast(1.00045) == "1.00045"); CHECK(do_lexical_cast(INFINITY) == "inf"); CHECK(do_lexical_cast(-INFINITY) == "-inf"); CHECK(do_lexical_cast(NAN) == "nan"); @@ -144,6 +148,7 @@ TEST_CASE("to string") CHECK( lexical_cast(123.456f) == "123.456"); CHECK( lexical_cast(-123.456f) == "-123.456"); CHECK( lexical_cast(1.234567890123456789f) == "1.2345679"); + CHECK(do_lexical_cast(45000.0f) == "45000"); CHECK(do_lexical_cast(float(INFINITY)) == "inf"); CHECK(do_lexical_cast(float(-INFINITY)) == "-inf"); CHECK(do_lexical_cast(float(NAN)) == "nan"); diff --git a/utils/testing/safe_clamp_test.cc b/utils/testing/safe_clamp_test.cc new file mode 100644 index 000000000..6599dd695 --- /dev/null +++ b/utils/testing/safe_clamp_test.cc @@ -0,0 +1,153 @@ +#include "catch2/catch_all.hpp" +#include "mldb/utils/safe_clamp.h" +#include "mldb/arch/demangle.h" +#include +#include + +using namespace std; +using namespace MLDB; + +template +struct ConvertibleLimits { + static constexpr Float min = static_cast(std::numeric_limits::min()); + static constexpr Float max = static_cast(std::numeric_limits::max()); +}; + +template<> +struct ConvertibleLimits { + static constexpr double min = -0x1p+63; + static constexpr double max = 0x1.fffffffffffffp+62; +}; + +template<> +struct ConvertibleLimits { + static constexpr double min = 0; + static constexpr double max = 0x1.fffffffffffffp+63; +}; + +template<> +struct ConvertibleLimits { + static constexpr float min = -0x1p+63; + static constexpr float max = 0x1.fffffep+62; +}; + +template<> +struct ConvertibleLimits { // here + static constexpr float min = 0; + static constexpr float max = 0x1.fffffep+63; +}; + +template<> +struct ConvertibleLimits { + static constexpr float min = -0x1p+31; + static constexpr float max = 0x1.fffffep+30; +}; + +template<> +struct ConvertibleLimits { + static constexpr float min = 0; + static constexpr float max = 0x1.fffffep+31; +}; + +#if 0 +template struct IntUnderlyingFloat; +template<> struct IntUnderlyingFloat { using type = int64_t; }; +template<> struct IntUnderlyingFloat { using type = int32_t; }; + +template struct DoubleIntUnderlyingFloat; +template<> struct DoubleIntUnderlyingFloat { using type = __int128; }; +template<> struct DoubleIntUnderlyingFloat { using type = int64_t; }; + +template +void find_min_max() +{ + using Limits = ConvertibleLimits; + static_assert(Int(Limits::min) >= std::numeric_limits::min()); + static_assert(Int(Limits::max) <= std::numeric_limits::max()); + + using FloatInt = typename IntUnderlyingFloat::type; + using DoubleFloatInt = typename DoubleIntUnderlyingFloat::type; + + union { + FloatInt i; + Float f; + } min, max; + + min.f = static_cast(std::numeric_limits::min()); + max.f = static_cast(std::numeric_limits::max()); + + // Find the highest float that converts to max + for (;;) { + DoubleFloatInt i = max.f; + if (i > DoubleFloatInt(std::numeric_limits::max())) + --max.i; + else break; + } + + // Find the lowest float that converts to min + for (;;) { + DoubleFloatInt i = min.f; + if (i < DoubleFloatInt(std::numeric_limits::min())) + --min.i; + else break; + } + + cerr << demangle(typeid(Float).name()) << " to " << demangle(typeid(Int).name()) << ": min " << std::setprecision(24) << std::scientific << std::hexfloat << min.f << endl; + cerr << demangle(typeid(Float).name()) << " to " << demangle(typeid(Int).name()) << ": max " << std::setprecision(24) << std::scientific << std::hexfloat << max.f << endl; +} +#endif + +template struct DoubleIntUnderlyingFloat; +template<> struct DoubleIntUnderlyingFloat { using type = __int128; }; +template<> struct DoubleIntUnderlyingFloat { using type = int64_t; }; + +template +struct Checker { + static void check() + { + // If not specialized, there is no way that it can be out of range so it's moot + if (!FloatIntegerClamper::specialized) + return; + + std::string section = demangle(typeid(F).name()) + " -> " + demangle(typeid(I).name()); + using DI = __int128;//typename DoubleIntUnderlyingFloat::type; + + SECTION(section) { + //cerr << "type " << section << endl; + //cerr << "range " << hex << std::numeric_limits::min() << " to " << std::numeric_limits::max() << dec << endl; + //cerr << "max = " << hex << int64_t(FloatIntegerClamper::max) << dec << endl; + CHECK(DI(FloatIntegerClamper::max) <= std::numeric_limits::max()); + CHECK(DI(std::nextafter(FloatIntegerClamper::max, INFINITY)) > DI(std::numeric_limits::max())); + if (std::numeric_limits::min() < 0) { + CHECK(DI(FloatIntegerClamper::min) >= std::numeric_limits::min()); + CHECK(DI(std::nextafter(FloatIntegerClamper::min, -INFINITY)) < std::numeric_limits::min()); + } + } + } +}; + +#define TEST_TYPES int64_t, uint64_t, int32_t, uint32_t, int16_t, uint16_t, int8_t, uint8_t + +TEMPLATE_TEST_CASE("safe float conversion limits", "[none]", TEST_TYPES) +{ + Checker::check(); + Checker::check(); +} + +template +void do_safe_int_conversion_test() +{ + SECTION("to " + demangle(typeid(Float).name())) { + CHECK(safe_clamp(INFINITY) == std::numeric_limits::max()); + CHECK(safe_clamp(0) == 0); + CHECK(safe_clamp(-INFINITY) == std::numeric_limits::min()); + } +} + +TEMPLATE_TEST_CASE("safe int conversion", "[none]", TEST_TYPES) +{ + //find_min_max(); + //find_min_max(); + do_safe_int_conversion_test(); + do_safe_int_conversion_test(); +} diff --git a/utils/testing/testing.mk b/utils/testing/testing.mk index 3312d4eb2..890e1d770 100644 --- a/utils/testing/testing.mk +++ b/utils/testing/testing.mk @@ -39,3 +39,4 @@ $(eval $(call test,floating_point_test,utils log arch base,boost)) $(eval $(call test,string_algorithm_test,base utils arch base value_description,catch2)) $(eval $(call test,lexical_cast_test,arch types value_description,catch2)) +$(eval $(call test,safe_clamp_test,utils log arch,catch2)) From 0178dac480fdbab010f536a26df8f910af568e86 Mon Sep 17 00:00:00 2001 From: Jeremy Barnes Date: Mon, 13 Jan 2025 08:41:57 -0500 Subject: [PATCH 10/39] possibly_dynamic_buffer spans (TRIVIAL) --- utils/possibly_dynamic_buffer.h | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/utils/possibly_dynamic_buffer.h b/utils/possibly_dynamic_buffer.h index b3889222f..6b700f48a 100644 --- a/utils/possibly_dynamic_buffer.h +++ b/utils/possibly_dynamic_buffer.h @@ -7,6 +7,7 @@ #pragma once #include +#include namespace MLDB { @@ -37,13 +38,16 @@ struct PossiblyDynamicBuffer { } } - size_t size_; - bool onStack() const { return size_ <= MAX_STACK_ENTRIES; } T * data() { return onStack() ? stackEntries: heapEntries; } const T * data() const { return onStack() ? stackEntries: heapEntries; } size_t size() const { return size_; } + + operator std::span () const { return { data(), size() }; } + + const T * begin() const { return data(); } + const T * end() const { return data() + size(); } T * begin() { return data(); } T * end() { return data() + size(); } @@ -59,6 +63,8 @@ struct PossiblyDynamicBuffer { return data()[el]; } + size_t size_; + union { T stackEntries[MAX_STACK_ENTRIES]; T * heapEntries; From 5a364e2d211ae10ff0fecea7d3beb0c33201bb30 Mon Sep 17 00:00:00 2001 From: Jeremy Barnes Date: Mon, 13 Jan 2025 09:34:58 -0500 Subject: [PATCH 11/39] for_each_line improved blocking/compressor support --- block/content_descriptor.cc | 25 +- block/testing/content_descriptor_test.cc | 37 ++ builtin/fetcher.cc | 3 +- sql/builtin_functions.cc | 4 +- utils/for_each_line.cc | 413 ++++++++++++----------- utils/for_each_line.h | 109 +++++- utils/testing/testing.mk | 1 - utils/utils.mk | 3 +- vfs/compressibility.cc | 77 +++++ vfs/compressibility.h | 27 ++ vfs/compressor.cc | 39 ++- vfs/compressor.h | 15 +- vfs/filter_streams.cc | 100 +++++- vfs/filter_streams.h | 35 +- vfs/lz4.cc | 36 +- vfs/testing/compressor_test.cc | 25 ++ vfs/testing/filter_streams_test.cc | 90 +++-- vfs/vfs.mk | 2 + vfs/zstandard.cc | 142 +++++++- 19 files changed, 925 insertions(+), 258 deletions(-) create mode 100644 vfs/compressibility.cc create mode 100644 vfs/compressibility.h diff --git a/block/content_descriptor.cc b/block/content_descriptor.cc index 31db91372..ec2af1c31 100644 --- a/block/content_descriptor.cc +++ b/block/content_descriptor.cc @@ -460,13 +460,22 @@ getStream(const std::map & options) const //cerr << "url = " << descriptor.getUrlStringUtf8() << " compression = " // << compression << " mapped = " << isMapped << endl; - if (isMapped) { + while (isMapped) { // actually an if, but now we can break out // Just get one single big block auto contentHandler = getContent(descriptor); struct Vals { FsObjectInfo info; FrozenMemoryRegion mem; + +#if 0 + ~Vals() + { + cerr << endl << endl << endl; + cerr << "NO MORE MAPPING VALS" << endl; + cerr << endl << endl << endl; + } +#endif }; auto vals = std::make_shared(); @@ -493,7 +502,10 @@ getStream(const std::map & options) const vals->mem.length()); if (outputSize < 0) { - throw Exception("decompressed size unknown"); + if (outputSize == Decompressor::LENGTH_UNKNOWN) + break; // do as an istream as we can't run the splitting algorithm + + throw Exception("decompressed size unknown: %i", (int)outputSize); } static MemorySerializer serializer; @@ -546,10 +558,8 @@ getStream(const std::map & options) const filter_istream stream(handler, descriptor.getUrlString(), options2); return stream; } - else { - // Not mapped. We go block by block. - } - + + // Not mapped. We go block by block. filter_istream result(descriptor.getUrlStringUtf8(), options2); return result; } @@ -639,8 +649,9 @@ struct UrlContentHandler { const char * data; size_t len; + size_t capacity; - std::tie(data, len) = stream.mapped(); + std::tie(data, len, capacity) = stream.mapped(); if (data && length) { if (length == -1) length = len - offset; diff --git a/block/testing/content_descriptor_test.cc b/block/testing/content_descriptor_test.cc index add992d84..4f91610e0 100644 --- a/block/testing/content_descriptor_test.cc +++ b/block/testing/content_descriptor_test.cc @@ -147,3 +147,40 @@ BOOST_AUTO_TEST_CASE( test_compressed_random_access ) { } + +BOOST_AUTO_TEST_CASE( test_parallel_decompress_zstd ) +{ + string input_file = "mldb_test_data/reviews_Digital_Music_5.json.zstd"; + ContentDescriptor descriptor = jsonDecode("file://" + input_file); + std::shared_ptr handler = getDecompressedContent(descriptor); + + std::atomic numBlocks{0}, totalLength{0}, numParallel{0}, maxNumParallel{0}; + + auto onBlock = [&] (size_t blockNum, uint64_t blockOffset, + FrozenMemoryRegion block) + { + auto par = numParallel.fetch_add(1) + 1; + auto mnp = maxNumParallel.load(); + while (par > mnp && !maxNumParallel.compare_exchange_weak(mnp, std::max(mnp, par))) + ; + + numBlocks.fetch_add(1); + totalLength.fetch_add(block.length()); + + std::this_thread::sleep_for(std::chrono::milliseconds(1)); + + //cerr << "got block " << blockNum << " from " << blockOffset << " of length " << block.length() << endl; + + numParallel.fetch_sub(1); + return true; + }; + + handler->forEachBlockParallel(0, 1024 * 1024 /* requested block size */, 16 /* maxParallelism */, onBlock); + + cerr << "maxNumParallel = " << maxNumParallel << endl; + + BOOST_CHECK_EQUAL(numBlocks, 679); + BOOST_CHECK_EQUAL(totalLength, 88964528); + BOOST_CHECK_EQUAL(numParallel, 0); + BOOST_CHECK_GT(maxNumParallel, 1); +} diff --git a/builtin/fetcher.cc b/builtin/fetcher.cc index 5a09cc617..11f8f6d87 100644 --- a/builtin/fetcher.cc +++ b/builtin/fetcher.cc @@ -150,7 +150,8 @@ struct FetcherFunction: public ValueFunctionT { const char * mappedAddr; size_t mappedSize; - std::tie(mappedAddr, mappedSize) = stream.mapped(); + size_t mappedCapacity; + std::tie(mappedAddr, mappedSize, mappedCapacity) = stream.mapped(); CellValue blob; if (mappedAddr) { diff --git a/sql/builtin_functions.cc b/sql/builtin_functions.cc index 542eef3d6..e341aadba 100644 --- a/sql/builtin_functions.cc +++ b/sql/builtin_functions.cc @@ -3637,7 +3637,9 @@ BoundFunction fetcher(const std::vector & args) const char * mappedAddr; size_t mappedSize; - std::tie(mappedAddr, mappedSize) = stream.mapped(); + size_t mappedCapacity; + + std::tie(mappedAddr, mappedSize, mappedCapacity) = stream.mapped(); CellValue blob; if (mappedAddr) { diff --git a/utils/for_each_line.cc b/utils/for_each_line.cc index 37ff071a8..a147e31de 100644 --- a/utils/for_each_line.cc +++ b/utils/for_each_line.cc @@ -26,6 +26,17 @@ using namespace std; using moodycamel::BlockingConcurrentQueue; +namespace MLDB { + +const NewlineSplitter newLineSplitter; + +std::span +BlockSplitter:: +fixupBlock(std::span block) const +{ + return block; +} + namespace { struct Processing { @@ -58,8 +69,6 @@ struct Processing { } // file scope -namespace MLDB { - /*****************************************************************************/ /* PARALLEL LINE PROCESSOR */ @@ -254,10 +263,12 @@ void forEachLineBlock(std::istream & stream, int64_t maxLines, int maxParallelism, std::function startBlock, - std::function endBlock) + std::function endBlock, + const BlockSplitter & splitter) { //static constexpr int64_t BLOCK_SIZE = 100000000; // 100MB blocks - static constexpr int64_t BLOCK_SIZE = 20000000; // 20MB blocks + //static constexpr int64_t BLOCK_SIZE = 20000000; // 20MB blocks + int64_t BLOCK_SIZE = 20000000; static constexpr int64_t READ_SIZE = 200000; // read&scan 200kb to fit in cache std::atomic doneLines(0); //number of lines processed but not yet returned @@ -270,6 +281,7 @@ void forEachLineBlock(std::istream & stream, // Memory map if possible const char * mapped = nullptr; size_t mappedSize = 0; + size_t mappedCapacity = 0; filter_istream * fistream = dynamic_cast(&stream); @@ -277,7 +289,12 @@ void forEachLineBlock(std::istream & stream, // Can we get a memory mapped version of our stream? It // saves us having to copy data. mapped will be set to // nullptr if it's not possible to memory map this stream. - std::tie(mapped, mappedSize) = fistream->mapped(); + std::tie(mapped, mappedSize, mappedCapacity) = fistream->mapped(); + auto info = fistream->info(); + if (info.size > 0) { + BLOCK_SIZE = std::max(1000000, info.size / maxParallelism); + BLOCK_SIZE = std::min(BLOCK_SIZE, 20000000); + } } //cerr << "mapped = " << (void *)mapped << endl; @@ -287,17 +304,24 @@ void forEachLineBlock(std::istream & stream, std::atomic hasExc(false); std::exception_ptr exc; + std::any splitterState = splitter.newState(); + + // These are used to pass leftover data from the previous block to the next + // one + std::shared_ptr nextBlock; + size_t nextBlockSize = 0; + size_t nextBlockUsed = 0; + std::function doBlock = [&] () { std::shared_ptr blockOut; - int64_t startOffset = byteOffset; + //int64_t startOffset = byteOffset; int64_t startLine = doneLines; vector lineOffsets = {0}; bool lastBlock = false; size_t myChunkNumber = 0; - try { //MLDB-1426 if (mapped) { @@ -310,11 +334,14 @@ void forEachLineBlock(std::istream & stream, while (current && current < end && (current - start) < BLOCK_SIZE && (maxLines == -1 || doneLines < maxLines)) { //stop processing new line when we have enough) - current = (const char *)memchr(current, '\n', end - current); - if (current && current < end) { - ExcAssertEqual(*current, '\n'); + std::tie(current, splitterState) + = splitter.nextBlock(current, end - current, nullptr, 0, + true /* no more data */, splitterState); + if (current) { lineOffsets.push_back(current - start); ++doneLines; + if (current == end) + break; ++current; } } @@ -341,39 +368,46 @@ void forEachLineBlock(std::istream & stream, blockOut = std::shared_ptr(start, [] (const char *) {}); } - else { + else { // not memory mapped // How far through our block are we? - size_t offset = 0; - // How much extra space to allocate for the last line? - static constexpr size_t EXTRA_SIZE = 10000; + std::shared_ptr block = nextBlock; + size_t blockSize = nextBlockSize; + size_t blockUsed = nextBlockUsed; + + if (!block) { + block = std::shared_ptr(new char[BLOCK_SIZE], [] (char * c) { delete[] c; }); + blockSize = BLOCK_SIZE; + blockUsed = 0; + } - std::shared_ptr block(new char[BLOCK_SIZE + EXTRA_SIZE], - [] (char * c) { delete[] c; }); blockOut = block; + size_t offset = blockUsed; // First line starts at offset 0 while (stream && !stream.eof() && (maxLines == -1 || doneLines < maxLines) //stop processing new line when we have enough - && (byteOffset - startOffset < BLOCK_SIZE)) { + && (offset < blockSize)) { stream.read((char *)block.get() + offset, - std::min(READ_SIZE, BLOCK_SIZE - offset)); + std::min(READ_SIZE, blockSize - offset)); // Check how many bytes we actually read size_t bytesRead = stream.gcount(); offset += bytesRead; - // Scan for end of line characters + // Scan for the end of the block const char * current = block.get() + lineOffsets.back(); const char * end = block.get() + offset; while (current && current < end) { - current = (const char *)memchr(current, '\n', end - current); + std::tie(current, splitterState) + = splitter.nextBlock(current, end - current, nullptr, 0, + stream.eof(), splitterState); if (current && current < end) { - ExcAssertEqual(*current, '\n'); + //ExcAssertEqual(*current, '\n'); if (lineOffsets.back() != current - block.get()) { lineOffsets.push_back(current - block.get()); ++doneLines; @@ -385,81 +419,66 @@ void forEachLineBlock(std::istream & stream, byteOffset += bytesRead; } - if (stream.eof()) { +#if 0 // If we are at the end of the stream - // make sure we include the last line + // make sure we include the last line // if there was no newline if (lineOffsets.back() != offset - 1) { lineOffsets.push_back(offset); ++doneLines; } +#endif } else { - // If we are not at the end of the stream - // get the last line, as we probably got just a partial - // line in the last one - std::string lastLine; - getline(stream, lastLine); - - if (!lastLine.empty()) { - // Check for overflow on the buffer size - if (offset + lastLine.size() + 1 > BLOCK_SIZE + EXTRA_SIZE) { - // reallocate and copy - std::shared_ptr newBlock(new char[offset + lastLine.size() + 1], - [] (char * c) { delete[] c; }); - std::copy(block.get(), block.get() + offset, - newBlock.get()); - block = newBlock; - blockOut = block; - } - - std::copy(lastLine.data(), lastLine.data() + lastLine.length(), - block.get() + offset); - - lineOffsets.emplace_back(offset + lastLine.length()); - ++doneLines; - offset += lastLine.size() + 1; - } + // Package up the leftover (truncated) block for the next + // block. + nextBlockUsed = offset - lineOffsets.back(); + if (lineOffsets.size() == 1) + nextBlockSize = blockSize + nextBlockUsed; + else nextBlockSize = BLOCK_SIZE + nextBlockUsed; + + nextBlock = std::shared_ptr(new char[nextBlockSize], + [] (char * c) { delete[] c; }); + std::copy(block.get() + lineOffsets.back(), block.get() + offset, + nextBlock.get()); } myChunkNumber = chunkNumber++; - if (stream && !stream.eof() && - (maxLines == -1 || doneLines < maxLines)) // don't schedule a new block if we have enough lines + if (stream && !stream.eof() + && (maxLines == -1 || doneLines < maxLines)) // don't schedule a new block if we have enough lines { // Ready for another chunk tp.add(doBlock); } else if (stream.eof()) { - lastBlock = true; + lastBlock = true; + } } - } - int64_t chunkLineNumber = startLine; - size_t lastLineOffset = lineOffsets[0]; + int64_t chunkLineNumber = startLine; + size_t lastLineOffset = lineOffsets[0]; - if (startBlock) - if (!startBlock(myChunkNumber, chunkLineNumber)) - return; + if (startBlock) + if (!startBlock(myChunkNumber, chunkLineNumber)) + return; - for (unsigned i = 1; i < lineOffsets.size() && (maxLines == -1 || returnedLines++ < maxLines); ++i) { - if (hasExc.load(std::memory_order_relaxed)) - return; - const char * line = blockOut.get() + lastLineOffset; - size_t len = lineOffsets[i] - lastLineOffset; + for (unsigned i = 1; i < lineOffsets.size() && (maxLines == -1 || returnedLines++ < maxLines); ++i) { + if (hasExc.load(std::memory_order_relaxed)) + return; + const char * line = blockOut.get() + lastLineOffset; + size_t len = lineOffsets[i] - lastLineOffset; - // Skip \r for DOS line endings - if (len > 0 && line[len - 1] == '\r') - --len; + auto fixedup = splitter.fixupBlock({line, len}); - // if we are not at the last line - if (!lastBlock || len != 0 || i != lineOffsets.size() - 1) - if (!onLine(line, len, chunkNumber, chunkLineNumber++)) - return; - - lastLineOffset = lineOffsets[i] + 1; + // if we are not at the last line + if (!lastBlock || fixedup.size() != 0 || i != lineOffsets.size() - 1) + if (!onLine(fixedup.data(), fixedup.size(), chunkNumber, chunkLineNumber++)) + return; + + lastLineOffset = lineOffsets[i]; - } + } if (endBlock) if (!endBlock(myChunkNumber, chunkLineNumber)) @@ -485,7 +504,6 @@ void forEachLineBlock(std::istream & stream, } } - /*****************************************************************************/ /* FOR EACH LINE BLOCK (CONTENT HANDLER) */ /*****************************************************************************/ @@ -503,7 +521,8 @@ void forEachLineBlock(std::shared_ptr content, uint64_t numLines)> startBlock, std::function endBlock, - size_t blockSize) + size_t blockSize, + const BlockSplitter & splitter) { std::atomic hasExc(false); std::exception_ptr exc; @@ -514,6 +533,7 @@ void forEachLineBlock(std::shared_ptr content, FrozenMemoryRegion leftoverFromPreviousBlock; uint64_t doneLines = 0; bool bail = false; ///< Should we bail out (stop) immediately? + std::any splitterState; }; // Set of queues, one per block, that grows with the amount of data @@ -535,7 +555,7 @@ void forEachLineBlock(std::shared_ptr content, auto doBlock - = [&hasExc,&exc,maxLines,&onLine,&startBlock,&endBlock,&getQueues] + = [&hasExc,&exc,maxLines,&onLine,&startBlock,&endBlock,&getQueues, &splitter] (int chunkNumber, uint64_t offset, FrozenMemoryRegion mem) -> bool @@ -551,7 +571,7 @@ void forEachLineBlock(std::shared_ptr content, FrozenMemoryRegion partialLastLine; // Offset in otherLines of line start characters - vector lineOffsets; + vector> lines; // What we got from the last block PassToNextBlock fromPrev; @@ -564,44 +584,22 @@ void forEachLineBlock(std::shared_ptr content, // safe to call at any time, including before the next block has // been launched and after the next block has already been told to // do something else. - auto bailNextBlock = [&] () { + auto bailNextBlock = [&] () + { PassToNextBlock toNext; toNext.bail = true; toNextQueue->enqueue(std::move(toNext)); }; - try { - //cerr << endl << endl - // << "------------- starting block " << chunkNumber - // << " at offset " - // << offset << endl; - //cerr << "with " << leftoverFromPreviousBlock.length() - // << " characters leftover" << endl; - //hex_dump(leftoverFromPreviousBlock.data(), - // leftoverFromPreviousBlock.length()); - //cerr << "getting block at offset " << offset - // << " with " << leftoverFromPreviousBlock.length() - // << " bytes left over" << endl; - - //Date start = Date::now(); - - //Date gotData = Date::now(); - - //double elapsed = gotData.secondsSince(start); - - //cerr << " chunk " << chunkNumber << " got " - // << mem.length() << " bytes in " << elapsed << " seconds" - // << " at " << mem.length() / elapsed / 1000000 << " MB/s" - // << endl; - - //cerr << "got " << mem.length() << " bytes at " - // << (void *)mem.data() << endl; - - //hex_dump(mem.data(), mem.length()); - + if (splitter.isStateless()) { +#if 0 // can scan before previous block is finished (TODO: re-enable) + std::any splitterState; size_t length = mem.length(); const char * start = mem.data(); - const char * current = length == 0 ? start : (const char *)memchr(start, '\n', length); + const char * current = start; + if (length > 0) { + std::tie(current, splitterState) = splitter.nextBlock(start, length, nullptr, 0, splitterState); + } const char * end = start + length; size_t numLinesInBlock = 0; @@ -642,7 +640,7 @@ void forEachLineBlock(std::shared_ptr content, return false; } - current = (const char *)memchr(current, '\n', end - current); + std::tie(current, splitterState) = splitter.nextBlock(current, end - current, nullptr, 0, splitterState); //cerr << " current now = " << (void *)current << endl; @@ -658,24 +656,16 @@ void forEachLineBlock(std::shared_ptr content, ++current; } } - - // Whatever is left over is the last line, which we pass - // through to the next block - if (!current && mem) { - //cerr << "lastLineStart - start = " - // << lastLineStart - start << endl; - //cerr << "mem.length() = " << mem.length() << endl; - partialLastLine = mem.range(lastLineStart - start, - mem.length()); - //cerr << "partial last line" << endl; - } } - +#endif + } + + try { if (hasExc.load(std::memory_order_relaxed)) { bailNextBlock(); return false; } - + fromPrevQueue->wait_dequeue(fromPrev); // Do we bail out? If our previous block says it has bailed, @@ -685,47 +675,118 @@ void forEachLineBlock(std::shared_ptr content, return false; } - // Now we have information from the previous block, we can reconstruct - // our first line and know our real line numbers FrozenMemoryRegion leftoverFromPreviousBlock = std::move(fromPrev.leftoverFromPreviousBlock); int64_t startLine = fromPrev.doneLines; - uint64_t doneLines = startLine + numLinesInBlock; - - if (noBreakInChunk && mem) { - // No line break in the whole chunk; it's all a partial - // last line - partialLastLine - = FrozenMemoryRegion::combined - (leftoverFromPreviousBlock, - mem); + std::any splitterState = std::move(fromPrev.splitterState); + + //cerr << "processing block with " << leftoverFromPreviousBlock.length() + // << " and " << mem.length() << " bytes and splitter " << type_name(splitter) << endl; + + const char * start1 = leftoverFromPreviousBlock.data(); + const char * end1 = start1 + leftoverFromPreviousBlock.length(); + const char * start2 = mem.data(); + const char * end2 = start2 + mem.length(); + const char * current = start1 == end1 ? start2 : start1; + FrozenMemoryRegion leftover; + FrozenMemoryRegion firstRecord; + bool noMoreData = mem.length() == 0; // We signal the last block by sending over a null block + + //cerr << "leftoverFromPreviousBlock.length() = " << leftoverFromPreviousBlock.length() << endl; + //cerr << "mem.length() = " << mem.length() << endl; + + if (noMoreData && leftoverFromPreviousBlock.length() != 0) { + //cerr << "doing last line" << endl; + auto [newCurrent, newState] = splitter.nextBlock(start1, end1 - start1, nullptr, 0, + true /* noMoreData */, splitterState); + + //cerr << "newCurrent = " << (const void *)newCurrent << endl; + //cerr << "current = " << (const void *)current << endl; + //cerr << "start1 = " << (const void *)start1 << endl; + //cerr << "end1 = " << (const void *)end1 << endl; + //cerr << "start2 = " << (const void *)start2 << endl; + //cerr << "end2 = " << (const void *)end2 << endl; + + //cerr << "newCurrent = " << (const void *)newCurrent << endl; + if (!newCurrent) { + newCurrent = end1; + // Pass on the partial record; the underlying logic can decide if it's valid or not + //throw MLDB::Exception("File is truncated in the middle of a record at last line"); + } + ExcAssertEqual((const void *)newCurrent, (const void *)end1); + lines.emplace_back(start1, end1 - start1); + //cerr << "got last line " << string(firstRecord.data(), firstRecord.length()) << endl; + current = 0; } - else if (mem) { - firstLine - = FrozenMemoryRegion::combined - (leftoverFromPreviousBlock, - mem.range(0, charsUntilFirstLineBreak)); + + // Scan the combined leftover and new blocks, normally it should only be once + // to complete the partial last record. + while (current && current >= start1 && current < end1) { + ExcAssert(start2 != 0); + //cerr << "doing current line" << endl; + auto [newCurrent, newState] = splitter.nextBlock(current, end1 - current, start2, end2 - start2, noMoreData, splitterState); + if (!newCurrent) { + // No break in the whole lot... it's all a partial record + leftover = FrozenMemoryRegion::combined(leftoverFromPreviousBlock, mem); + current = nullptr; + break; + } + + if (newCurrent >= start1 && newCurrent < end1) { + lines.emplace_back(current, newCurrent - current); + } + else { + if (newCurrent < start2 || newCurrent > end2) { + cerr << "newCurrent = " << (const void *)newCurrent << endl; + cerr << "current = " << (const void *)current << endl; + cerr << "start1 = " << (const void *)start1 << endl; + cerr << "end1 = " << (const void *)end1 << endl; + cerr << "start2 = " << (const void *)start2 << endl; + cerr << "end2 = " << (const void *)end2 << endl; + } + ExcAssertGreaterEqual((const void *)newCurrent, (const void *)start2); + ExcAssertLessEqual((const void *)newCurrent, (const void *)end2); + //cerr << "doing combined" << endl; + firstRecord = FrozenMemoryRegion::combined(leftoverFromPreviousBlock, mem.rangeAtStart(newCurrent - start2)); + lines.emplace_back(firstRecord.data(), firstRecord.length()); + } + //cerr << "got first line " << string(lines.back().data(), lines.back().size()) << endl; + current = newCurrent; + splitterState = std::move(newState); } - else { - firstLine = std::move(leftoverFromPreviousBlock); - if (firstLine.length() == 0) - return false; + + // Scan the current block + while (current && current >= start2 && current < end2) { + auto [newCurrent, newState] = splitter.nextBlock(current, end2 - current, nullptr, 0, noMoreData, splitterState); + if (!newCurrent) { + // We've gotten all we can + leftover = mem.rangeAtEnd(end2 - current); + current = nullptr; + break; + } + lines.emplace_back(current, newCurrent - current); + //cerr << "got line " << string(current, newCurrent) << endl; + ExcAssertGreater((const void *)newCurrent, (const void *)current); + current = newCurrent; + splitterState = std::move(newState); } - if (maxLines == -1 || doneLines < maxLines) { + //cerr << "done " << lines.size() << " lines" << endl; + //cerr << "leftover.length() = " << leftover.length() << endl; - //cerr << "sending on partial last line with " - // << partialLastLine.length() << " characters" - // << endl; - //hex_dump(partialLastLine.data(), - // partialLastLine.length()); + if (hasExc.load(std::memory_order_relaxed)) { + bailNextBlock(); + return false; + } + uint64_t doneLines = startLine + lines.size(); + if (maxLines == -1 || doneLines < maxLines) { // What we pass on to the next block PassToNextBlock toNext; - toNext.leftoverFromPreviousBlock - = std::move(partialLastLine); + toNext.leftoverFromPreviousBlock = std::move(leftover); toNext.doneLines = doneLines; + toNext.splitterState = std::move(splitterState); toNextQueue->enqueue(std::move(toNext)); } else { @@ -733,16 +794,15 @@ void forEachLineBlock(std::shared_ptr content, } int64_t chunkLineNumber = startLine; - size_t numLines = (firstLine ? 1 : 0) - + (lineOffsets.empty() ? 0 : lineOffsets.size() - 1); + size_t numLines = lines.size(); auto doLine = [&] (const char * line, size_t len) { - // Skip \r for DOS line endings - if (len > 0 && line[len - 1] == '\r') - --len; + //cerr << "doLine: " << string(line, len) << endl; + auto fixedup = splitter.fixupBlock({line, len}); + //cerr << "fixedup: " << string(fixedup.data(), fixedup.size()) << endl; - return onLine(line, len, chunkNumber, chunkLineNumber++); + return onLine(fixedup.data(), fixedup.size(), chunkNumber, chunkLineNumber++); }; if (startBlock) @@ -751,39 +811,17 @@ void forEachLineBlock(std::shared_ptr content, auto returnedLines = startLine; - if (firstLine) { - //cerr << "doing first line" << endl; - if (maxLines == -1 || returnedLines++ < maxLines) { - if (!doLine(firstLine.data(), firstLine.length())) { - return false; - } - } - } - - if (!lineOffsets.empty()) { - size_t lastLineOffset = lineOffsets[0]; - - for (unsigned i = 1; - i < lineOffsets.size() - && (maxLines == -1 || returnedLines++ < maxLines); - ++i) { - - // Check for exception bailout every 256 lines - if (i % 256 == 0 - && hasExc.load(std::memory_order_relaxed)) - return false; + for (unsigned i = 0; i < lines.size() && (maxLines == -1 || returnedLines++ < maxLines); ++i) { + //cerr << "i = " << i << " maxLines = " << maxLines << " returnedLines = " << returnedLines << endl; + // Check for exception bailout every 256 lines + if (i % 256 == 0 && hasExc.load(std::memory_order_relaxed)) + return false; - const char * line = mem.data() + lastLineOffset; - size_t len = lineOffsets[i] - lastLineOffset; + const char * line = lines[i].data(); + size_t len = lines[i].size(); - //cerr << "doing other line " << i << " with " - // << len << " chars" << endl; - - if (!doLine(line, len)) - return false; - - lastLineOffset = lineOffsets[i] + 1; // skip \n - } + if (!doLine(line, len)) + return false; } if (endBlock) @@ -809,6 +847,7 @@ void forEachLineBlock(std::shared_ptr content, // Unblock the first block by writing to it PassToNextBlock pass; pass.doneLines = 0; + pass.splitterState = splitter.newState(); queues[0]->enqueue(std::move(pass)); content->forEachBlockParallel(startOffset, blockSize, maxParallelism, doBlock); @@ -842,7 +881,6 @@ void forEachLineBlock(std::shared_ptr content, } } #endif - } // If there was an exception, rethrow it rather than returning @@ -853,7 +891,6 @@ void forEachLineBlock(std::shared_ptr content, } - /*****************************************************************************/ /* FOR EACH CHUNK */ /*****************************************************************************/ diff --git a/utils/for_each_line.h b/utils/for_each_line.h index b010ceda6..d8f8046ad 100644 --- a/utils/for_each_line.h +++ b/utils/for_each_line.h @@ -14,11 +14,114 @@ #include #include #include +#include +#include +#include namespace MLDB { struct ContentHandler; +/* Structure that encapsulates logic to split a block of memory into separate + * chunks that can be handled in parallel. The simplest is to split per line + * of text, but this interface allows state to be carried around which allows + * for other splitting schemes that can handle quoted or structured records + * like CSV and JSON. + */ +struct BlockSplitter { + virtual ~BlockSplitter() = default; + virtual std::any newState() const = 0; + virtual bool isStateless() const { return false; }; + virtual size_t requiredBlockPadding() const { return 0; } + virtual std::pair + nextBlock(const char * block1, size_t n1, const char * block2, size_t n2, + bool noMoreData, const std::any & state) const = 0; + virtual std::span fixupBlock(std::span block) const; +}; + +/* BlockSplitter with a specific state type. */ +template +struct BlockSplitterT: public BlockSplitter { + virtual ~BlockSplitterT() = default; + virtual State newStateT() const { return State(); } + virtual std::pair + nextBlockT(const char * block1, size_t n1, const char * block2, size_t n2, + bool noMoreData, const State & state) const = 0; + virtual std::any newState() const override + { + return newStateT(); + } + virtual std::pair + nextBlock(const char * block1, size_t n1, const char * block2, size_t n2, + bool noMoreData, const std::any & state) const override + { + const State & stateT = std::any_cast(state); + auto [newPos, newState] = nextBlockT(block1, n1, block2, n2, noMoreData, stateT); + return { newPos, std::move(newState) }; + }; +}; + +/* BlockSplitter with no state. */ +template<> +struct BlockSplitterT: public BlockSplitter { + virtual ~BlockSplitterT() = default; + virtual std::any newState() const override + { + return {}; + } + virtual bool isStateless() const override { return true; }; + virtual const char * + nextBlockT(const char * block1, size_t n1, const char * block2, size_t n2, + bool noMoreData) const = 0; + virtual std::pair + nextBlock(const char * block1, size_t n1, const char * block2, size_t n2, + bool noMoreData, const std::any & state) const override + { + auto newPos = nextBlockT(block1, n1, block2, n2, noMoreData); + return { newPos, {} }; + }; +}; + +/* BlockSplitter that splits on the newline character. */ +struct NewlineSplitter: public BlockSplitterT { + virtual const char * + nextBlockT(const char * block1, size_t n1, const char * block2, size_t n2, + bool noMoreData) const override + { + auto result = (const char *)memchr(block1, '\n', n1); + if (!result && block2) + result = (const char *)memchr(block2, '\n', n2); + + // Found a newline, skip it and return + if (result) + return result + 1; + + // No newline but EOF, return up to the last character + if (noMoreData) + return n2 ? block2 + n2 : block1 + n1; + + // No newline and not EOF, we need more data + return nullptr; + } + + static std::span removeNewlines(std::span block) + { + const char * p = block.data(); + const char * e = p + block.size(); + if (e > p && e[-1] == '\n') --e; + if (e > p && e[-1] == '\r') --e; + return { p, size_t(e - p) }; + } + + virtual std::span fixupBlock(std::span block) const override + { + return removeNewlines(block); + } +}; + +/* Instance of the newline splitter that we can use for default reference arguments. */ +extern const NewlineSplitter newLineSplitter; + /** Run the given lambda over every line read from the stream, with the work distributed over the given number of threads. @@ -122,7 +225,8 @@ void forEachLineBlock(std::istream & stream, std::function startBlock = nullptr, std::function endBlock - = nullptr); + = nullptr, + const BlockSplitter & splitter = newLineSplitter); /** Run the given lambda over every line read from the file, with the work distributed over threads each of which receive one block. The @@ -154,7 +258,8 @@ void forEachLineBlock(std::shared_ptr content, std::function endBlock = nullptr, - size_t blockSize = 20'000'000); + size_t blockSize = 20'000'000, + const BlockSplitter & splitter = newLineSplitter); /** Run the given lambda over fixed size chunks read from the stream, in parallel as much as possible. If there is a smaller chunk at the end (EOF is obtained), diff --git a/utils/testing/testing.mk b/utils/testing/testing.mk index 890e1d770..335ee1031 100644 --- a/utils/testing/testing.mk +++ b/utils/testing/testing.mk @@ -36,7 +36,6 @@ $(eval $(call test,csv_parsing_test,arch utils base,boost)) $(eval $(call test,round_test,,boost)) $(eval $(call test,for_each_line_test,utils log arch base block types value_description vfs,boost)) $(eval $(call test,floating_point_test,utils log arch base,boost)) - $(eval $(call test,string_algorithm_test,base utils arch base value_description,catch2)) $(eval $(call test,lexical_cast_test,arch types value_description,catch2)) $(eval $(call test,safe_clamp_test,utils log arch,catch2)) diff --git a/utils/utils.mk b/utils/utils.mk index 3a02391da..7ad8690f0 100644 --- a/utils/utils.mk +++ b/utils/utils.mk @@ -24,7 +24,8 @@ LIBUTILS_LINK := \ arch \ base \ types \ - $(STD_FILESYSTEM_LIBNAME) + value_description \ + $(STD_FILESYSTEM_LIBNAME) \ $(eval $(call library,utils,$(LIBUTILS_SOURCES),$(LIBUTILS_LINK))) diff --git a/vfs/compressibility.cc b/vfs/compressibility.cc new file mode 100644 index 000000000..255a32cee --- /dev/null +++ b/vfs/compressibility.cc @@ -0,0 +1,77 @@ +/* compressibility.cc -*- C++ -*- + Jeremy Barnes, 6 November 2015 + Copyright (c) 2015 mldb.ai inc. All rights reserved. + + This file is part of MLDB. Copyright 2015 mldb.ai inc. All rights reserved. + + Enables MIN_LIMIT and MAX_LIMIT which automatically take on the type of their context. +*/ + +#include "compressibility.h" +#include "compressor.h" + +namespace MLDB { + +namespace { + +static constexpr const char * COMPRESSIBILITY_COMPRESSOR = "zstd"; +static constexpr int COMPRESSIBILITY_LEVEL = 9; + +std::unique_ptr createCompressor() +{ + return std::unique_ptr + (Compressor::create(COMPRESSIBILITY_COMPRESSOR, COMPRESSIBILITY_LEVEL)); +} + +size_t calcZstdHeaderLength() +{ + auto compressor = createCompressor(); + + size_t compressedBytes = 0; + auto onData = [&] (const char *, size_t len) + { + compressedBytes += len; + return len; + }; + compressor->finish(onData); + return compressedBytes; +} + +size_t zstdHeaderLength() +{ + static const size_t result = calcZstdHeaderLength(); + return result; +} + +} // fiel scope + +CompressibilityStats calc_compressibility(const void * data, size_t numBytes) +{ + auto compressor = createCompressor(); + + size_t compressedBytes = 0; + auto onData = [&] (const char *, size_t len) + { + compressedBytes += len; + return len; + }; + + using namespace std; + if (numBytes > 0) + compressor->compress((const char *)data, numBytes, onData); + compressor->finish(onData); + + CompressibilityStats result{ numBytes, compressedBytes - zstdHeaderLength(), 1.0 * (compressedBytes - zstdHeaderLength()) / numBytes }; + + return result; +} + +CompressibilityStats & CompressibilityStats::operator += (const CompressibilityStats & other) +{ + bytesUncompressed += other.bytesUncompressed; + bytesCompressed += other.bytesCompressed; + compressionRatio = 1.0 * bytesCompressed / bytesUncompressed; + return *this; +} + +} // namespace MLDB diff --git a/vfs/compressibility.h b/vfs/compressibility.h new file mode 100644 index 000000000..339aac058 --- /dev/null +++ b/vfs/compressibility.h @@ -0,0 +1,27 @@ +/* compressibility.h -*- C++ -*- + Jeremy Barnes, 6 November 2015 + Copyright (c) 2015 mldb.ai inc. All rights reserved. + + This file is part of MLDB. Copyright 2015 mldb.ai inc. All rights reserved. + + Compressibility function. +*/ +#pragma once + +#include + +namespace MLDB { + +struct CompressibilityStats { + size_t bytesUncompressed; + size_t bytesCompressed; + double compressionRatio; + + CompressibilityStats & operator += (const CompressibilityStats & other); +}; + +CompressibilityStats calc_compressibility(const void * data, size_t numBytes); + +std::ostream & operator << (std::ostream & stream, const CompressibilityStats & stats); + +} // namespace MLDB diff --git a/vfs/compressor.cc b/vfs/compressor.cc index ee8b6f566..da7f88b94 100644 --- a/vfs/compressor.cc +++ b/vfs/compressor.cc @@ -13,6 +13,7 @@ #include #include #include "mldb/base/thread_pool.h" +#include using namespace std; @@ -44,6 +45,20 @@ std::map decompressors; } // file scope +bool +Compressor:: +canFixupLength() const +{ + return false; +} + +std::string +Compressor:: +newHeaderForLength(uint64_t lengthWritten) const +{ + throw MLDB::Exception("Attempt to call newHeaderForLength for class that doesn't support it"); +} + std::string Compressor:: filenameToCompression(const Utf8String & filename) @@ -174,7 +189,23 @@ forEachBlockParallel(size_t requestedBlockSize, std::shared_ptr buf; ThreadWorkGroup tp(maxParallelism); - + + // We queue them up as we want to ensure they run in sequence + std::mutex jobsMutex; + std::deque jobs; + + auto doOne = [&] () + { + ThreadJob job; + { + std::unique_lock guard{jobsMutex}; + ExcAssert(!jobs.empty()); + job = std::move(jobs.front()); + jobs.pop_front(); + } + job(); + }; + while (std::get<0>((std::tie(buf, numChars) = getData(requestedBlockSize)))) { auto onData = [&] (std::shared_ptr data, size_t len) -> size_t { @@ -195,7 +226,11 @@ forEachBlockParallel(size_t requestedBlockSize, }; if (maxParallelism > 0) { - tp.add(std::move(doBlock)); + { + std::unique_lock guard{jobsMutex}; + jobs.push_back(std::move(doBlock)); + } + tp.add(doOne); } else { doBlock(); diff --git a/vfs/compressor.h b/vfs/compressor.h index b75bab73d..bdf4dd86f 100644 --- a/vfs/compressor.h +++ b/vfs/compressor.h @@ -45,7 +45,7 @@ struct Compressor { passed to compress. Some of the compression formats can put this into their header to enable better decisions on allocation. - This must be called either never or ponce before compress(), flush() or + This must be called either never or once before compress(), flush() or finish(), and behavior is undefined if the exact same amount of data is not then passed to compress(). @@ -70,6 +70,19 @@ struct Compressor { */ virtual void finish(const OnData & onData) = 0; + /** Returns true if the compressor is able to write a new header with + a fixed-up length once closed. + + Default implementation returns false. + */ + virtual bool canFixupLength() const; + + /** Return a new header that will overwrite the one written before. The + * new header MUST have the same length as the old one. Will only be + * called if canFixupLength() returns true. + */ + virtual std::string newHeaderForLength(uint64_t lengthWritten) const; + /** Convert a filename to a compression scheme. Returns the empty string if it isn't found. */ diff --git a/vfs/filter_streams.cc b/vfs/filter_streams.cc index 93d368fc1..d71f83002 100644 --- a/vfs/filter_streams.cc +++ b/vfs/filter_streams.cc @@ -32,7 +32,9 @@ #include "mldb/base/exc_assert.h" #include "mldb/utils/lexical_cast.h" #include "mldb/utils/split.h" +#include "mldb/arch/vm.h" +#include using namespace std; @@ -72,9 +74,19 @@ UriHandler(std::streambuf * buf, struct BoostCompressor: public boost::iostreams::multichar_output_filter { - BoostCompressor(Compressor * compressor) - : compressor(compressor) + BoostCompressor(Compressor * compressor, std::streambuf & buf) + : compressor(compressor), buf(buf) { + // Record the start position so that once we know the actual written + // size we can go back and rewrite the header wiht the right size. + if (compressor->canFixupLength()) { + try { + MLDB_TRACE_EXCEPTIONS(false); + startPos = buf.pubseekoff(0, ios::cur, ios_base::in); + } catch (std::ios_base::failure exc) { + startPos = -1; + } + } } template @@ -86,6 +98,7 @@ struct BoostCompressor: public boost::iostreams::multichar_output_filter { data += written; size -= written; + bytesWritten += written; } } @@ -99,19 +112,40 @@ struct BoostCompressor: public boost::iostreams::multichar_output_filter { }; compressor->compress(s, n, onData); + bytesRead += n; return n; } template void close(Sink& sink) { + if (alreadyClosed) + return; + auto onData = [&] (const char * data, size_t len) -> size_t { writeAll(sink, data, len); return len; }; + if (bytesRead == 0) { + compressor->notifyInputSize(0); + } compressor->finish(onData); + + if (bytesRead != 0 && startPos != -1 && compressor->canFixupLength()) { + std::string data = compressor->newHeaderForLength(bytesRead); + { + std::ostream stream(&buf); + auto oldPos = stream.tellp(); + stream.seekp(startPos, std::ios::beg); + stream.write(data.data(), data.size()); + stream.flush(); + stream.seekp(oldPos, std::ios::beg); + } + } + + alreadyClosed = true; } template @@ -127,6 +161,11 @@ struct BoostCompressor: public boost::iostreams::multichar_output_filter { } std::shared_ptr compressor; + std::streambuf & buf; + uint64_t bytesWritten = 0; + uint64_t bytesRead = 0; + int64_t startPos = -1; + bool alreadyClosed = false; }; @@ -318,7 +357,7 @@ filter_ostream:: close(); } catch (...) { - cerr << "~filter_ostream: ignored exception\n"; + cerr << "~filter_ostream: ignored exception\n" + MLDB::getExceptionString() + "\n"; } } @@ -358,7 +397,7 @@ void addCompression(streambuf & buf, = Compressor::create(compression, compressionLevel); if (!compressor) throw MLDB::Exception("unknown filter compression " + compression); - stream.push(BoostCompressor(compressor)); + stream.push(BoostCompressor(compressor, buf)); } else { std::string compressionFromFilename @@ -368,7 +407,7 @@ void addCompression(streambuf & buf, = Compressor::create(compressionFromFilename, compressionLevel); if (!compressor) throw MLDB::Exception("unknown filter compression " + compression); - stream.push(BoostCompressor(compressor)); + stream.push(BoostCompressor(compressor, buf)); } } } @@ -631,11 +670,11 @@ close() { if (stream) { boost::iostreams::flush(*stream); - boost::iostreams::close(*stream); + //boost::iostreams::close(*stream); // will be called on stream.reset(); } + stream.reset(); exceptions(ios::goodbit); rdbuf(0); - stream.reset(); sink.reset(); options.clear(); if (deferredExcPtr) { @@ -962,11 +1001,11 @@ fork(const std::map & options) const return result; } -std::pair +std::tuple filter_istream:: mapped() const { - return { handlerOptions.mapped, handlerOptions.mappedSize }; + return { handlerOptions.mapped, handlerOptions.mappedSize, handlerOptions.mappedCapacity }; } FsObjectInfo @@ -1061,13 +1100,50 @@ struct RegisterFileHandler { } else { try { - mapped_file_source source(resource.rawString()); + // Here is where we stick things we need to + using KeepMeAround = std::vector>; + auto keepMe = std::make_shared(); + + mapped_file_params params(resource.rawString()); + mapped_file_source source(params); + + //cerr << "mapped file at " << (void *)source.data() << endl; + + size_t capacity = roundUpToPageSize(info.size); + if (capacity - info.size < MAPPING_EXTRA_CAPACITY) { + void * hint = (void *)(source.data() + capacity); + // Attempt to map a guard page + std::shared_ptr addr + (mmap(hint, page_size, + PROT_READ, MAP_PRIVATE | MAP_ANON, -1, 0), + [=] (void * p) { munmap(p, page_size); }); + + if (addr.get() == MAP_FAILED) { + throw Exception + ("Failed to open memory map file: " + + string(strerror(errno))); + } + if (addr.get() != (source.data() + capacity)) { + cerr << "addr.get() = " << (void *)addr.get() << endl; + cerr << "hint = " << hint << endl; + cerr << "couldn't map guard page or didn't map at the right address" << endl; + } + else { + keepMe->emplace_back(std::move(addr)); + capacity += page_size; + } + } + shared_ptr buf(new stream_buffer(source)); UriHandlerOptions options; options.mapped = source.data(); - options.mappedSize = source.size(); - return UriHandler(buf.get(), buf, info, options); + options.mappedSize = info.size; + options.mappedCapacity = capacity; + + keepMe->emplace_back(buf); + + return UriHandler(buf.get(), std::move(keepMe), info, options); } catch (const std::exception & exc) { throw MLDB::Exception("Opening file " + resource + ": " + exc.what()); diff --git a/vfs/filter_streams.h b/vfs/filter_streams.h index e50cda680..2971d1056 100644 --- a/vfs/filter_streams.h +++ b/vfs/filter_streams.h @@ -24,6 +24,10 @@ namespace MLDB { struct FsObjectInfo; // Structure for file system or URL metadata; in fs_utils.h +// We always attempt to map this number of extra zero bytes beyond the end +// of a memory mapping so that algorithms that need to read beyond the end +// for efficiency reasons can do so without copying the whole memory buffer. +constexpr size_t MAPPING_EXTRA_CAPACITY = 64; /*****************************************************************************/ /* BASE STRUCTURES */ @@ -38,23 +42,16 @@ UriForkFunction; /// Structure that provides extra options about a URI handler struct UriHandlerOptions { - UriHandlerOptions() - : isForwardSeekable(false), - isRandomSeekable(false), - mapped(nullptr), - mappedSize(0) - { - } - - bool isForwardSeekable; ///< Can we seek forwards in the stream? - bool isRandomSeekable; ///< Can we seek at random in the stream? + bool isForwardSeekable = false; ///< Can we seek forwards in the stream? + bool isRandomSeekable = false; ///< Can we seek at random in the stream? /// Function used to fork the handler. If null, forking is not possible UriForkFunction fork; - /// If it's a mapped stream, returns the location and size - const char * mapped; - size_t mappedSize; + /// If it's a mapped stream, returns the location and size as well as the readable capacity + const char * mapped = nullptr; + size_t mappedSize = 0; + size_t mappedCapacity = 0; }; struct UriHandler { @@ -310,8 +307,18 @@ class filter_istream : public std::istream { they have this available. If it's not mapped, it will return (nullptr, 0). + + It returns { data, size, capacity }. The third capacity value + needs some explanation. It is the amount of data beyond the + end of the mapping that can be safely read (the values will be + zero). It will always be at least as large as size. Some + algorithms need to be able to read beyond the end for performance + reasons or otherwise are required to copy their data into a + padded buffer; knowing the extra capacity allows them to avoid + doing so. The system will always make a best effort to allocate + MAPPING_EXTRA_CAPACITY bytes beyond the end. */ - std::pair + std::tuple mapped() const; /** Return the information and metadata about the underlying object, diff --git a/vfs/lz4.cc b/vfs/lz4.cc index 46c3304ff..3a23e03a4 100644 --- a/vfs/lz4.cc +++ b/vfs/lz4.cc @@ -159,6 +159,19 @@ struct MLDB_PACKED Header return sizeof(*this); } + std::string asString(uint64_t lengthWritten) + { + std::string result; + const std::function onData + = [&] (const char * data, size_t len) -> size_t + { + result.append(data, len); + return len; + }; + write(onData, lengthWritten); + return result; + } + uint8_t checksumOptions(const uint64_le & knownContentSize) const { if (contentSize()) { @@ -200,7 +213,7 @@ struct Lz4Compressor : public Compressor { typedef Compressor::FlushLevel FlushLevel; Lz4Compressor(int level, uint8_t blockSizeId = 7, - uint64_t contentSize = 0) + uint64_t contentSize = -1) : head(blockSizeId, true /* independent blocks */, false /* block checksum */, @@ -231,16 +244,30 @@ struct Lz4Compressor : public Compressor { virtual void notifyInputSize(uint64_t inputSize) override { if (!writeHeader) { - throw Exception("lz4 input size already notified"); + throw Exception("lz4 input size notified too late"); } head.setContentSize(true); this->contentSize = inputSize; } - + + virtual bool canFixupLength() const override + { + return true; + } + + virtual std::string newHeaderForLength(uint64_t lengthWritten) const override + { + lz4::Header fixedHeader = this->head; + fixedHeader.setContentSize(lengthWritten); + std::string result = fixedHeader.asString(lengthWritten); + return result; + } + virtual void compress(const char * s, size_t n, const OnData & onData) override { if (writeHeader) { + auto asStringDebug = head.asString(contentSize); head.write(onData, contentSize); writeHeader = false; } @@ -765,8 +792,7 @@ struct Lz4Decompressor: public Decompressor { uint64_le knownContentSize = 0; uint8_t checkBits = 0; uint32_le blockHeader = 0; - uint32_t blockLength() const { return blockHeader & ~lz4::NotCompressedMask; } -; + uint32_t blockLength() const { return blockHeader & ~lz4::NotCompressedMask; }; std::shared_ptr blockData; uint32_le blockChecksum = 0; uint32_le streamChecksum = 0; diff --git a/vfs/testing/compressor_test.cc b/vfs/testing/compressor_test.cc index 32640912b..035e9a197 100644 --- a/vfs/testing/compressor_test.cc +++ b/vfs/testing/compressor_test.cc @@ -89,3 +89,28 @@ BOOST_AUTO_TEST_CASE( test_compress_decompress_lz4_content_size ) BOOST_CHECK_EQUAL(size, stream2.readAll().length()); } + +BOOST_AUTO_TEST_CASE( test_compress_decompress_zstd_content_size ) +{ + string input_file = "mldb/vfs/testing/filter_streams_test.cc"; + string output_file = "tmp/compressor_test.zstd"; + string zstd_cmd = binDir / string("zstd -f " + input_file + " -o " + output_file); + + Scope_Exit(::unlink(output_file.c_str())); + system(zstd_cmd); + + std::ifstream stream(output_file.c_str()); + + char buf[200]; + stream.read(buf, 200); + + int numRead = stream.gcount(); + + auto decomp = Decompressor::create("zstd"); + + auto size = decomp->decompressedSize(buf, numRead, -1 /* total len unknown */); + + filter_istream stream2(output_file); + + BOOST_CHECK_EQUAL(size, stream2.readAll().length()); +} diff --git a/vfs/testing/filter_streams_test.cc b/vfs/testing/filter_streams_test.cc index 0f5dd0652..cf27f88c6 100644 --- a/vfs/testing/filter_streams_test.cc +++ b/vfs/testing/filter_streams_test.cc @@ -29,7 +29,10 @@ #include "mldb/base/scope.h" #include "mldb/arch/exception_handler.h" +#include "mldb/base/exc_assert.h" #include "mldb/arch/demangle.h" +#include "mldb/base/hex_dump.h" +#include "mldb/utils/environment.h" using namespace std; namespace fs = std::filesystem; @@ -40,8 +43,8 @@ using boost::unit_test::test_suite; #pragma clang diagnostic ignored "-Wunknown-warning-option" #pragma clang diagnostic ignored "-Wvla-cxx-extension" -fs::path binDir = std::string(getenv("BIN")); -fs::path tmpDir = std::string(getenv("TMP")); +EnvOption binDir("BIN", "./bin"); +EnvOption tmpDir("TMP", "./tmp"); struct FileCleanup { FileCleanup(const string & filename) @@ -72,14 +75,24 @@ void compress_using_tool(const std::string & input_file, const std::string & output_file, const std::string & command) { - system("cat " + input_file + " | " + command + " > " + output_file); + system(command + " " + input_file + " > " + output_file); } void decompress_using_tool(const std::string & input_file, const std::string & output_file, const std::string & command) { - system("cat " + input_file + " | " + command + " > " + output_file); + try { + //system("hexdump -C " + input_file + " | head -n 10"); + system("cat " + input_file + " | " + command + " > " + output_file); + } catch (...) { + std::ifstream stream(input_file); + constexpr size_t BUF_SIZE = 1024; + char buf[BUF_SIZE]; + size_t n = stream.readsome(buf, BUF_SIZE); + hex_dump(buf, n); + throw; + } } void compress_using_stream(const std::string & input_file, @@ -89,7 +102,7 @@ void compress_using_stream(const std::string & input_file, filter_ostream out(output_file); - char buf[16386]; + char buf[16384]; while (in) { in.read(buf, 16384); @@ -167,40 +180,40 @@ void test_compress_decompress(const std::string & input_file, BOOST_AUTO_TEST_CASE( test_compress_decompress_gz ) { string input_file = "mldb/vfs/testing/filter_streams_test.cc"; - test_compress_decompress(input_file, "gz", "gzip", "gzip -d"); + test_compress_decompress(input_file, "gz", "gzip -c", "gzip -d"); } BOOST_AUTO_TEST_CASE( test_compress_decompress_bzip2 ) { string input_file = "mldb/vfs/testing/filter_streams_test.cc"; - test_compress_decompress(input_file, "bz2", "bzip2", "bzip2 -d"); + test_compress_decompress(input_file, "bz2", "bzip2 -c", "bzip2 -d"); } BOOST_AUTO_TEST_CASE( test_compress_decompress_xz ) { string input_file = "mldb/vfs/testing/filter_streams_test.cc"; - test_compress_decompress(input_file, "xz", "xz", "xz -d"); + test_compress_decompress(input_file, "xz", "xz -c", "xz -d"); } BOOST_AUTO_TEST_CASE( test_compress_decompress_lz4 ) { string input_file = "mldb/vfs/testing/filter_streams_test.cc"; - string lz4_cmd = binDir / "lz4cli"; + string lz4_cmd = binDir.get() / "lz4cli"; test_compress_decompress(input_file, "lz4", lz4_cmd, lz4_cmd + " -d"); } BOOST_AUTO_TEST_CASE( test_compress_decompress_lz4_content_size ) { string input_file = "mldb/vfs/testing/filter_streams_test.cc"; - string lz4_cmd = binDir / "lz4cli --content-size"; - test_compress_decompress(input_file, "lz4", lz4_cmd, lz4_cmd + " -d"); + string lz4_cmd = binDir.get() / "lz4cli -B7 -BX --content-size"; + test_compress_decompress(input_file, "csize.lz4", lz4_cmd, lz4_cmd + " -d"); } BOOST_AUTO_TEST_CASE( test_compress_decompress_zstandard ) { string input_file = "mldb/vfs/testing/filter_streams_test.cc"; - string zstd_cmd = binDir / "zstd"; - test_compress_decompress(input_file, "zst", zstd_cmd, zstd_cmd + " -d"); + string zstd_cmd = binDir.get() / "zstd"; + test_compress_decompress(input_file, "zst", zstd_cmd + " -c", zstd_cmd + " -d"); } BOOST_AUTO_TEST_CASE( test_open_failure ) @@ -242,9 +255,9 @@ BOOST_AUTO_TEST_CASE( test_write_failure ) /* ensures that empty gz/bzip2/xz streams have a valid header */ BOOST_AUTO_TEST_CASE( test_empty_gzip ) { - fs::create_directories(tmpDir); + fs::create_directories(tmpDir.get()); - string fileprefix(tmpDir / "empty."); + string fileprefix(tmpDir.get() / "empty."); vector exts = { "gz", "bz2", "xz", "lz4", "zst" }; map compressions = { { "gz", "gzip" }, @@ -304,7 +317,7 @@ BOOST_AUTO_TEST_CASE( test_large_blocks ) block[i] = i ^ (i << 8) ^ (i << 16) ^ (1 << 24); } - string filename = tmpDir / "badfile.xz4"; + string filename = tmpDir.get() / "badfile.xz4"; FileCleanup cleanup(filename); @@ -590,8 +603,15 @@ BOOST_AUTO_TEST_CASE(test_filter_stream_mapping) filter_istream stream1("file://mldb/utils/testing/fixtures/hello.txt", { { "mapped", "true" } }); - BOOST_REQUIRE(stream1.mapped().first != nullptr); - BOOST_CHECK_EQUAL(strncmp(stream1.mapped().first, "hello", 5), 0); + const char * addr; + size_t size; + size_t capacity; + + std::tie(addr, size, capacity) = stream1.mapped(); + + BOOST_REQUIRE(addr != nullptr); + BOOST_CHECK_EQUAL(strncmp(addr, "hello", 5), 0); + BOOST_CHECK_GE(strncmp(std::get<0>(stream1.mapped()), "hello", 5), 0); std::string str; getline(stream1, str); @@ -606,6 +626,34 @@ BOOST_AUTO_TEST_CASE(test_filter_stream_mapping) BOOST_CHECK_EQUAL(str, "hello"); stream2.close(); + + // Verify that the mapped stream has extra space beyond the end even when it's + // a multiple of the page size (16kb is chosen instead of 4k because that's the + // page size of arm64 based macs, which have the largest pages of supported + // hosts for MLDB). + filter_istream stream3("file://mldb/utils/testing/fixtures/16kbofones.txt", + { { "mapped", "true" } }); + + std::tie(addr, size, capacity) = stream3.mapped(); + cerr << "addr = " << (const void *)addr << endl; + cerr << "size = " << size << endl; + cerr << "capacity = " << capacity << endl; + + BOOST_REQUIRE(addr != nullptr); + BOOST_REQUIRE_EQUAL(size, 16384); + BOOST_REQUIRE_GE(capacity, 16384 + MAPPING_EXTRA_CAPACITY); + + // Verify the contents of the mapped file + for (size_t i = 0; i < 16384; ++i) { + BOOST_CHECK_EQUAL(addr[i], '1'); + } + + // Verify that we can read beyond the end and that it returns zeros (anything + // else indicates uninitialized memory which is a security risk and will trigger + // undefined behaviour / address sanitizer / valgrind issues). + for (size_t i = size; i < capacity; ++i) { + BOOST_CHECK_EQUAL(addr[i], 0); + } } BOOST_AUTO_TEST_CASE(test_empty_filter_stream_mapped) @@ -614,9 +662,9 @@ BOOST_AUTO_TEST_CASE(test_empty_filter_stream_mapped) stream.open("file://mldb/utils/testing/fixtures/empty.txt", { { "mapped", "true" } }); // we cannot map an empty file - auto mapped = stream.mapped(); - BOOST_CHECK_EQUAL(mapped.first, (char *)nullptr); - BOOST_CHECK_EQUAL(mapped.second, 0); + auto [addr, size, capacity] = stream.mapped(); + BOOST_CHECK_EQUAL(addr, (char *)nullptr); + BOOST_CHECK_EQUAL(size, 0); // but we can read it without failing BOOST_CHECK_EQUAL(stream.readAll(), ""); } diff --git a/vfs/vfs.mk b/vfs/vfs.mk index e2ace5344..cd71255fe 100644 --- a/vfs/vfs.mk +++ b/vfs/vfs.mk @@ -14,6 +14,8 @@ LIBVFS_SOURCES := \ zstandard.cc \ snappy.cc \ lz4.cc \ + compressibility.cc \ + LIBVFS_LINK := \ arch \ diff --git a/vfs/zstandard.cc b/vfs/zstandard.cc index fe157608b..a2b6121d6 100644 --- a/vfs/zstandard.cc +++ b/vfs/zstandard.cc @@ -6,11 +6,17 @@ Zstandard compressor and decompressors. */ +#define ZSTD_STATIC_LINKING_ONLY 1 + #include "compressor.h" #include "mldb/base/exc_assert.h" #include "mldb/ext/zstd/lib/zstd.h" +#include "mldb/base/thread_pool.h" +#include "mldb/arch/exception.h" +#include "mldb/arch/endian.h" #include #include +#include using namespace std; @@ -134,9 +140,13 @@ struct ZStandardDecompressor: public Decompressor { if (res == ZSTD_CONTENTSIZE_UNKNOWN) { return LENGTH_UNKNOWN; // 0 means zero length OR unknown } - else if (ZSTD_isError(res)) { + else if (res == ZSTD_CONTENTSIZE_ERROR) { return LENGTH_INSUFFICIENT_DATA; } + else if (ZSTD_isError(res)) { + throw Exception("Error getting decompressed length of zstandard stream: %s", + ZSTD_getErrorName(res)); + } else return res; } @@ -158,7 +168,135 @@ struct ZStandardDecompressor: public Decompressor { } } } - + + virtual bool + forEachBlockParallel(size_t requestedBlockSize, + const GetDataFunction & getData, + const ForEachBlockFunction & onBlock, + const Allocate & allocate, + int maxParallelism) override + { + return Decompressor::forEachBlockParallel(requestedBlockSize, getData, onBlock, allocate, maxParallelism); + // To do this, we would need to: + // - Get fixed sized chunks from the underlying stream + // - Pass each to a stream + // - For each one, scan for the magic characters to indicate the beginning + // - Decompress the blocks (taking into account the possibility that there are + // spurious magic markers) + // - Scan into the next one's blocks to finish off the last one + // - Verify that each before and after block agrees on what they are scanning for +#if 0 + ThreadWorkGroup tp(maxParallelism); + + std::shared_ptr lastBlock; + std::shared_ptr currentBlock; + const char * currentData = nullptr; + size_t currentBlockLeft = 0; + + auto makeAvail = [&] (size_t numBytes) -> std::span + { + if (numBytes > currentBlockLeft) { + auto [newBlock, newBlockSize] = getData(numBytes); + if (currentBlockLeft == 0) { + // First block or previous one completely used + cerr << "first block" << endl; + currentBlock = std::move(newBlock); + currentBlockLeft = newBlockSize; + currentData = currentBlock.get(); + } + else { + if (newBlock.get() == currentData + currentBlockLeft) { + // Contiguous; must be mapped + cerr << "contiguous" << endl; + lastBlock = std::move(currentBlock); + currentBlock = std::move(newBlock); + currentBlockLeft += newBlockSize; + } + else { + // Combine them together (slow, should try to avoid making this happen) + cerr << "combined" << endl; + std::shared_ptr combinedBlock + (new char[newBlockSize + currentBlockLeft], + [] (auto p) { delete[] p; }); + memcpy(combinedBlock.get(), currentData, currentBlockLeft); + memcpy(combinedBlock.get() + currentBlockLeft, newBlock.get(), newBlockSize); + lastBlock = {}; + currentBlock = std::move(combinedBlock); + currentData = combinedBlock.get(); + currentBlockLeft += newBlockSize; + } + } + } + + ExcAssertLessEqual(numBytes, currentBlockLeft); + + return { currentData, numBytes }; + }; + + auto consume = [&] (size_t numBytes) + { + ExcAssertGreaterEqual(currentBlockLeft, numBytes); + currentData += numBytes; + currentBlockLeft -= numBytes; + }; + + //auto magicBytes = makeAvail(4); + //uint32_le magic; + //std::memcpy(&magic, magicBytes.data(), 4); + //if (magic != ZSTD_MAGICNUMBER) + // throw MLDB::Exception("Corrupted zstandard file: magic number is wrong"); + + std::shared_ptr context(ZSTD_createDCtx(), ZSTD_freeDCtx); + std::span header = makeAvail(ZSTD_FRAMEHEADERSIZE_MAX); + ZSTD_frameHeader frameHeader; + cerr << "Frame header: max size " << ZSTD_FRAMEHEADERSIZE_MAX << endl; + hex_dump(header.data(), header.size()); + size_t headerResult = ZSTD_getFrameHeader(&frameHeader, header.data(), header.size()); + if (headerResult != 0) + throw MLDB::Exception("Corrupted ZStandard file: frame header not available"); + //consume(frameHeader.headerSize); + + cerr << "dict id " << frameHeader.dictID << endl; + cerr << "content size " << frameHeader.frameContentSize << endl; + cerr << "window size " << frameHeader.windowSize << endl; + cerr << "frame type " << frameHeader.frameType << endl; + cerr << "header size " << frameHeader.headerSize << endl; + cerr << "block size max " << frameHeader.blockSizeMax << endl; + + size_t outputBufSize = frameHeader.windowSize * 2; + std::shared_ptr outputBuf(new char[outputBufSize]); + char * outputBufPtr = outputBuf.get(); + char * outputBufEnd = outputBufPtr + outputBufSize; + + size_t res = ZSTD_decompressBegin(context.get()); + //cerr << "res = " << res << endl; + if (ZSTD_isError(res)) { + throw Exception("Error beginning decompression: %s", + ZSTD_getErrorName(res)); + } + for (size_t i = 0; i < 5; ++i) { + size_t nextSize = ZSTD_nextSrcSizeToDecompress(context.get()); + cerr << "next size is " << nextSize << endl; + if (ZSTD_isError(nextSize)) { + throw Exception("Error getting size to decompress: %s", + ZSTD_getErrorName(nextSize)); + } + auto data = makeAvail(nextSize); + consume(nextSize); + size_t written = ZSTD_decompressContinue(context.get(), outputBufPtr, outputBufEnd - outputBufPtr, + data.data(), data.size()); + cerr << "written " << written << " bytes" << endl; + if (ZSTD_isError(written)) { + throw Exception("Error continuing decompression: %s", + ZSTD_getErrorName(written)); + } + outputBufPtr += written; + } + + throw MLDB::Exception("not finished"); +#endif + } + virtual void finish(const OnData & onData) override { } From a065792f3da4f0d687508120712a9f461c6f7053 Mon Sep 17 00:00:00 2001 From: Jeremy Barnes Date: Thu, 16 Jan 2025 07:06:10 -0500 Subject: [PATCH 12/39] WUP: filter_streams, for_each_line improvements; no boost::iostreams --- arch/vm.h | 5 + python_requirements.txt | 1 + testing/MLDB-1155_csv_line_endings.py | 9 + utils/for_each_line.cc | 3 +- utils/testing/fixtures/16kbofones.txt | 1 + vfs/bzip2.cc | 4 +- vfs/filter_streams.cc | 552 +++++++++++++++++++++----- vfs/gzip.cc | 13 + vfs/testing/filter_streams_test.cc | 44 +- 9 files changed, 517 insertions(+), 115 deletions(-) create mode 100644 utils/testing/fixtures/16kbofones.txt diff --git a/arch/vm.h b/arch/vm.h index 87af2450b..4093f0bc2 100644 --- a/arch/vm.h +++ b/arch/vm.h @@ -40,6 +40,11 @@ inline size_t roundUpToPageSize(size_t mem) return (mem + page_size - 1) / page_size * page_size; } +inline size_t roundDownToPageSize(size_t mem) +{ + return ssize_t(mem - page_size + 1) / page_size * page_size; +} + struct Pagemap_Entry { // Note that this just looks at the pfn. The other flags might change diff --git a/python_requirements.txt b/python_requirements.txt index 5bd749c23..2b722f67a 100644 --- a/python_requirements.txt +++ b/python_requirements.txt @@ -34,6 +34,7 @@ requests==2.25.1 Pygments==2.9.0 setuptools==75.6.0 lz4==4.3.3 +pyzstd==0.16.2 # Fix requests broken dependencies urllib3==1.26.20 diff --git a/testing/MLDB-1155_csv_line_endings.py b/testing/MLDB-1155_csv_line_endings.py index ed2fba79c..b207f03d9 100644 --- a/testing/MLDB-1155_csv_line_endings.py +++ b/testing/MLDB-1155_csv_line_endings.py @@ -4,6 +4,8 @@ # This file is part of MLDB. Copyright 2015 mldb.ai inc. All rights reserved. # import gzip +import pyzstd +import lz4 import unittest import os from mldb import mldb, ResponseException @@ -231,5 +233,12 @@ class CsvLineEndingsCsv(CsvLineEndingsGeneric, unittest.TestCase): class CsvLineEndingsCsvGz(CsvLineEndingsGeneric, unittest.TestCase): data = {'open_fct' : gzip.open, 'ext' : '.csv.gz'} +class CsvLineEndingsCsvZstd(CsvLineEndingsGeneric, unittest.TestCase): + data = {'open_fct' : pyzstd.open, 'ext' : '.csv.zstd'} + +#class CsvLineEndingsCsvLz4(CsvLineEndingsGeneric, unittest.TestCase): +# data = {'open_fct' : lz4.decompress, 'ext' : '.csv.lz4'} + + if __name__ == '__main__': mldb.run_tests() diff --git a/utils/for_each_line.cc b/utils/for_each_line.cc index a147e31de..94b564546 100644 --- a/utils/for_each_line.cc +++ b/utils/for_each_line.cc @@ -406,7 +406,8 @@ void forEachLineBlock(std::istream & stream, std::tie(current, splitterState) = splitter.nextBlock(current, end - current, nullptr, 0, stream.eof(), splitterState); - if (current && current < end) { + if (current && (current < end || stream.eof())) { + //cerr << "block is at " << current - block.get() << " of " << bytesRead << endl; //ExcAssertEqual(*current, '\n'); if (lineOffsets.back() != current - block.get()) { lineOffsets.push_back(current - block.get()); diff --git a/utils/testing/fixtures/16kbofones.txt b/utils/testing/fixtures/16kbofones.txt new file mode 100644 index 000000000..2afb00fdf --- /dev/null +++ b/utils/testing/fixtures/16kbofones.txt @@ -0,0 +1 @@ +1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 \ No newline at end of file diff --git a/vfs/bzip2.cc b/vfs/bzip2.cc index be5f6e2e4..1b0404b29 100644 --- a/vfs/bzip2.cc +++ b/vfs/bzip2.cc @@ -112,8 +112,8 @@ struct BzlibStreamCommon: public bz_stream { { int bzlibFlushLevel; switch (flushLevel) { - case Compressor::FLUSH_NONE: bzlibFlushLevel = BZ_RUN; break; - case Compressor::FLUSH_AVAILABLE: bzlibFlushLevel = BZ_RUN; break; + case Compressor::FLUSH_NONE: return 0; + case Compressor::FLUSH_AVAILABLE: return 0; case Compressor::FLUSH_SYNC: bzlibFlushLevel = BZ_FLUSH; break; case Compressor::FLUSH_RESTART: bzlibFlushLevel = BZ_FINISH; break; default: diff --git a/vfs/filter_streams.cc b/vfs/filter_streams.cc index d71f83002..9179b31de 100644 --- a/vfs/filter_streams.cc +++ b/vfs/filter_streams.cc @@ -18,11 +18,6 @@ #include "compressor.h" #include #include -#include -#include -#include -#include -#include #include "mldb/arch/exception.h" #include #include @@ -30,16 +25,409 @@ #include #include "fs_utils.h" #include "mldb/base/exc_assert.h" +#include "mldb/base/scope.h" #include "mldb/utils/lexical_cast.h" #include "mldb/utils/split.h" #include "mldb/arch/vm.h" #include +#include +#include +#include using namespace std; namespace MLDB { +#define MLDB_ABORT_UNIMPLEMENTED() \ + cerr << "Unimplemented: " << __FILE__ << ":" << __LINE__ << " " << __PRETTY_FUNCTION__ << endl; \ + abort(); + +template void close_stream(Stream& stream) { stream.close(); } +inline void close_stream(std::istream & stream) { /* nothing to do */ } +inline void flush_stream(std::ostream & stream) { stream.flush(); } +inline void flush_stream(std::istream & stream) { /* nothing to do */ } +template void flush_stream(Stream& stream) { MLDB_ABORT_UNIMPLEMENTED(); } + +template +ssize_t write_stream(std::ostream& stream, const char * data, size_t len) +{ + stream.write(data, len); + if (!stream) + throw Exception("unable to write data"); + return len; +} + +template ssize_t write_stream(Stream& stream, const char * data, size_t len) { return stream.write(data, len); } +template ssize_t read_stream(Stream& stream, char * data, size_t len) { return stream.read(data, len); } + + +/*****************************************************************************/ +/* FILTER STREAM CLASSES */ +/*****************************************************************************/ + +// Similar interface to boost::iostreams, except that these: +// a) don't use boost +// b) can map extra space at the end of a memory mapped file, allowing for +// algorithms that require specific alignment to work efficiently + +struct filter_streambuf: public std::streambuf { + virtual ~filter_streambuf() = default; + virtual void close() = 0; // should ensure that nothing more is written to the output + void set_output(std::streambuf * sb) { output_ = sb; } + bool has_output() const { return output_; } + std::streambuf * require_output() const { ExcCheck(output_, "Attempt to use non-capped filter_streambuf"); return output_; } + std::streamsize write(const char* s, std::streamsize n) { return require_output()->sputn(s, n); } + std::streamsize read(char* s, std::streamsize n) { return require_output()->sgetn(s, n); } + void flush() { require_output()->pubsync(); } +private: + std::streambuf * output_ = nullptr; +}; + +template +struct filtering_stream: public IOStream { + using IOStream::rdbuf; + filtering_stream() : IOStream(nullptr) + { + } + + virtual ~filtering_stream() + { + flush_stream((IOStream&)*this); + rdbuf(nullptr); + for (auto & filter: filters_) filter->close(); + if (cap_) cap_->close(); + } + + void push(std::streambuf & sb) { check_not_capped(); push_streambuf(sb); } + + bool empty() const { return filters_.empty() && !cap_ && !rdbuf(); } + bool capped() const { return rdbuf() && (filters_.empty() || filters_.back()->has_output()); } + +protected: + void check_not_capped() const { ExcCheck(!cap_, "Attempt to push a second sink into a filtering_stream"); } + void push_streambuf(std::streambuf & sb) { cerr << "adding streambuf " << (void *)(&sb) << " to " << filters_.size() << " filters and " << (bool)rdbuf() << "rdbuf set" << endl; if (!rdbuf()) { rdbuf(&sb); } else filters_.back()->set_output(&sb); } + template void push_cap(Cap cap) { check_not_capped(); push_streambuf(*(cap_ = std::make_unique(std::move(cap)))); } + template void push_filter(Filter filter) + { + check_not_capped(); + filters_.emplace_back(std::make_unique(std::move(filter))); + push_streambuf(*filters_.back()); + } +private: + std::vector> filters_; + std::unique_ptr cap_; +}; + + +/*****************************************************************************/ +/* FILTER OSTREAM CLASSES */ +/*****************************************************************************/ + +struct buffered_ostreambuf: public filter_streambuf { + buffered_ostreambuf(size_t buffer_size = 4096) : buffer_(buffer_size) { setp(buffer_.data(), buffer_.data() + buffer_.size()); } +protected: + std::vector buffer_; +}; + +template +struct sink_ostreambuf: public buffered_ostreambuf { + using base_type = buffered_ostreambuf; + sink_ostreambuf(Sink sink, size_t buffer_size = 4096) : base_type(buffer_size), sink_(std::move(sink)) {} + virtual ~sink_ostreambuf() = default; + const Sink & sink() const { return sink_; } + Sink & sink() { return sink_; } + virtual std::streamsize xsputn(const char * s, std::streamsize n) override { return sink_.write(s, n); } + virtual int overflow(int c) override { if (c == EOF) MLDB_THROW_LOGIC_ERROR(); char c2 = c; return sink_.write(&c2, 1) == 1 ? 0 : -1; } + virtual int sync() override { sink_.flush(); return 0; } + virtual void close() override { sink_.close(); } +private: + Sink sink_; +}; + +template +struct filtering_ostreambuf: public buffered_ostreambuf { + using base_type = buffered_ostreambuf; + filtering_ostreambuf(Filter filter, size_t buffer_size = 4096) : base_type(buffer_size), filter_(std::move(filter)) {} + virtual ~filtering_ostreambuf() = default; + const Filter & filter() const { return filter_; } + Filter & filter() { return filter_; } + virtual std::streamsize xsputn(const char * s, std::streamsize n) override { return filter_.write(*this, s, n); } + virtual int sync() override { filter_.flush(*this); return 0; } + virtual void close() override { filter_.close(*this); } +private: + Filter filter_; +}; + +struct filtering_ostream: public filtering_stream { + using filtering_stream::push; + template void push(Sink sink, typename Sink::is_sink::type = {}) { push_cap>(std::move(sink)); } + template void push(Filter filter, typename Filter::is_filter::type = {}) { push_filter>(std::move(filter)); } +}; + + +/*****************************************************************************/ +/* FILTER ISTREAM CLASSES */ +/*****************************************************************************/ + +struct buffered_istreambuf: public filter_streambuf { + buffered_istreambuf(size_t buffer_size = 4096) : buffer_(buffer_size) {} + virtual int underflow() override { cerr << "underflow()" << endl; buf_fill(); return buf_empty() ? EOF : 0; } + virtual std::streampos seekoff(std::streamoff off, std::ios_base::seekdir way, std::ios_base::openmode which) override + { + if (which != std::ios_base::in || way != std::ios_base::cur || off != 0) return EOF; + return pos_ + gptr() - eback(); + } + bool eof() const { return eof_; } + +protected: + std::vector buffer_; + ssize_t pos_ = 0; + bool eof_ = false; + bool buf_empty() const { return gptr() == egptr(); } + void require_empty() { ExcAssert(buf_empty()); } + template void do_buf_fill(Source & source, Args&&... args) + { + require_empty(); + auto n = source.read(std::forward(args)..., buffer_.data(), buffer_.size()); + if (n == -1) eof_ = true; + else { + setg(buffer_.data(), buffer_.data(), buffer_.data() + n); + } + } + virtual void buf_fill() = 0; +}; + +template +struct source_istreambuf: public buffered_istreambuf { + using base_type = buffered_istreambuf; + source_istreambuf(Source source, size_t buffer_size = 4096) : base_type(buffer_size), source_(std::move(source)) {} + virtual ~source_istreambuf() = default; + const Source & source() const { return source_; } + Source & source() { return source_; } + virtual int underflow() override + { + buf_fill(); + if (eof()) { + ExcAssert(buf_empty()); + return EOF; + } + ExcAssert(!buf_empty()); + return *gptr(); + } + virtual void close() override {} + +protected: + virtual void buf_fill() override { do_buf_fill(source_); } + Source source_; +}; + +template +struct filtering_istreambuf: public buffered_istreambuf { + using base_type = buffered_istreambuf; + filtering_istreambuf(Filter filter, size_t buffer_size = 4096) : base_type(buffer_size), filter_(std::move(filter)) {} + virtual ~filtering_istreambuf() = default; + const Filter & filter() const { return filter_; } + Filter & filter() { return filter_; } + //virtual std::streamsize xsgetn(char * s, std::streamsize n) override { return filter_.read(*this, s, n); } + //virtual int sync() override { filter_.flush(*this); return 0; } + virtual void close() override {} +protected: + virtual void buf_fill() override { do_buf_fill(filter_, *this); } + Filter filter_; +}; + +struct filtering_istream: public filtering_stream { + using filtering_stream::push; + template void push(Source source, typename Source::is_source::type = {}) { push_cap>(std::move(source)); } + template void push(Filter filter, typename Filter::is_filter::type = {}) { push_filter>(std::move(filter)); } +}; + +template +struct stream_buffer: public source_istreambuf { + stream_buffer(Source source, size_t /*buffer_size*/ = 4096): source_istreambuf(std::move(source)) {} +}; + +struct mapped_file_params { + std::string filename; + int fd = -1; + size_t offset = 0; + ssize_t size = -1; + ssize_t extra_capacity = MAPPING_EXTRA_CAPACITY; +}; + +struct mapped_file_source { + using is_source = std::true_type; + mapped_file_source(mapped_file_params params) + { + Scope_Exit(if (params.fd != -1) ::close(params.fd)); + if (params.fd == -1) { + params.fd = open(params.filename.c_str(), O_RDONLY); + if (params.fd == -1) + throw Exception(errno, "open"); + } + if (params.size == -1) { + struct stat st; + if (fstat(params.fd, &st) == -1) + throw Exception(errno, "fstat"); + params.size = st.st_size; + } + size_t offset = roundDownToPageSize(params.offset); + size_t skip = params.offset - offset; + size_t capacity = roundUpToPageSize(params.size + params.extra_capacity - offset); + size_t capacityWithoutGuardPage = roundUpToPageSize(params.size - offset); + cerr << "capacity = " << capacity << " capacityWithoutGuardPage = " << capacityWithoutGuardPage << endl; + cerr << "skip = " << skip << endl; + cerr << "offset = " << offset << endl; + + cerr << "mapping " << capacity << " of " << params.size << " bytes from " << params.filename << " at offset " << params.offset << endl; + cerr << "skipping " << skip << " bytes" << endl; + + auto check_mmap = [&] (void * p) { + if (p == MAP_FAILED) + throw Exception(errno, "mmap"); + }; + + std::shared_ptr addr; + if (capacity == capacityWithoutGuardPage) { + // No extra page + addr = std::shared_ptr + (mmap(nullptr, capacity, + PROT_READ, MAP_PRIVATE, params.fd, params.offset), + [=] (void * p) { munmap(p, page_size); }); + check_mmap(addr.get()); + } + else { + // Firstly, make an anonymous zero-filled mapping + addr = std::shared_ptr + (mmap(nullptr, capacity, PROT_READ, MAP_PRIVATE | MAP_ANON, -1, 0), + [=] (void * p) { munmap(p, page_size); }); + check_mmap(addr.get()); + + // Now remap the file on all but the last page + void * addr2 = mmap(addr.get(), capacity - page_size, PROT_READ, MAP_PRIVATE | MAP_FIXED, params.fd, params.offset); + if (addr2 == MAP_FAILED) + throw Exception(errno, "mmap"); + if (addr2 != addr.get()) + throw Exception("mmap: remapped to different address"); + } + + data_ = (const char *)addr.get() + skip; + ptr_ = data_; + size_ = params.size - params.offset; + capacity_ = capacity - skip; + region_ = std::move(addr); + + cerr << "data_ = " << (void *)data_ << endl; + cerr << "ptr_ = " << (void *)ptr_ << endl; + cerr << "size_ = " << size_ << endl; + cerr << "capacity_ = " << capacity_ << endl; + cerr << "region_ = " << (void *)region_.get() << endl; + } + + const char * data() const { return data_; } + size_t size() const { return size_; } + size_t avail() const { return data_ + size_ - ptr_; } + size_t capacity() const { return capacity_; } + size_t extra_capacity() const { return capacity_ - size_; } + + ssize_t read(char * s, size_t n) + { + cerr << "reading " << n << " bytes from mapped file" << endl; + size_t left = avail(); + if (left == 0) + return EOF; + n = std::min(n, left); + memcpy(s, ptr_, n); + ptr_ += n; + cerr << "read " << n << " bytes from mapped file" << endl; + return n; + } + + int fd_ = -1; + std::shared_ptr region_; + const char * data_ = nullptr; + const char * ptr_ = nullptr; + size_t size_ = 0; + size_t capacity_ = 0; +}; + +enum close_handle { + never_close_handle = false, + always_close_handle = true +}; +struct file_descriptor_sink { + using is_sink = std::true_type; + file_descriptor_sink(int fd, close_handle close_handle = never_close_handle) + : fd_(fd), close_handle_(close_handle) + { + cerr << "initializing fd sink with fd " << fd << endl; + } + + // Disable copying + file_descriptor_sink(const file_descriptor_sink &) = delete; + file_descriptor_sink & operator = (const file_descriptor_sink &) = delete; + + file_descriptor_sink(file_descriptor_sink && other) + : fd_(other.fd_), close_handle_(other.close_handle_) + { + other.fd_ = -1; + } + + void swap(file_descriptor_sink & other) + { + std::swap(fd_, other.fd_); + std::swap(close_handle_, other.close_handle_); + } + + file_descriptor_sink & operator = (file_descriptor_sink && other) + { + swap(other); + return *this; + } + + ~file_descriptor_sink() + { + cerr << "destroying fd sink" << endl; + close(); + } + + void close() + { + if (fd_ != -1) { + cerr << "closing fd " << fd_ << " with close_handle_ " << close_handle_ << endl; + if (close_handle_ == always_close_handle) + ::close(fd_); + fd_ = -1; + } + } + + void flush() + { + cerr << "flushing fd sink" << endl; + // fsync? + } + + ssize_t write(const char * data, size_t len) + { + cerr << "writing " << len << " bytes to fd sink" << endl; + auto res = ::write(fd_, data, len); + cerr << "res = " << res << endl; + if (res == -1) + throw Exception(errno, "write"); + return res; + } + + int fd_ = -1; + close_handle close_handle_ = never_close_handle; +}; + + + +/*****************************************************************************/ +/* URI HANDLING */ +/*****************************************************************************/ + const UriHandlerFactory & getUriHandler(const std::string & scheme); @@ -67,18 +455,17 @@ UriHandler(std::streambuf * buf, /*****************************************************************************/ -/* BOOST COMPRESSOR */ +/* STREAM COMPRESSOR */ /*****************************************************************************/ -/** Adaptor to allow boost::iostreams to be served by a compressor object. */ - -struct BoostCompressor: public boost::iostreams::multichar_output_filter { +struct StreamCompressor { + using is_filter = std::true_type; - BoostCompressor(Compressor * compressor, std::streambuf & buf) + StreamCompressor(Compressor * compressor, std::streambuf & buf) : compressor(compressor), buf(buf) { // Record the start position so that once we know the actual written - // size we can go back and rewrite the header wiht the right size. + // size we can go back and rewrite the header with the right size. if (compressor->canFixupLength()) { try { MLDB_TRACE_EXCEPTIONS(false); @@ -93,7 +480,7 @@ struct BoostCompressor: public boost::iostreams::multichar_output_filter { void writeAll(Sink& sink, const char* data, size_t size) { while (size > 0) { - size_t written = boost::iostreams::write(sink, data, size); + size_t written = write_stream(sink, data, size); if (!written) throw Exception("unable to write data"); data += written; @@ -170,21 +557,16 @@ struct BoostCompressor: public boost::iostreams::multichar_output_filter { /*****************************************************************************/ -/* BOOST DECOMPRESSOR */ +/* STREAM DECOMPRESSOR */ /*****************************************************************************/ -/** Adaptor to allow boost::iostreams to be served by a decompressor object. */ +/** Adaptor to allow iostreams to be served by a decompressor object. */ -struct BoostDecompressor { +struct StreamDecompressor { + using is_filter = std::true_type; typedef char char_type; - struct category - : public boost::iostreams::filter_tag, - public boost::iostreams::input_seekable, - public boost::iostreams::multichar_tag { - }; - - BoostDecompressor(Decompressor * decompressor) + StreamDecompressor(Decompressor * decompressor) : decompressor(decompressor) { inbuf.resize(4096); @@ -211,8 +593,11 @@ struct BoostDecompressor { outbufPos = 0; } - if (n == 0) + if (n == 0) { + if (s == sBefore && eof) + return EOF; return s - sBefore; + } // Now, call the decompressor @@ -232,9 +617,10 @@ struct BoostDecompressor { }; while (n > 0) { - ssize_t numRead = boost::iostreams::read(src, inbuf.data(), inbuf.size()); + ssize_t numRead = read_stream(src, inbuf.data(), inbuf.size()); if (numRead <= 0) { decompressor->finish(onData); + eof = true; break; } else { @@ -242,7 +628,7 @@ struct BoostDecompressor { } } - return s - sBefore; + return (s == sBefore && eof) ? EOF : s - sBefore; } template @@ -274,7 +660,8 @@ struct BoostDecompressor { std::string outbuf; ///< Characters returned from decompressor but not yet written size_t outbufPos = 0; ///< Position in outbuf uint64_t streamPos = 0; - + bool eof = false; + std::shared_ptr decompressor; }; @@ -382,13 +769,11 @@ operator = (filter_ostream && other) namespace { void addCompression(streambuf & buf, - boost::iostreams::filtering_ostream & stream, + filtering_ostream & stream, const Utf8String & resource, const std::string & compression, int compressionLevel) { - using namespace boost::iostreams; - if (compression == "none") { // nothing to do } @@ -397,7 +782,7 @@ void addCompression(streambuf & buf, = Compressor::create(compression, compressionLevel); if (!compressor) throw MLDB::Exception("unknown filter compression " + compression); - stream.push(BoostCompressor(compressor, buf)); + stream.push(StreamCompressor(compressor, buf)); } else { std::string compressionFromFilename @@ -407,13 +792,13 @@ void addCompression(streambuf & buf, = Compressor::create(compressionFromFilename, compressionLevel); if (!compressor) throw MLDB::Exception("unknown filter compression " + compression); - stream.push(BoostCompressor(compressor, buf)); + stream.push(StreamCompressor(compressor, buf)); } } } void addCompression(streambuf & buf, - boost::iostreams::filtering_ostream & stream, + filtering_ostream & stream, const Utf8String & resource, const std::map & options) { @@ -438,12 +823,12 @@ createOptions(std::ios_base::openmode mode, int compressionLevel) { /* -app (append) Set the stream's position indicator to the end of the stream before each output operation. -ate (at end) Set the stream's position indicator to the end of the stream on opening. -binary (binary) Consider stream as binary rather than text. -in (input) Allow input operations on the stream. -out (output) Allow output operations on the stream. -trunc (truncate) Any current content is discarded, assuming a length of zero on opening. + app (append) Set the stream's position indicator to the end of the stream before each output operation. + ate (at end) Set the stream's position indicator to the end of the stream on opening. + binary (binary) Consider stream as binary rather than text. + in (input) Allow input operations on the stream. + out (output) Allow output operations on the stream. + trunc (truncate) Any current content is discarded, assuming a length of zero on opening. */ string modeStr; @@ -538,8 +923,6 @@ filter_ostream:: open(const Utf8String & uri, const std::map & options) { - using namespace boost::iostreams; - auto [scheme, resource] = getScheme(uri); std::ios_base::openmode mode = getMode(options); @@ -588,11 +971,8 @@ openFromStreambuf(std::streambuf * buf, const Utf8String & resource, const std::map & options) { - // TODO: exception safety for buf - using namespace boost::iostreams; - //cerr << "buf = " << (void *)buf << endl; //cerr << "weOwnBuf = " << weOwnBuf << endl; @@ -636,8 +1016,6 @@ open(int fd, std::ios_base::openmode mode, void filter_ostream:: open(int fd, const std::map & options) { - using namespace boost::iostreams; - unique_ptr new_stream (new filtering_ostream()); @@ -651,12 +1029,8 @@ open(int fd, const std::map & options) } } -#if (BOOST_VERSION < 104100) - new_stream->push(file_descriptor_sink(fd)); -#else - new_stream->push(file_descriptor_sink(fd, - boost::iostreams::never_close_handle)); -#endif + new_stream->push(file_descriptor_sink(fd, never_close_handle)); + stream.reset(new_stream.release()); sink.reset(); rdbuf(stream->rdbuf()); @@ -669,8 +1043,7 @@ filter_ostream:: close() { if (stream) { - boost::iostreams::flush(*stream); - //boost::iostreams::close(*stream); // will be called on stream.reset(); + flush_stream(*stream); } stream.reset(); exceptions(ios::goodbit); @@ -886,20 +1259,18 @@ openFromStreambuf(std::streambuf * buf, { // TODO: exception safety for buf - using namespace boost::iostreams; - unique_ptr new_stream (new filtering_istream()); if (compression == "") { std::string compression = Compressor::filenameToCompression(resource); if (compression != "") { - new_stream->push(BoostDecompressor(Decompressor::create(compression))); + new_stream->push(StreamDecompressor(Decompressor::create(compression))); } } else if (compression == "none") { // no-op } else { - new_stream->push(BoostDecompressor(Decompressor::create(compression))); + new_stream->push(StreamDecompressor(Decompressor::create(compression))); } if (!new_stream->empty()) { @@ -927,8 +1298,8 @@ filter_istream:: close() { if (stream) { - boost::iostreams::flush(*stream); - boost::iostreams::close(*stream); + flush_stream(*stream); + close_stream(*stream); } exceptions(ios::goodbit); rdbuf(0); @@ -1070,8 +1441,6 @@ struct RegisterFileHandler { const std::map & options, const OnUriHandlerException & onException) { - using namespace boost::iostreams; - if (resource == "") resource = "/dev/null"; @@ -1107,39 +1476,14 @@ struct RegisterFileHandler { mapped_file_params params(resource.rawString()); mapped_file_source source(params); - //cerr << "mapped file at " << (void *)source.data() << endl; - - size_t capacity = roundUpToPageSize(info.size); - if (capacity - info.size < MAPPING_EXTRA_CAPACITY) { - void * hint = (void *)(source.data() + capacity); - // Attempt to map a guard page - std::shared_ptr addr - (mmap(hint, page_size, - PROT_READ, MAP_PRIVATE | MAP_ANON, -1, 0), - [=] (void * p) { munmap(p, page_size); }); - - if (addr.get() == MAP_FAILED) { - throw Exception - ("Failed to open memory map file: " - + string(strerror(errno))); - } - if (addr.get() != (source.data() + capacity)) { - cerr << "addr.get() = " << (void *)addr.get() << endl; - cerr << "hint = " << hint << endl; - cerr << "couldn't map guard page or didn't map at the right address" << endl; - } - else { - keepMe->emplace_back(std::move(addr)); - capacity += page_size; - } - } - - shared_ptr buf(new stream_buffer(source)); + auto buf = std::make_shared>(source); UriHandlerOptions options; options.mapped = source.data(); - options.mappedSize = info.size; - options.mappedCapacity = capacity; + options.mappedSize = buf->source().size(); + options.mappedCapacity = buf->source().capacity(); + ExcCheckGreaterEqual(buf->source().extra_capacity(), MAPPING_EXTRA_CAPACITY, + "mapped file extra capacity not respected"); keepMe->emplace_back(buf); @@ -1242,12 +1586,6 @@ struct MemStreamingInOut { }; struct MemStreamingIn : public MemStreamingInOut { - struct category - : public boost::iostreams::input_seekable, - public boost::iostreams::device_tag, - public boost::iostreams::closable_tag - { - }; MemStreamingIn(string & targetString) : MemStreamingInOut(targetString) @@ -1274,6 +1612,12 @@ struct MemStreamingIn : public MemStreamingInOut { return res; } + streamsize avail() + { + unique_lock guard(memStringsLock); + return targetString_.size() - pos_; + } + std::streampos seek(std::streamsize where, std::ios_base::seekdir dir) { unique_lock guard(memStringsLock); @@ -1309,12 +1653,6 @@ struct MemStreamingIn : public MemStreamingInOut { }; struct MemStreamingOut : public MemStreamingInOut { - struct category - : public boost::iostreams::output, - public boost::iostreams::device_tag, - public boost::iostreams::closable_tag - { - }; MemStreamingOut(string & targetString) : MemStreamingInOut(targetString) @@ -1332,6 +1670,8 @@ struct MemStreamingOut : public MemStreamingInOut { return n; } + + void flush() {} }; struct RegisterMemHandler { @@ -1354,12 +1694,10 @@ struct RegisterMemHandler { shared_ptr streamBuf; if (mode == ios::in) { - streamBuf.reset(new boost::iostreams::stream_buffer(MemStreamingIn(targetString), - 4096)); + streamBuf.reset(new source_istreambuf(MemStreamingIn(targetString), 4096)); } else if (mode == ios::out) { - streamBuf.reset(new boost::iostreams::stream_buffer(MemStreamingOut(targetString), - 4096)); + streamBuf.reset(new sink_ostreambuf(MemStreamingOut(targetString), 4096)); } else { throw MLDB::Exception("unable to create mem handler"); diff --git a/vfs/gzip.cc b/vfs/gzip.cc index 42898d269..d3f8dc4c6 100644 --- a/vfs/gzip.cc +++ b/vfs/gzip.cc @@ -35,11 +35,18 @@ struct ZlibStreamCommon: public z_stream { opaque = nullptr; } + bool finished = false; int (*process) (z_streamp stream, int flush) = nullptr; size_t pump(const char * data, size_t len, const OnData & onData, int flushLevel) { + if (finished) { + if (len != 0) + MLDB_THROW_LOGIC_ERROR("pumping data after finished"); + return 0; + } + constexpr size_t bufSize = 131072; char output[bufSize]; next_in = (Bytef *)data; @@ -64,6 +71,11 @@ struct ZlibStreamCommon: public z_stream { result += bytesWritten; break; + case Z_BUF_ERROR: + if (avail_in == 0) + return 0; // not making progress on no input is not an error + throw Exception("Buffer error on zlib"); + case Z_STREAM_ERROR: throw Exception("Stream error on zlib"); @@ -71,6 +83,7 @@ struct ZlibStreamCommon: public z_stream { if (bytesWritten) onData(output, bytesWritten); result += bytesWritten; + finished = true; return result; default: diff --git a/vfs/testing/filter_streams_test.cc b/vfs/testing/filter_streams_test.cc index cf27f88c6..c7d1e7ce0 100644 --- a/vfs/testing/filter_streams_test.cc +++ b/vfs/testing/filter_streams_test.cc @@ -102,11 +102,12 @@ void compress_using_stream(const std::string & input_file, filter_ostream out(output_file); - char buf[16384]; + constexpr size_t BUF_SIZE = 16384; + char buf[BUF_SIZE]; while (in) { - in.read(buf, 16384); - int n = in.gcount(); + in.read(buf, BUF_SIZE); + auto n = in.gcount(); out.write(buf, n); } @@ -235,8 +236,15 @@ BOOST_AUTO_TEST_CASE( test_write_failure ) cerr << "fd = " << fd << endl; filter_ostream stream(fd); + BOOST_CHECK(!stream.eof()); + BOOST_CHECK(!stream.fail()); + BOOST_CHECK(!stream.bad()); + BOOST_CHECK_EQUAL(stream.rdstate(), std::ios::goodbit); + + BOOST_CHECK(stream.good()); - stream << "hello" << std::endl; + stream << "hello"; + stream << std::endl; { MLDB_TRACE_EXCEPTIONS(false); @@ -596,25 +604,42 @@ BOOST_AUTO_TEST_CASE(test_filter_stream_exceptions_destruction_istream) action(); } - +#endif BOOST_AUTO_TEST_CASE(test_filter_stream_mapping) { filter_istream stream1("file://mldb/utils/testing/fixtures/hello.txt", { { "mapped", "true" } }); + BOOST_CHECK(!stream1.eof()); + BOOST_CHECK(!stream1.fail()); + BOOST_CHECK(!stream1.bad()); + BOOST_CHECK_EQUAL(stream1.rdstate(), std::ios::goodbit); + const char * addr; size_t size; size_t capacity; std::tie(addr, size, capacity) = stream1.mapped(); + cerr << "addr = " << (void *)addr << endl; + cerr << "size = " << size << endl; + cerr << "capacity = " << capacity << endl; BOOST_REQUIRE(addr != nullptr); BOOST_CHECK_EQUAL(strncmp(addr, "hello", 5), 0); BOOST_CHECK_GE(strncmp(std::get<0>(stream1.mapped()), "hello", 5), 0); std::string str; + BOOST_CHECK(stream1.good()); getline(stream1, str); + BOOST_CHECK(stream1.good()); + + int c = stream1.get(); + BOOST_CHECK_EQUAL(c, '\n'); + BOOST_CHECK(!stream1.bad()); + BOOST_CHECK(!stream1.fail()); + BOOST_CHECK(stream1.eof()); + BOOST_CHECK_EQUAL(str, "hello"); stream1.close(); @@ -625,6 +650,15 @@ BOOST_AUTO_TEST_CASE(test_filter_stream_mapping) getline(stream2, str); BOOST_CHECK_EQUAL(str, "hello"); + BOOST_CHECK(!stream2.fail()); + BOOST_CHECK(!stream2.bad()); + + getline(stream2, str); + + BOOST_CHECK_EQUAL(str, ""); + BOOST_CHECK(stream2.eof()); + BOOST_CHECK(stream2.fail()); + BOOST_CHECK(!stream2.bad()); stream2.close(); // Verify that the mapped stream has extra space beyond the end even when it's From ef211ad33d3a2db79abfc4707c40137d3782a258 Mon Sep 17 00:00:00 2001 From: Jeremy Barnes Date: Thu, 16 Jan 2025 19:30:17 -0500 Subject: [PATCH 13/39] SQUASH filter_streams, boost (2) --- CMakeLists.txt | 2 - base/base.mk | 1 + base/testing/base_testing.mk | 1 + block/content.cc | 1 - block/content_descriptor.cc | 10 +- compiler/compiler.h | 4 + plugins/azure/azure_blob_storage.cc | 1 - .../testing/behavior_domain_read_bench.cc | 2 - plugins/hadoop/hdfs.cc | 1 - vfs/CMakeLists.txt | 1 - vfs/filter_streams.cc | 118 ++++++++++++------ vfs/http_streambuf.cc | 10 +- vfs/testing/filter_streams_test.cc | 17 +-- vfs/vfs.mk | 1 - vfs_handlers/aws/s3_handlers.cc | 16 ++- vfs_handlers/sftp.cc | 16 ++- 16 files changed, 128 insertions(+), 74 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index f4b9a80f8..7bab6ec62 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -26,9 +26,7 @@ find_package(Boost REQUIRED COMPONENTS unit_test_framework regex date_time - python312 system - iostreams ) include_directories(${CMAKE_CURRENT_SOURCE_DIR}) diff --git a/base/base.mk b/base/base.mk index 47c2cfe55..ac7ef7977 100644 --- a/base/base.mk +++ b/base/base.mk @@ -8,6 +8,7 @@ LIBBASE_SOURCES := \ optimized_path.cc \ hex_dump.cc \ ../types/string.cc \ + iostream_adaptors.cc \ LIBBASE_LINK := \ arch \ diff --git a/base/testing/base_testing.mk b/base/testing/base_testing.mk index 9e424e175..345d60e7e 100644 --- a/base/testing/base_testing.mk +++ b/base/testing/base_testing.mk @@ -4,3 +4,4 @@ export MLDB_NO_TIMING_TESTS=1 $(eval $(call test,thread_pool_test,base arch,boost timed)) $(eval $(call test,thread_queue_test,base arch,boost timed)) $(eval $(call test,per_thread_accumulator_test,base arch,boost)) +$(eval $(call iostream_adaptors_test, base arch, catch2)) diff --git a/block/content.cc b/block/content.cc index 7006d3e44..2074664cf 100644 --- a/block/content.cc +++ b/block/content.cc @@ -6,7 +6,6 @@ */ #include -#include #include "mldb/http/http_rest_proxy.h" #include "mldb/vfs/filter_streams_registry.h" #include "mldb/vfs/fs_utils.h" diff --git a/block/content_descriptor.cc b/block/content_descriptor.cc index ec2af1c31..a2b9bb8a7 100644 --- a/block/content_descriptor.cc +++ b/block/content_descriptor.cc @@ -10,11 +10,11 @@ #include "mldb/types/annotated_exception.h" #include "mldb/vfs/filter_streams.h" #include "mldb/types/any_impl.h" -#include #include #include "mldb/vfs/compressor.h" #include "mldb/watch/watch_impl.h" #include "mldb/base/thread_pool.h" +#include "mldb/base/iostream_adaptors.h" using namespace std; @@ -241,12 +241,16 @@ struct ContentInputSeekableStreambuf { static_assert(sizeof(char_type) == 1, "content streams for single-char bytes only"); + using is_source = std::true_type; + using is_seekable = std::true_type; +#if 0 struct category : public boost::iostreams::input_seekable, public boost::iostreams::device_tag, public boost::iostreams::closable_tag { }; - +#endif + struct Impl { Impl(std::shared_ptr handler__) : handler(std::move(handler__)) @@ -547,7 +551,7 @@ getStream(const std::map & options) const ContentInputSeekableStreambuf bufImpl(getSharedThis()); std::streambuf * buf - = new boost::iostreams::stream_buffer + = new source_istreambuf (std::move(bufImpl), 1024 * 1024); UriHandler handler(buf /* streambuf */, diff --git a/compiler/compiler.h b/compiler/compiler.h index f93388fe1..033699665 100644 --- a/compiler/compiler.h +++ b/compiler/compiler.h @@ -47,6 +47,10 @@ } catch (...) #endif +// Run the given statement, eating all non stack unwinding exceptions +#define MLDB_EAT_EXCEPTIONS(...) \ + try { __VA_ARGS__; } MLDB_CATCH_ALL { } + #if __GNUC__ == 4 # if __CNUC_MINOR__ < 8 # define MLDB_NO_MOVE_IF_NOEXCEPT diff --git a/plugins/azure/azure_blob_storage.cc b/plugins/azure/azure_blob_storage.cc index 92ca393f5..aaa2a9b73 100644 --- a/plugins/azure/azure_blob_storage.cc +++ b/plugins/azure/azure_blob_storage.cc @@ -5,7 +5,6 @@ **/ #include -#include #include #include #include diff --git a/plugins/behavior/testing/behavior_domain_read_bench.cc b/plugins/behavior/testing/behavior_domain_read_bench.cc index 21660b92c..0c09e326e 100644 --- a/plugins/behavior/testing/behavior_domain_read_bench.cc +++ b/plugins/behavior/testing/behavior_domain_read_bench.cc @@ -14,8 +14,6 @@ #include #include #include -#include -#include #include "mldb/utils/testing/benchmarks.h" diff --git a/plugins/hadoop/hdfs.cc b/plugins/hadoop/hdfs.cc index 04cb90a6d..ef702b261 100644 --- a/plugins/hadoop/hdfs.cc +++ b/plugins/hadoop/hdfs.cc @@ -7,7 +7,6 @@ #include #include -#include #include "hdfs/hdfs.h" #include diff --git a/vfs/CMakeLists.txt b/vfs/CMakeLists.txt index 2ed778687..0fb8f7c6b 100644 --- a/vfs/CMakeLists.txt +++ b/vfs/CMakeLists.txt @@ -21,7 +21,6 @@ set(LIBVFS_SOURCES # Define the libraries to link with the VFS library set(LIBVFS_LINK arch - Boost::iostreams types http lz4 diff --git a/vfs/filter_streams.cc b/vfs/filter_streams.cc index 9179b31de..5b0989fc9 100644 --- a/vfs/filter_streams.cc +++ b/vfs/filter_streams.cc @@ -29,16 +29,15 @@ #include "mldb/utils/lexical_cast.h" #include "mldb/utils/split.h" #include "mldb/arch/vm.h" - -#include +#include "mldb/base/iostream_adaptors.h" #include -#include -#include using namespace std; namespace MLDB { +#if 0 + #define MLDB_ABORT_UNIMPLEMENTED() \ cerr << "Unimplemented: " << __FILE__ << ":" << __LINE__ << " " << __PRETTY_FUNCTION__ << endl; \ abort(); @@ -93,10 +92,10 @@ struct filtering_stream: public IOStream { virtual ~filtering_stream() { - flush_stream((IOStream&)*this); + MLDB_EAT_EXCEPTIONS(flush_stream((IOStream&)*this)); rdbuf(nullptr); - for (auto & filter: filters_) filter->close(); - if (cap_) cap_->close(); + for (auto & filter: filters_) MLDB_EAT_EXCEPTIONS(filter->close()); + if (cap_) MLDB_EAT_EXCEPTIONS(cap_->close()); } void push(std::streambuf & sb) { check_not_capped(); push_streambuf(sb); } @@ -125,9 +124,34 @@ struct filtering_stream: public IOStream { /*****************************************************************************/ struct buffered_ostreambuf: public filter_streambuf { - buffered_ostreambuf(size_t buffer_size = 4096) : buffer_(buffer_size) { setp(buffer_.data(), buffer_.data() + buffer_.size()); } + buffered_ostreambuf(size_t buffer_size = 4096) : buffer_(buffer_size) { reset_buffer(); } protected: std::vector buffer_; + virtual ssize_t flush_sink() = 0; + virtual int sync() override { return (flush_buffer() == EOF || flush_sink() == EOF) ? EOF : 0; } + virtual int overflow(int c) override { cerr << "overflow"; if (flush_buffer() == EOF) return EOF; return sputc(c); } + virtual std::streamsize xsputn(const char * s, std::streamsize n) override { cerr << "xsputn" << endl; return (flush_buffer() == EOF || sink_write_all(s, n) == EOF) ? EOF : n; } + ssize_t flush_buffer() + { + auto res = sink_write_all(buffer_.data(), pptr() - buffer_.data()); + reset_buffer(); + return res; + } + template ssize_t sink_write_impl(const char * s, size_t n, Sink & sink, Args&&... args) { return sink.write(std::forward(args)..., s, n); } + virtual ssize_t sink_write(const char * s, size_t n) = 0; + ssize_t sink_write_all(const char * s, size_t n) + { + cerr << "writing " << n << " chars to sink in " << typeid(*this).name() << endl; + size_t n2 = n; + while (n) { + auto res = sink_write(s, n); + if (res == EOF) return EOF; + n -= res; + s += res; + } + return n2; + } + void reset_buffer() { setp(buffer_.data(), buffer_.data() + buffer_.size()); } }; template @@ -137,10 +161,10 @@ struct sink_ostreambuf: public buffered_ostreambuf { virtual ~sink_ostreambuf() = default; const Sink & sink() const { return sink_; } Sink & sink() { return sink_; } - virtual std::streamsize xsputn(const char * s, std::streamsize n) override { return sink_.write(s, n); } - virtual int overflow(int c) override { if (c == EOF) MLDB_THROW_LOGIC_ERROR(); char c2 = c; return sink_.write(&c2, 1) == 1 ? 0 : -1; } - virtual int sync() override { sink_.flush(); return 0; } - virtual void close() override { sink_.close(); } + virtual void close() override { flush_buffer(); sink_.flush(); sink_.close(); } +protected: + virtual ssize_t flush_sink() override { sink_.flush(); return 0; } + virtual ssize_t sink_write(const char * s, size_t n) override { return sink_write_impl(s, n, sink_); } private: Sink sink_; }; @@ -152,9 +176,12 @@ struct filtering_ostreambuf: public buffered_ostreambuf { virtual ~filtering_ostreambuf() = default; const Filter & filter() const { return filter_; } Filter & filter() { return filter_; } - virtual std::streamsize xsputn(const char * s, std::streamsize n) override { return filter_.write(*this, s, n); } - virtual int sync() override { filter_.flush(*this); return 0; } - virtual void close() override { filter_.close(*this); } + //virtual std::streamsize xsputn(const char * s, std::streamsize n) override { return filter_.write(*this, s, n); } + //virtual int sync() override { filter_.flush(*this); return 0; } + virtual void close() override { flush_buffer(); filter_.flush(*this); filter_.close(*this); } +protected: + virtual ssize_t flush_sink() override { filter_.flush(*this); return 0; } + virtual ssize_t sink_write(const char * s, size_t n) override { return sink_write_impl(s, n, filter_, *this); } private: Filter filter_; }; @@ -172,7 +199,27 @@ struct filtering_ostream: public filtering_stream { struct buffered_istreambuf: public filter_streambuf { buffered_istreambuf(size_t buffer_size = 4096) : buffer_(buffer_size) {} - virtual int underflow() override { cerr << "underflow()" << endl; buf_fill(); return buf_empty() ? EOF : 0; } + virtual int underflow() override { buf_fill(); ExcAssert((eof() && buf_empty()) || !buf_empty()); return eof() ? EOF : *gptr(); } + +#if 1 + virtual std::streamsize xsgetn(char * s, std::streamsize n) override + { + // First get any buffered characters + cerr << "xsgetn of " << n << " characters" << endl; + size_t done = std::min(n, egptr() - gptr()); + std::copy_n(gptr(), done, s); + gbump(done); // results in gptr() == egptr() if done == n + cerr << "done = " << done << endl; + while (!eof() && done < n) { + auto nread = source_read(s + done, n - done); + if (nread == EOF) break; + done += nread; + } + cerr << "end of xsgetn: done = " << done << " eof = " << eof() << endl; + ExcAssert(done > 0 || eof()); + return done ? done : EOF; + } +#endif virtual std::streampos seekoff(std::streamoff off, std::ios_base::seekdir way, std::ios_base::openmode which) override { if (which != std::ios_base::in || way != std::ios_base::cur || off != 0) return EOF; @@ -186,16 +233,21 @@ struct buffered_istreambuf: public filter_streambuf { bool eof_ = false; bool buf_empty() const { return gptr() == egptr(); } void require_empty() { ExcAssert(buf_empty()); } - template void do_buf_fill(Source & source, Args&&... args) + void buf_fill() { require_empty(); - auto n = source.read(std::forward(args)..., buffer_.data(), buffer_.size()); - if (n == -1) eof_ = true; - else { - setg(buffer_.data(), buffer_.data(), buffer_.data() + n); - } + auto n = source_read(buffer_.data(), buffer_.size()); + if (n != EOF) setg(buffer_.data(), buffer_.data(), buffer_.data() + n); + } + virtual ssize_t source_read(char * s, size_t n) = 0; + template ssize_t do_source_read(char * s, size_t n, Source & source, Args&&... args) + { + if (eof_) return EOF; + auto res = source.read(std::forward(args)..., s, n); + eof_ = res == EOF; + pos_ += (res == EOF ? 0 : res); + return res; } - virtual void buf_fill() = 0; }; template @@ -205,20 +257,9 @@ struct source_istreambuf: public buffered_istreambuf { virtual ~source_istreambuf() = default; const Source & source() const { return source_; } Source & source() { return source_; } - virtual int underflow() override - { - buf_fill(); - if (eof()) { - ExcAssert(buf_empty()); - return EOF; - } - ExcAssert(!buf_empty()); - return *gptr(); - } virtual void close() override {} - protected: - virtual void buf_fill() override { do_buf_fill(source_); } + virtual ssize_t source_read(char * s, size_t n) override { return do_source_read(s, n, source_); } Source source_; }; @@ -229,11 +270,9 @@ struct filtering_istreambuf: public buffered_istreambuf { virtual ~filtering_istreambuf() = default; const Filter & filter() const { return filter_; } Filter & filter() { return filter_; } - //virtual std::streamsize xsgetn(char * s, std::streamsize n) override { return filter_.read(*this, s, n); } - //virtual int sync() override { filter_.flush(*this); return 0; } virtual void close() override {} protected: - virtual void buf_fill() override { do_buf_fill(filter_, *this); } + virtual ssize_t source_read(char * s, size_t n) override { return do_source_read(s, n, filter_, *this); } Filter filter_; }; @@ -422,7 +461,7 @@ struct file_descriptor_sink { close_handle close_handle_ = never_close_handle; }; - +#endif /*****************************************************************************/ /* URI HANDLING */ @@ -1474,6 +1513,7 @@ struct RegisterFileHandler { auto keepMe = std::make_shared(); mapped_file_params params(resource.rawString()); + params.extra_capacity = MAPPING_EXTRA_CAPACITY; mapped_file_source source(params); auto buf = std::make_shared>(source); diff --git a/vfs/http_streambuf.cc b/vfs/http_streambuf.cc index 9dc5b0357..e8d015c3c 100644 --- a/vfs/http_streambuf.cc +++ b/vfs/http_streambuf.cc @@ -6,7 +6,6 @@ */ #include -#include #include "mldb/http/http_rest_proxy.h" #include "mldb/vfs/filter_streams_registry.h" #include "mldb/vfs/fs_utils.h" @@ -16,7 +15,7 @@ #include #include #include "mldb/ext/concurrentqueue/blockingconcurrentqueue.h" - +#include "mldb/base/iostream_adaptors.h" using namespace std; using moodycamel::BlockingConcurrentQueue; @@ -97,6 +96,7 @@ struct HttpStreamingDownloadSource { } typedef char char_type; +#if 0 struct category : boost::iostreams::input_seekable, @@ -104,6 +104,10 @@ struct HttpStreamingDownloadSource { boost::iostreams::closable_tag, boost::iostreams::multichar_tag { }; +#endif + + using is_source = std::true_type; + using is_seekable = std::true_type; struct Impl { Impl(const Utf8String & urlStr, @@ -367,7 +371,7 @@ makeHttpStreamingDownload(const Utf8String & uri, std::unique_ptr result; HttpStreamingDownloadSource source(uri, options, onException); const HttpHeader & header = source.getHeader(); - result.reset(new boost::iostreams::stream_buffer + result.reset(new source_istreambuf (source, 131072)); return { std::move(result), convertHeaderToInfo(header) }; } diff --git a/vfs/testing/filter_streams_test.cc b/vfs/testing/filter_streams_test.cc index c7d1e7ce0..cadae9b44 100644 --- a/vfs/testing/filter_streams_test.cc +++ b/vfs/testing/filter_streams_test.cc @@ -18,7 +18,6 @@ #include "mldb/arch/exception_handler.h" #include "mldb/compiler/filesystem.h" -#include #include #include #include @@ -33,6 +32,7 @@ #include "mldb/arch/demangle.h" #include "mldb/base/hex_dump.h" #include "mldb/utils/environment.h" +#include "mldb/base/iostream_adaptors.h" using namespace std; namespace fs = std::filesystem; @@ -440,11 +440,7 @@ struct ExceptionSource { } typedef char char_type; - struct category - : public boost::iostreams::bidirectional_device_tag, - public boost::iostreams::closable_tag - { - }; + using is_source = std::true_type; bool is_open() const { @@ -487,9 +483,7 @@ struct RegisterExcHandlers { { shared_ptr handler; - handler.reset(new boost::iostreams::stream_buffer - (ExceptionSource(onException, throwType), - 1)); + handler.reset(new source_istreambuf(ExceptionSource(onException, throwType), 1)); FsObjectInfo info; info.exists = true; return UriHandler(handler.get(), handler, info); @@ -634,10 +628,9 @@ BOOST_AUTO_TEST_CASE(test_filter_stream_mapping) getline(stream1, str); BOOST_CHECK(stream1.good()); - int c = stream1.get(); - BOOST_CHECK_EQUAL(c, '\n'); + int c MLDB_UNUSED = stream1.get(); BOOST_CHECK(!stream1.bad()); - BOOST_CHECK(!stream1.fail()); + BOOST_CHECK(stream1.fail()); BOOST_CHECK(stream1.eof()); diff --git a/vfs/vfs.mk b/vfs/vfs.mk index cd71255fe..b0422a43c 100644 --- a/vfs/vfs.mk +++ b/vfs/vfs.mk @@ -19,7 +19,6 @@ LIBVFS_SOURCES := \ LIBVFS_LINK := \ arch \ - boost_iostreams \ types \ $(STD_FILESYSTEM_LIBNAME) \ http \ diff --git a/vfs_handlers/aws/s3_handlers.cc b/vfs_handlers/aws/s3_handlers.cc index f038a0114..c99351218 100644 --- a/vfs_handlers/aws/s3_handlers.cc +++ b/vfs_handlers/aws/s3_handlers.cc @@ -11,7 +11,6 @@ #include #include #include -#include #include "mldb/utils/string_functions.h" #include "mldb/base/exc_assert.h" #include "mldb/base/hash.h" @@ -23,6 +22,9 @@ #include "mldb/arch/wait_on_address.h" #include "mldb/utils/split.h" #include "mldb/utils/starts_with.h" +#include "mldb/base/iostream_adaptors.h" +#include + using namespace std; using namespace MLDB; @@ -485,12 +487,16 @@ struct StreamingDownloadSource { } typedef char char_type; + using is_source = std::true_type; + +#if 0 struct category : //input_seekable, boost::iostreams::input, boost::iostreams::device_tag, boost::iostreams::closable_tag { }; +#endif std::streamsize read(char_type * s, std::streamsize n) { @@ -519,7 +525,7 @@ makeStreamingDownload(const Utf8String & uri) { std::unique_ptr result; StreamingDownloadSource source(uri); - result.reset(new boost::iostreams::stream_buffer + result.reset(new source_istreambuf (source,131072)); return make_pair(std::move(result), source.info()); } @@ -755,12 +761,16 @@ struct StreamingUploadSource { } typedef char char_type; + + using is_sink = std::true_type; +#if 0 struct category : public boost::iostreams::output, public boost::iostreams::device_tag, public boost::iostreams::closable_tag { }; +#endif std::streamsize write(const char_type* s, std::streamsize n) { @@ -789,7 +799,7 @@ makeStreamingUpload(const Utf8String & uri, const S3Api::ObjectMetadata & metadata) { std::unique_ptr result; - result.reset(new boost::iostreams::stream_buffer + result.reset(new sink_ostreambuf (StreamingUploadSource(uri, onException, metadata), 131072)); return result; diff --git a/vfs_handlers/sftp.cc b/vfs_handlers/sftp.cc index 4aa63f598..d306ea3af 100644 --- a/vfs_handlers/sftp.cc +++ b/vfs_handlers/sftp.cc @@ -8,7 +8,6 @@ */ #include -#include #include "mldb/vfs_handlers/sftp.h" #include #include @@ -31,6 +30,7 @@ #include #include #include +#include "mldb/base/iostream_adaptors.h" using namespace std; @@ -638,12 +638,15 @@ struct SftpStreamingDownloadSource { } typedef char char_type; +#if 0 struct category : public boost::iostreams::input /*_seekable*/, public boost::iostreams::device_tag, public boost::iostreams::closable_tag { }; - +#endif + using is_source = std::true_type; + struct Impl { Impl() : owner(0), offset(0), handle(0) @@ -682,7 +685,7 @@ struct SftpStreamingDownloadSource { std::streamsize read(char_type* s, std::streamsize n) { - BOOST_STATIC_ASSERT(sizeof(char_type) == 1); + static_assert(sizeof(char_type) == 1, "only works for single-byte chars"); ssize_t numRead = libssh2_sftp_read(handle, s, n); if (numRead < 0) { @@ -733,12 +736,15 @@ struct SftpStreamingUploadSource { } typedef char char_type; +#if 0 struct category : public boost::iostreams::output, public boost::iostreams::device_tag, public boost::iostreams::closable_tag { }; +#endif + using is_source = std::true_type; struct Impl { Impl() @@ -884,7 +890,7 @@ streamingUploadStreambuf(const Utf8String & path, const OnUriHandlerException & onException) const { std::unique_ptr result; - result.reset(new boost::iostreams::stream_buffer + result.reset(new sink_ostreambuf (SftpStreamingUploadSource(this, path, onException), 131072)); return result; @@ -906,7 +912,7 @@ SftpConnection:: streamingDownloadStreambuf(const Utf8String & path) const { std::unique_ptr result; - result.reset(new boost::iostreams::stream_buffer + result.reset(new source_istreambuf (SftpStreamingDownloadSource(this, path), 131072)); return result; From 415e2dd85ea1069a3b8818a0c5e451bfc8ef5851 Mon Sep 17 00:00:00 2001 From: Jeremy Barnes Date: Thu, 16 Jan 2025 19:40:08 -0500 Subject: [PATCH 14/39] FIXUP boost iostreams --- base/iostream_adaptors.cc | 234 ++++++++++++++++++ base/iostream_adaptors.h | 321 +++++++++++++++++++++++++ base/testing/iostream_adaptors_test.cc | 25 ++ 3 files changed, 580 insertions(+) create mode 100644 base/iostream_adaptors.cc create mode 100644 base/iostream_adaptors.h create mode 100644 base/testing/iostream_adaptors_test.cc diff --git a/base/iostream_adaptors.cc b/base/iostream_adaptors.cc new file mode 100644 index 000000000..07a25292f --- /dev/null +++ b/base/iostream_adaptors.cc @@ -0,0 +1,234 @@ +/* iostream_adaptors.cc + Jeremy Barnes, 17 March 2005 + Copyright (c) 2005 Jeremy Barnes. All rights reserved. + This file is part of MLDB. Copyright 2015 mldb.ai inc. All rights reserved. + + This file is part of "Jeremy's Machine Learning Library", copyright (c) + 1999-2015 Jeremy Barnes. + + Apache 2.0 license. + + --- + + IOStream adaptors for the implementation of filter streams. + Interface is based on boost::iostream. +*/ + +#include "iostream_adaptors.h" +#include +#include +#include +#include +#include "mldb/base/scope.h" +#include "mldb/arch/vm.h" + + +namespace MLDB { + +using namespace std; + +/*****************************************************************************/ +/* FREE FUNCTIONS */ +/*****************************************************************************/ + + +/*****************************************************************************/ +/* BASE CLASSES CLASSES */ +/*****************************************************************************/ + + +/*****************************************************************************/ +/* FILTER OSTREAM CLASSES */ +/*****************************************************************************/ + +ssize_t buffered_ostreambuf::flush_buffer() +{ + auto res = sink_write_all(buffer_.data(), pptr() - buffer_.data()); + reset_buffer(); + return res; +} +ssize_t buffered_ostreambuf::sink_write_all(const char * s, size_t n) +{ + size_t n2 = n; + while (n) { + auto res = sink_write(s, n); + if (res == EOF) return EOF; + n -= res; + s += res; + } + return n2; +} + +/*****************************************************************************/ +/* FILTER ISTREAM CLASSES */ +/*****************************************************************************/ + +std::streamsize buffered_istreambuf::xsgetn(char * s, std::streamsize n) +{ + // First get any buffered characters + //cerr << "xsgetn of " << n << " characters" << endl; + size_t done = std::min(n, egptr() - gptr()); + std::memcpy(s, gptr(), done); + gbump(done); // results in gptr() == egptr() if done == n + //cerr << "done = " << done << endl; + while (!eof() && done < n) { + auto nread = source_read(s + done, n - done); + if (nread == EOF) break; + done += nread; + } + //cerr << "end of xsgetn: done = " << done << " eof = " << eof() << endl; + ExcAssert(done > 0 || eof()); + return done ? done : EOF; +} + +std::streampos buffered_istreambuf::seekoff(std::streamoff off, std::ios_base::seekdir way, std::ios_base::openmode which) +{ + if (which != std::ios_base::in || way != std::ios_base::cur || off != 0) return EOF; + return pos_ + gptr() - eback(); +} + +void buffered_istreambuf::buf_fill() +{ + require_empty(); + auto n = source_read(buffer_.data(), buffer_.size()); + if (n != EOF) setg(buffer_.data(), buffer_.data(), buffer_.data() + n); +} + +/*****************************************************************************/ +/* MEMORY MAPPING */ +/*****************************************************************************/ + + +mapped_file_source::mapped_file_source(mapped_file_params params) +{ + Scope_Exit(if (params.fd != -1) ::close(params.fd)); + if (params.fd == -1) { + params.fd = open(params.filename.c_str(), O_RDONLY); + if (params.fd == -1) + throw Exception(errno, "open"); + } + if (params.size == -1) { + struct stat st; + if (fstat(params.fd, &st) == -1) + throw Exception(errno, "fstat"); + params.size = st.st_size; + } + size_t offset = roundDownToPageSize(params.offset); + size_t skip = params.offset - offset; + size_t capacity = roundUpToPageSize(params.size + params.extra_capacity - offset); + size_t capacityWithoutGuardPage = roundUpToPageSize(params.size - offset); + //cerr << "capacity = " << capacity << " capacityWithoutGuardPage = " << capacityWithoutGuardPage << endl; + //cerr << "skip = " << skip << endl; + //cerr << "offset = " << offset << endl; + // + //cerr << "mapping " << capacity << " of " << params.size << " bytes from " << params.filename << " at offset " << params.offset << endl; + //cerr << "skipping " << skip << " bytes" << endl; + + auto check_mmap = [&] (void * p) { + if (p == MAP_FAILED) + throw Exception(errno, "mmap"); + }; + + std::shared_ptr addr; + // In order to map the file with extra capacity, we may need to map an extra page + // if the file itself had nearly filled up the last page. If that happens, we first + // map the entire range as nulls, and then map the file on top of the first part + // so that the extra capacity is at the end. This is because OSX doesn't like + // MAP_FIXED on an unmapped page. + if (capacity == capacityWithoutGuardPage) { + // No extra page + addr = std::shared_ptr + (mmap(nullptr, capacity, + PROT_READ, MAP_PRIVATE, params.fd, params.offset), + [=] (void * p) { munmap(p, page_size); }); + check_mmap(addr.get()); + } + else { + // Firstly, make an anonymous zero-filled mapping + addr = std::shared_ptr + (mmap(nullptr, capacity, PROT_READ, MAP_PRIVATE | MAP_ANON, -1, 0), + [=] (void * p) { munmap(p, page_size); }); + check_mmap(addr.get()); + + // Now remap the file on all but the last page + void * addr2 = mmap(addr.get(), capacity - page_size, PROT_READ, MAP_PRIVATE | MAP_FIXED, params.fd, params.offset); + if (addr2 == MAP_FAILED) + throw Exception(errno, "mmap"); + if (addr2 != addr.get()) + MLDB_THROW_LOGIC_ERROR("mmap: remapped to different address"); + } + + data_ = (const char *)addr.get() + skip; + ptr_ = data_; + size_ = params.size - params.offset; + capacity_ = capacity - skip; + region_ = std::move(addr); + + //cerr << "data_ = " << (void *)data_ << endl; + //cerr << "ptr_ = " << (void *)ptr_ << endl; + //cerr << "size_ = " << size_ << endl; + //cerr << "capacity_ = " << capacity_ << endl; + //cerr << "region_ = " << (void *)region_.get() << endl; +} + +ssize_t mapped_file_source::read(char * s, size_t n) +{ + //cerr << "reading " << n << " bytes from mapped file" << endl; + size_t left = avail(); + if (left == 0) + return EOF; + n = std::min(n, left); + memcpy(s, ptr_, n); + ptr_ += n; + //cerr << "read " << n << " bytes from mapped file" << endl; + return n; +} + +/*****************************************************************************/ +/* FILE DESCRIPTOR */ +/*****************************************************************************/ + +file_descriptor_sink::file_descriptor_sink(int fd, close_handle close_handle) + : fd_(fd), close_handle_(close_handle) +{ +} + +file_descriptor_sink::file_descriptor_sink(file_descriptor_sink && other) + : fd_(other.fd_), close_handle_(other.close_handle_) +{ + other.fd_ = -1; +} + +void file_descriptor_sink::swap(file_descriptor_sink & other) +{ + std::swap(fd_, other.fd_); + std::swap(close_handle_, other.close_handle_); +} + +file_descriptor_sink::~file_descriptor_sink() +{ + close(); +} + +void file_descriptor_sink::close() +{ + if (fd_ != -1) { + if (close_handle_ == always_close_handle) + ::close(fd_); + fd_ = -1; + } +} + +void file_descriptor_sink::flush() +{ +} + +ssize_t file_descriptor_sink::write(const char * data, size_t len) +{ + auto res = ::write(fd_, data, len); + if (res == -1) + throw Exception(errno, "write"); + return res; +} + +} // namespace MLDB diff --git a/base/iostream_adaptors.h b/base/iostream_adaptors.h new file mode 100644 index 000000000..f2af770f0 --- /dev/null +++ b/base/iostream_adaptors.h @@ -0,0 +1,321 @@ +/* iostream_adaptors.h + Jeremy Barnes, 17 March 2005 + Copyright (c) 2005 Jeremy Barnes. All rights reserved. + This file is part of MLDB. Copyright 2015 mldb.ai inc. All rights reserved. + + This file is part of "Jeremy's Machine Learning Library", copyright (c) + 1999-2015 Jeremy Barnes. + + Apache 2.0 license. + + --- + + IOStream adaptors for the implementation of filter streams. + Interface is based on boost::iostream. +*/ + +#pragma once + +#include +#include +#include +#include +#include +#include "mldb/arch/exception.h" +#include "mldb/compiler/compiler.h" +#include "mldb/base/exc_check.h" +#include "mldb/base/exc_assert.h" + +namespace MLDB { + +/*****************************************************************************/ +/* FREE FUNCTIONS */ +/*****************************************************************************/ + +template +struct has_flush { + template static auto test(int) -> decltype(std::declval().flush(), std::true_type()); + template static auto test(...) -> std::false_type; + using type = decltype(test(0)); + static constexpr bool value = type::value; +}; + +template constexpr bool has_flush_v = has_flush::value; +template using has_flush_t = has_flush::type; + +template void close_stream(Stream& stream) { stream.close(); } +inline void close_stream(std::istream & stream) { /* nothing to do */ } +template void flush_stream(Stream& stream, std::enable_if_t> * = 0) { stream.flush(); } +template void flush_stream(Stream& stream, std::enable_if_t> * = 0) { } + +template +ssize_t write_stream(std::ostream& stream, const char * data, size_t len) +{ + stream.write(data, len); + if (!stream) + throw Exception("unable to write data"); + return len; +} + +template ssize_t write_stream(Stream& stream, const char * data, size_t len) { return stream.write(data, len); } +template ssize_t read_stream(Stream& stream, char * data, size_t len) { return stream.read(data, len); } + + +/*****************************************************************************/ +/* BASE CLASSES */ +/*****************************************************************************/ + +// Similar interface to boost::iostreams, except that these: +// a) don't use boost +// b) minimize template metaprogramming +// c) can map extra space at the end of a memory mapped file, allowing for +// algorithms that require specific alignment to work efficiently + +struct filter_streambuf: public std::streambuf { + virtual ~filter_streambuf() = default; + virtual void close() = 0; // should ensure that nothing more is written to the output + void set_output(std::streambuf * sb) { output_ = sb; } + bool has_output() const { return output_; } + + std::streamsize write(const char* s, std::streamsize n) { return require_output()->sputn(s, n); } + std::streamsize read(char* s, std::streamsize n) { return require_output()->sgetn(s, n); } + void flush() { require_output()->pubsync(); } + +protected: + void check_output() const { ExcCheck(output_, "Attempt to use non-capped filter_streambuf"); } + std::streambuf * require_output() const { check_output(); return output_; } + +private: + std::streambuf * output_ = nullptr; +}; + +template +struct filtering_stream: public IOStream { + using IOStream::rdbuf; + filtering_stream() : IOStream(nullptr) + { + } + + virtual ~filtering_stream() + { + MLDB_EAT_EXCEPTIONS(flush_stream((IOStream&)*this)); + rdbuf(nullptr); + for (auto & filter: filters_) MLDB_EAT_EXCEPTIONS(filter->close()); + if (cap_) MLDB_EAT_EXCEPTIONS(cap_->close()); + } + + void push(std::streambuf & sb) { check_not_capped(); push_streambuf(sb); } + + bool empty() const { return filters_.empty() && !cap_ && !rdbuf(); } + bool capped() const { return rdbuf() && (filters_.empty() || filters_.back()->has_output()); } + +protected: + void check_not_capped() const { ExcCheck(!cap_, "Attempt to push a second sink into a filtering_stream"); } + void push_streambuf(std::streambuf & sb) { if (!rdbuf()) { rdbuf(&sb); } else filters_.back()->set_output(&sb); } + template void push_cap(Cap cap) { check_not_capped(); push_streambuf(*(cap_ = std::make_unique(std::move(cap)))); } + template void push_filter(Filter filter) + { + check_not_capped(); + filters_.emplace_back(std::make_unique(std::move(filter))); + push_streambuf(*filters_.back()); + } +private: + std::vector> filters_; + std::unique_ptr cap_; +}; + +template struct filtering_stream; +template struct filtering_stream; + + +/*****************************************************************************/ +/* FILTER OSTREAM CLASSES */ +/*****************************************************************************/ + +struct buffered_ostreambuf: public filter_streambuf { + buffered_ostreambuf(size_t buffer_size = 4096) : buffer_(buffer_size) { reset_buffer(); } +protected: + std::vector buffer_; + virtual ssize_t flush_sink() = 0; + virtual int sync() override { return (flush_buffer() == EOF || flush_sink() == EOF) ? EOF : 0; } + virtual int overflow(int c) override { if (flush_buffer() == EOF) return EOF; return sputc(c); } + virtual std::streamsize xsputn(const char * s, std::streamsize n) override { return (flush_buffer() == EOF || sink_write_all(s, n) == EOF) ? EOF : n; } + ssize_t flush_buffer(); + template ssize_t sink_write_impl(const char * s, size_t n, Sink & sink, Args&&... args) { return sink.write(std::forward(args)..., s, n); } + virtual ssize_t sink_write(const char * s, size_t n) = 0; + ssize_t sink_write_all(const char * s, size_t n); + void reset_buffer() { setp(buffer_.data(), buffer_.data() + buffer_.size()); } +}; + +template +struct sink_ostreambuf: public buffered_ostreambuf { + using base_type = buffered_ostreambuf; + sink_ostreambuf(Sink sink, size_t buffer_size = 4096) : base_type(buffer_size), sink_(std::move(sink)) {} + virtual ~sink_ostreambuf() = default; + const Sink & sink() const { return sink_; } + Sink & sink() { return sink_; } + virtual void close() override { flush_buffer(); flush_stream(sink_); sink_.close(); } +protected: + virtual ssize_t flush_sink() override { flush_stream(sink_); return 0; } + virtual ssize_t sink_write(const char * s, size_t n) override { return sink_write_impl(s, n, sink_); } +private: + Sink sink_; +}; + +template +struct filtering_ostreambuf: public buffered_ostreambuf { + using base_type = buffered_ostreambuf; + filtering_ostreambuf(Filter filter, size_t buffer_size = 4096) : base_type(buffer_size), filter_(std::move(filter)) {} + virtual ~filtering_ostreambuf() = default; + const Filter & filter() const { return filter_; } + Filter & filter() { return filter_; } + virtual void close() override { flush_buffer(); filter_.flush(*this); filter_.close(*this); } +protected: + virtual ssize_t flush_sink() override { filter_.flush(*this); return 0; } + virtual ssize_t sink_write(const char * s, size_t n) override { return sink_write_impl(s, n, filter_, *this); } +private: + Filter filter_; +}; + +struct filtering_ostream: public filtering_stream { + using filtering_stream::push; + template void push(Sink sink, typename Sink::is_sink::type = {}) { push_cap>(std::move(sink)); } + template void push(Filter filter, typename Filter::is_filter::type = {}) { push_filter>(std::move(filter)); } +}; + + +/*****************************************************************************/ +/* FILTER ISTREAM CLASSES */ +/*****************************************************************************/ + +struct buffered_istreambuf: public filter_streambuf { + buffered_istreambuf(size_t buffer_size = 4096) : buffer_(buffer_size) {} + virtual int underflow() override { buf_fill(); ExcAssert((eof() && buf_empty()) || !buf_empty()); return eof() ? EOF : *gptr(); } + virtual std::streamsize xsgetn(char * s, std::streamsize n) override; + virtual std::streampos seekoff(std::streamoff off, std::ios_base::seekdir way, std::ios_base::openmode which) override; + bool eof() const { return eof_; } + +protected: + std::vector buffer_; + ssize_t pos_ = 0; + bool eof_ = false; + bool buf_empty() const { return gptr() == egptr(); } + void require_empty() { ExcAssert(buf_empty()); } + void buf_fill(); + virtual ssize_t source_read(char * s, size_t n) = 0; + template ssize_t do_source_read(char * s, size_t n, Source & source, Args&&... args) + { + if (eof_) return EOF; + auto res = source.read(std::forward(args)..., s, n); + eof_ = res == EOF; + pos_ += (res == EOF ? 0 : res); + return res; + } +}; + +template +struct source_istreambuf: public buffered_istreambuf { + using base_type = buffered_istreambuf; + source_istreambuf(Source source, size_t buffer_size = 4096) : base_type(buffer_size), source_(std::move(source)) {} + virtual ~source_istreambuf() = default; + const Source & source() const { return source_; } + Source & source() { return source_; } + virtual void close() override {} +protected: + virtual ssize_t source_read(char * s, size_t n) override { return do_source_read(s, n, source_); } + Source source_; +}; + +template +struct filtering_istreambuf: public buffered_istreambuf { + using base_type = buffered_istreambuf; + filtering_istreambuf(Filter filter, size_t buffer_size = 4096) : base_type(buffer_size), filter_(std::move(filter)) {} + virtual ~filtering_istreambuf() = default; + const Filter & filter() const { return filter_; } + Filter & filter() { return filter_; } + virtual void close() override {} +protected: + virtual ssize_t source_read(char * s, size_t n) override { return do_source_read(s, n, filter_, *this); } + Filter filter_; +}; + +struct filtering_istream: public filtering_stream { + using filtering_stream::push; + template void push(Source source, typename Source::is_source::type = {}) { push_cap>(std::move(source)); } + template void push(Filter filter, typename Filter::is_filter::type = {}) { push_filter>(std::move(filter)); } +}; + +#if 0 +template +struct stream_buffer: public source_istreambuf { + stream_buffer(Source source, size_t /*buffer_size*/ = 4096): source_istreambuf(std::move(source)) {} +}; +#endif + +/*****************************************************************************/ +/* MEMORY MAPPING */ +/*****************************************************************************/ + +struct mapped_file_params { + std::string filename; + int fd = -1; + size_t offset = 0; + ssize_t size = -1; + ssize_t extra_capacity = 0; +}; + +struct mapped_file_source { + using is_source = std::true_type; + mapped_file_source(mapped_file_params params); + + const char * data() const { return data_; } + size_t size() const { return size_; } + size_t avail() const { return data_ + size_ - ptr_; } + size_t capacity() const { return capacity_; } + size_t extra_capacity() const { return capacity_ - size_; } + + ssize_t read(char * s, size_t n); + + int fd_ = -1; + std::shared_ptr region_; + const char * data_ = nullptr; + const char * ptr_ = nullptr; + size_t size_ = 0; + size_t capacity_ = 0; +}; + + +/*****************************************************************************/ +/* FILE DESCRIPTOR */ +/*****************************************************************************/ + +enum close_handle { + never_close_handle = false, + always_close_handle = true +}; + +struct file_descriptor_sink { + using is_sink = std::true_type; + file_descriptor_sink(int fd, close_handle close_handle = never_close_handle); + file_descriptor_sink(file_descriptor_sink && other); + + void swap(file_descriptor_sink & other); + file_descriptor_sink & operator = (file_descriptor_sink && other) + { + swap(other); + return *this; + } + + ~file_descriptor_sink(); + + void close(); + void flush(); + + ssize_t write(const char * data, size_t len); + +protected: + int fd_ = -1; + close_handle close_handle_ = never_close_handle; +}; + +} // namespace MLDB diff --git a/base/testing/iostream_adaptors_test.cc b/base/testing/iostream_adaptors_test.cc new file mode 100644 index 000000000..41179936b --- /dev/null +++ b/base/testing/iostream_adaptors_test.cc @@ -0,0 +1,25 @@ +/* iostream_adaptors_test.cc + Jeremy Barnes, 17 March 2005 + Copyright (c) 2005 Jeremy Barnes. All rights reserved. + This file is part of MLDB. Copyright 2015 mldb.ai inc. All rights reserved. + + This file is part of "Jeremy's Machine Learning Library", copyright (c) + 1999-2015 Jeremy Barnes. + + Apache 2.0 license. + + --- + + IOStream adaptors for the implementation of filter streams. + Interface is based on boost::iostream. +*/ + +#include "catch2/catch_all.hpp" +#include "mldb/base/iostream_adaptors.h" + +using namespace std; +using namespace MLDB; + +TEST_CASE("test1") +{ +} From 6de35efc452e3ab3d4ba338f5b32bc1f688d50f0 Mon Sep 17 00:00:00 2001 From: Jeremy Barnes Date: Thu, 16 Jan 2025 19:40:49 -0500 Subject: [PATCH 15/39] FIXUP missing type_info for half (un-break Linux) --- arch/missing_typeids.cc | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/arch/missing_typeids.cc b/arch/missing_typeids.cc index aee1ca8af..b4c1b7ca5 100644 --- a/arch/missing_typeids.cc +++ b/arch/missing_typeids.cc @@ -1,6 +1,8 @@ #include #include +#ifdef __clang__ +#ifdef __APPLE__ // Sometimes the typeinfo node for _Float16 is missing (llvm on OSX, at least) // Create it here if that's the case struct HalfTypeInfo: public std::type_info { @@ -8,4 +10,5 @@ struct HalfTypeInfo: public std::type_info { }; HalfTypeInfo _ZTIDF16_ __attribute__((__weak__)); - +#endif /* __APPLE__ */ +#endif /* __clang__ */ From dcb08cc1eb5a9bfee901f3b8ee78f764b0ba8e45 Mon Sep 17 00:00:00 2001 From: Jeremy Barnes Date: Thu, 16 Jan 2025 19:41:54 -0500 Subject: [PATCH 16/39] Fix crashes when converting exceptions to std::exception (TRIVIAL) --- arch/rtti_utils.cc | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/arch/rtti_utils.cc b/arch/rtti_utils.cc index f37a05f3f..78f8b82ba 100644 --- a/arch/rtti_utils.cc +++ b/arch/rtti_utils.cc @@ -80,7 +80,8 @@ const void * is_convertible(const std::type_info & from_type, //cerr << "could upcast" << endl; return ur.dst_ptr; } - + return nullptr; + //cerr << "couldn't upcast" << endl; //const char * adj_ptr = (const char *)obj; From 57157a436dfbc6fa815e0d9669e4c9744db842d4 Mon Sep 17 00:00:00 2001 From: Jeremy Barnes Date: Thu, 16 Jan 2025 19:42:19 -0500 Subject: [PATCH 17/39] Python virtualenv fixups (TRIVIAL) --- builtin/python/python_interpreter.cc | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/builtin/python/python_interpreter.cc b/builtin/python/python_interpreter.cc index 33f40a277..d7d4234a1 100644 --- a/builtin/python/python_interpreter.cc +++ b/builtin/python/python_interpreter.cc @@ -593,8 +593,9 @@ PythonInterpreter(InitializationContext context) if (auto venv_path = std::getenv("MLDB_VIRTUAL_ENV")) { std::wstring venv(venv_path, venv_path + strlen(venv_path)); - venv += L"/bin"; - //venv += L"/lib/python" + std::wstring(pythonMajorMinor.begin(), pythonMajorMinor.end()) + L"/site-packages"; + //venv += L"/bin"; + venv += L"/lib/python" + std::wstring(pythonMajorDotMinor.begin(), pythonMajorDotMinor.end()) + L"/site-packages"; + cerr << "adding virtual env path " << venv << endl; checkStatus(PyWideStringList_Append(&config.module_search_paths, venv.c_str())); } From 0b17ed95984a52a1f8ab4e834cba282320ad5f7a Mon Sep 17 00:00:00 2001 From: Jeremy Barnes Date: Thu, 16 Jan 2025 19:42:58 -0500 Subject: [PATCH 18/39] FIXUP osx code signing --- jml-build/functions.mk | 3 ++- jml-build/os/Darwin.mk | 2 +- jml-build/os/osx-sign-binary.sh | 7 +++++++ 3 files changed, 10 insertions(+), 2 deletions(-) create mode 100755 jml-build/os/osx-sign-binary.sh diff --git a/jml-build/functions.mk b/jml-build/functions.mk index be346aaa5..da9ca4df9 100644 --- a/jml-build/functions.mk +++ b/jml-build/functions.mk @@ -465,7 +465,7 @@ $$(LIB_$(1)_SO): $$(dir $$(LIB_$(1)_SO))/.dir_exists $$(OBJFILES_$(1)) $$(foreac $$(if $(verbose_build),@echo $$(LINK_$(1)_COMMAND2),@echo " $(COLOR_YELLOW)[SO]$(COLOR_RESET) $$(LIB_$(1)_FILENAME)") @$(call write_timing_to,$$@.timing) $$(LINK_$(1)_COMMAND2) $$(if $(verbose_build),,@echo " $(COLOR_YELLOW) $(COLOR_RESET) $(COLOR_DARK_GRAY)`awk -f mldb/jml-build/print-timing.awk $$@.timing`$(COLOR_RESET) $$(LIB_$(1)_FILENAME)") - $(if $(POST_LINK_COMMAND)$(POST_LINK_COMMAND_$(1)),@$(if $(POST_LINK_COMMAND_$(1)),$(POST_LINK_COMMAND_$(1)),$(POST_LINK_COMMAND)) $$(LIB_$(1)_SO)) + $(if $(POST_LINK_COMMAND)$(POST_LINK_COMMAND_$(1)),$(if $(POST_LINK_COMMAND_$(1)),$(POST_LINK_COMMAND_$(1)),$(POST_LINK_COMMAND)) $$(LIB_$(1)_SO)) $$(tmpLIBNAME): $$(sodir)/$$(tmpLIBNAME)$$(so) .PHONY: $$(tmpLIBNAME) @@ -575,6 +575,7 @@ LINK_$(1)_COMMAND:=$$(CXX) $$(CXXFLAGS) $$(CXXEXEFLAGS) $$(CXXNODEBUGFLAGS) -o $ $(TESTS)/$(1): $(TESTS)/.dir_exists $(TEST_TMP)/.dir_exists $$($(1)_OBJFILES) $$(foreach lib,$(2),$$(LIB_$$(lib)_DEPS)) $$(LIB)/libexception_hook$(SO_EXTENSION) $$(if $(verbose_build),@echo $$(LINK_$(1)_COMMAND),@echo " $(COLOR_BLUE)[TESTBIN]$(COLOR_RESET) $(1)") @$$(LINK_$(1)_COMMAND) + $(if $(POST_LINK_COMMAND)$(POST_LINK_COMMAND_$(1)),@$(if $(POST_LINK_COMMAND_$(1)),$(POST_LINK_COMMAND_$(1)),$(POST_LINK_COMMAND)) $$(LIB_$(1)_SO)) tests: $(TESTS)/$(1) $$(CURRENT)_tests: $(TESTS)/$(1) diff --git a/jml-build/os/Darwin.mk b/jml-build/os/Darwin.mk index af30801dd..033f2cab1 100644 --- a/jml-build/os/Darwin.mk +++ b/jml-build/os/Darwin.mk @@ -89,7 +89,7 @@ LLVM_LIB_NAME:=LLVM-19 LIB_$(LLVM_LIB_NAME)_LINKER_OPTIONS+=-L$(LLVM_LIB_PATH) # This provides attributes allowing easier debugability including core files -POST_LINK_COMMAND:=codesign -s - -f --entitlements $(JML_BUILD)/os/mldb.debug.entitlements.plist +POST_LINK_COMMAND:=$(JML_BUILD)/os/osx-sign-binary.sh # Build and load Make extentions that allow us to avoid shell execution ifneq ($(DONE_LOAD),1) diff --git a/jml-build/os/osx-sign-binary.sh b/jml-build/os/osx-sign-binary.sh new file mode 100755 index 000000000..f2321c54c --- /dev/null +++ b/jml-build/os/osx-sign-binary.sh @@ -0,0 +1,7 @@ +#!/bin/bash +# This script is used to sign a binary on OSX so that it can be debugged and dump core. +#echo "Signing $1" +set -e +#set -x +codesign -s - -f --entitlements mldb/jml-build/os/mldb.debug.entitlements.plist $1 > $1.codesign.log 2>&1 +#codesign -vvv $1 >> $1.codesign.log 2>&1 From fef24b23d3e040566a26a1f708dfbc7167db9bd0 Mon Sep 17 00:00:00 2001 From: Jeremy Barnes Date: Thu, 16 Jan 2025 19:54:08 -0500 Subject: [PATCH 19/39] FIXUP code signing --- jml-build/functions.mk | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/jml-build/functions.mk b/jml-build/functions.mk index da9ca4df9..1f7f3e30c 100644 --- a/jml-build/functions.mk +++ b/jml-build/functions.mk @@ -465,7 +465,7 @@ $$(LIB_$(1)_SO): $$(dir $$(LIB_$(1)_SO))/.dir_exists $$(OBJFILES_$(1)) $$(foreac $$(if $(verbose_build),@echo $$(LINK_$(1)_COMMAND2),@echo " $(COLOR_YELLOW)[SO]$(COLOR_RESET) $$(LIB_$(1)_FILENAME)") @$(call write_timing_to,$$@.timing) $$(LINK_$(1)_COMMAND2) $$(if $(verbose_build),,@echo " $(COLOR_YELLOW) $(COLOR_RESET) $(COLOR_DARK_GRAY)`awk -f mldb/jml-build/print-timing.awk $$@.timing`$(COLOR_RESET) $$(LIB_$(1)_FILENAME)") - $(if $(POST_LINK_COMMAND)$(POST_LINK_COMMAND_$(1)),$(if $(POST_LINK_COMMAND_$(1)),$(POST_LINK_COMMAND_$(1)),$(POST_LINK_COMMAND)) $$(LIB_$(1)_SO)) + $(if $(POST_LINK_COMMAND)$(POST_LINK_COMMAND_$(1)),@$(if $(POST_LINK_COMMAND_$(1)),$(POST_LINK_COMMAND_$(1)),$(POST_LINK_COMMAND)) $$(LIB_$(1)_SO)) $$(tmpLIBNAME): $$(sodir)/$$(tmpLIBNAME)$$(so) .PHONY: $$(tmpLIBNAME) @@ -575,7 +575,7 @@ LINK_$(1)_COMMAND:=$$(CXX) $$(CXXFLAGS) $$(CXXEXEFLAGS) $$(CXXNODEBUGFLAGS) -o $ $(TESTS)/$(1): $(TESTS)/.dir_exists $(TEST_TMP)/.dir_exists $$($(1)_OBJFILES) $$(foreach lib,$(2),$$(LIB_$$(lib)_DEPS)) $$(LIB)/libexception_hook$(SO_EXTENSION) $$(if $(verbose_build),@echo $$(LINK_$(1)_COMMAND),@echo " $(COLOR_BLUE)[TESTBIN]$(COLOR_RESET) $(1)") @$$(LINK_$(1)_COMMAND) - $(if $(POST_LINK_COMMAND)$(POST_LINK_COMMAND_$(1)),@$(if $(POST_LINK_COMMAND_$(1)),$(POST_LINK_COMMAND_$(1)),$(POST_LINK_COMMAND)) $$(LIB_$(1)_SO)) + $(if $(POST_LINK_COMMAND)$(POST_LINK_COMMAND_$(1)),@$(if $(POST_LINK_COMMAND_$(1)),$(POST_LINK_COMMAND_$(1)),$(POST_LINK_COMMAND)) $$@) tests: $(TESTS)/$(1) $$(CURRENT)_tests: $(TESTS)/$(1) From b5ff5900ea55cca236cd9e74f5f1ba2b9c69db48 Mon Sep 17 00:00:00 2001 From: Jeremy Barnes Date: Thu, 16 Jan 2025 19:54:23 -0500 Subject: [PATCH 20/39] FIXUP boost iostreams --- vfs/testing/filter_streams_test.cc | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/vfs/testing/filter_streams_test.cc b/vfs/testing/filter_streams_test.cc index cadae9b44..41080664f 100644 --- a/vfs/testing/filter_streams_test.cc +++ b/vfs/testing/filter_streams_test.cc @@ -325,7 +325,7 @@ BOOST_AUTO_TEST_CASE( test_large_blocks ) block[i] = i ^ (i << 8) ^ (i << 16) ^ (1 << 24); } - string filename = tmpDir.get() / "badfile.xz4"; + string filename = tmpDir.get() / "badfile.zstd"; FileCleanup cleanup(filename); @@ -598,7 +598,6 @@ BOOST_AUTO_TEST_CASE(test_filter_stream_exceptions_destruction_istream) action(); } -#endif BOOST_AUTO_TEST_CASE(test_filter_stream_mapping) { From 923338094ab7663eefe5c93db0eb301151d101a2 Mon Sep 17 00:00:00 2001 From: Jeremy Barnes Date: Fri, 17 Jan 2025 13:02:23 -0500 Subject: [PATCH 21/39] SQUASH filter_streams, boost (3) --- base/iostream_adaptors.cc | 10 +- base/iostream_adaptors.h | 65 +- base/parse_context.cc | 5 +- base/testing/base_testing.mk | 2 +- base/testing/iostream_adaptors_test.cc | 50 +- sql/builtin_functions.cc | 11 +- utils/testing/parse_context_test.cc | 9 +- utils/testing/parse_context_test_data.csv | 10000 ++++++++++++++++++++ vfs/filter_streams.cc | 433 +- vfs/gzip.cc | 2 - vfs/http_streambuf.cc | 2 +- vfs/testing/filter_streams_test.cc | 18 +- 12 files changed, 10145 insertions(+), 462 deletions(-) create mode 100644 utils/testing/parse_context_test_data.csv diff --git a/base/iostream_adaptors.cc b/base/iostream_adaptors.cc index 07a25292f..93dc79456 100644 --- a/base/iostream_adaptors.cc +++ b/base/iostream_adaptors.cc @@ -65,6 +65,11 @@ ssize_t buffered_ostreambuf::sink_write_all(const char * s, size_t n) std::streamsize buffered_istreambuf::xsgetn(char * s, std::streamsize n) { + // NOTE: This function should never return EOF. If no characters are read, + // then it should return 0. + + if (n == 0) return 0; + // First get any buffered characters //cerr << "xsgetn of " << n << " characters" << endl; size_t done = std::min(n, egptr() - gptr()); @@ -78,13 +83,14 @@ std::streamsize buffered_istreambuf::xsgetn(char * s, std::streamsize n) } //cerr << "end of xsgetn: done = " << done << " eof = " << eof() << endl; ExcAssert(done > 0 || eof()); - return done ? done : EOF; + return done; } std::streampos buffered_istreambuf::seekoff(std::streamoff off, std::ios_base::seekdir way, std::ios_base::openmode which) { + // pos_ represents the position of the last character in the buffer, ie egptr() if (which != std::ios_base::in || way != std::ios_base::cur || off != 0) return EOF; - return pos_ + gptr() - eback(); + return pos_ + egptr() - gptr(); } void buffered_istreambuf::buf_fill() diff --git a/base/iostream_adaptors.h b/base/iostream_adaptors.h index f2af770f0..845b6654c 100644 --- a/base/iostream_adaptors.h +++ b/base/iostream_adaptors.h @@ -43,11 +43,25 @@ struct has_flush { template constexpr bool has_flush_v = has_flush::value; template using has_flush_t = has_flush::type; -template void close_stream(Stream& stream) { stream.close(); } -inline void close_stream(std::istream & stream) { /* nothing to do */ } template void flush_stream(Stream& stream, std::enable_if_t> * = 0) { stream.flush(); } template void flush_stream(Stream& stream, std::enable_if_t> * = 0) { } + +template +struct has_close { + template static auto test(int) -> decltype(std::declval().close(), std::true_type()); + template static auto test(...) -> std::false_type; + using type = decltype(test(0)); + static constexpr bool value = type::value; +}; + +template constexpr bool has_close_v = has_close::value; +template using has_close_t = has_close::type; + +template void close_stream(Stream& stream, std::enable_if_t> * = 0) { stream.close(); } +template void close_stream(Stream& stream, std::enable_if_t> * = 0) { } + + template ssize_t write_stream(std::ostream& stream, const char * data, size_t len) { @@ -89,6 +103,8 @@ struct filter_streambuf: public std::streambuf { std::streambuf * output_ = nullptr; }; +inline void close_stream(std::streambuf & stream) { if (auto * buf = dynamic_cast(&stream)) buf->close(); } + template struct filtering_stream: public IOStream { using IOStream::rdbuf; @@ -104,7 +120,7 @@ struct filtering_stream: public IOStream { if (cap_) MLDB_EAT_EXCEPTIONS(cap_->close()); } - void push(std::streambuf & sb) { check_not_capped(); push_streambuf(sb); } + void push(std::streambuf & sb, size_t /* buffer_size */ = 4096) { check_not_capped(); push_streambuf(sb); } bool empty() const { return filters_.empty() && !cap_ && !rdbuf(); } bool capped() const { return rdbuf() && (filters_.empty() || filters_.back()->has_output()); } @@ -112,11 +128,11 @@ struct filtering_stream: public IOStream { protected: void check_not_capped() const { ExcCheck(!cap_, "Attempt to push a second sink into a filtering_stream"); } void push_streambuf(std::streambuf & sb) { if (!rdbuf()) { rdbuf(&sb); } else filters_.back()->set_output(&sb); } - template void push_cap(Cap cap) { check_not_capped(); push_streambuf(*(cap_ = std::make_unique(std::move(cap)))); } - template void push_filter(Filter filter) + template void push_cap(Cap cap, size_t buffer_size) { check_not_capped(); push_streambuf(*(cap_ = std::make_unique(std::move(cap), buffer_size))); } + template void push_filter(Filter filter, size_t buffer_size) { check_not_capped(); - filters_.emplace_back(std::make_unique(std::move(filter))); + filters_.emplace_back(std::make_unique(std::move(filter), buffer_size)); push_streambuf(*filters_.back()); } private: @@ -179,8 +195,8 @@ struct filtering_ostreambuf: public buffered_ostreambuf { struct filtering_ostream: public filtering_stream { using filtering_stream::push; - template void push(Sink sink, typename Sink::is_sink::type = {}) { push_cap>(std::move(sink)); } - template void push(Filter filter, typename Filter::is_filter::type = {}) { push_filter>(std::move(filter)); } + template void push(Sink sink, size_t buffer_size = 4096, typename Sink::is_sink::type = {}) { push_cap>(std::move(sink), buffer_size); } + template void push(Filter filter, size_t buffer_size = 4096, typename Filter::is_filter::type = {}) { push_filter>(std::move(filter), buffer_size); } }; @@ -207,7 +223,7 @@ struct buffered_istreambuf: public filter_streambuf { { if (eof_) return EOF; auto res = source.read(std::forward(args)..., s, n); - eof_ = res == EOF; + if (res == 0 || res == EOF) eof_ = true; pos_ += (res == EOF ? 0 : res); return res; } @@ -220,7 +236,7 @@ struct source_istreambuf: public buffered_istreambuf { virtual ~source_istreambuf() = default; const Source & source() const { return source_; } Source & source() { return source_; } - virtual void close() override {} + virtual void close() override { close_stream(source_); } protected: virtual ssize_t source_read(char * s, size_t n) override { return do_source_read(s, n, source_); } Source source_; @@ -233,7 +249,7 @@ struct filtering_istreambuf: public buffered_istreambuf { virtual ~filtering_istreambuf() = default; const Filter & filter() const { return filter_; } Filter & filter() { return filter_; } - virtual void close() override {} + virtual void close() override { close_stream(filter_); } protected: virtual ssize_t source_read(char * s, size_t n) override { return do_source_read(s, n, filter_, *this); } Filter filter_; @@ -241,16 +257,29 @@ struct filtering_istreambuf: public buffered_istreambuf { struct filtering_istream: public filtering_stream { using filtering_stream::push; - template void push(Source source, typename Source::is_source::type = {}) { push_cap>(std::move(source)); } - template void push(Filter filter, typename Filter::is_filter::type = {}) { push_filter>(std::move(filter)); } + template void push(Source source, size_t buffer_size = 4096, typename Source::is_source::type = {}) { push_cap>(std::move(source), buffer_size); } + template void push(Filter filter, size_t buffer_size = 4096, typename Filter::is_filter::type = {}) { push_filter>(std::move(filter), buffer_size); } }; -#if 0 -template -struct stream_buffer: public source_istreambuf { - stream_buffer(Source source, size_t /*buffer_size*/ = 4096): source_istreambuf(std::move(source)) {} + +/*****************************************************************************/ +/* NULL FILTER */ +/*****************************************************************************/ + +// Filter which passes its data straight through; mostly for testing + +struct null_filter { + using is_filter = std::true_type; + template void flush(Sink & sink) { flush_stream(sink); } + template void close(SourceOrSink & s) { close_stream(s); } + template ssize_t read(Source & source, char * s, size_t n) { return source.read(s, n); } + template ssize_t write(Sink & sink, const char * s, size_t n) { return sink.write(s, n); } + template std::streampos seek(SourceOrSink & s, std::streamoff off, std::ios_base::seekdir way, std::ios_base::openmode which) + { + return s.seek(off, way, which); + } }; -#endif + /*****************************************************************************/ /* MEMORY MAPPING */ diff --git a/base/parse_context.cc b/base/parse_context.cc index 600e9c267..010ab174c 100644 --- a/base/parse_context.cc +++ b/base/parse_context.cc @@ -704,9 +704,10 @@ read_new_buffer() char * tmpbuf = buf.data(); stream_->read(tmpbuf, chunk_size_); - size_t read = stream_->gcount(); + ssize_t read = stream_->gcount(); - //cerr << "read " << read << " bytes" << endl; + //cerr << "read " << read << " bytes" << " of " << chunk_size_ << endl; + ExcAssertGreaterEqual(read, 0); if (stream_->bad()) exception("stream is bad/has failed 2"); diff --git a/base/testing/base_testing.mk b/base/testing/base_testing.mk index 345d60e7e..249699bf4 100644 --- a/base/testing/base_testing.mk +++ b/base/testing/base_testing.mk @@ -4,4 +4,4 @@ export MLDB_NO_TIMING_TESTS=1 $(eval $(call test,thread_pool_test,base arch,boost timed)) $(eval $(call test,thread_queue_test,base arch,boost timed)) $(eval $(call test,per_thread_accumulator_test,base arch,boost)) -$(eval $(call iostream_adaptors_test, base arch, catch2)) +$(eval $(call test,iostream_adaptors_test, base arch, catch2)) diff --git a/base/testing/iostream_adaptors_test.cc b/base/testing/iostream_adaptors_test.cc index 41179936b..9b5e9bddc 100644 --- a/base/testing/iostream_adaptors_test.cc +++ b/base/testing/iostream_adaptors_test.cc @@ -16,10 +16,58 @@ #include "catch2/catch_all.hpp" #include "mldb/base/iostream_adaptors.h" +#include +#include using namespace std; using namespace MLDB; -TEST_CASE("test1") +TEST_CASE("proper EOF sequencing") { + string input_file = "mldb/utils/testing/parse_context_test_data.csv"; + size_t input_length = std::filesystem::file_size(input_file); + + for (auto chunk_size: { /* 1, 2, 3, 5, 7, 11, 50,*/ 71, 1000, 1000000 }) { + SECTION("chunk_size " + std::to_string(chunk_size)) { + for (auto buffer_size: { /*1, 2, 3, 5, 7, 11, 16,*/ 128, 1000 }) { + SECTION("buffer_size " + std::to_string(buffer_size)) { + ifstream file(input_file); + filtering_istream stream; + stream.push(null_filter(), buffer_size); + stream.push(*file.rdbuf(), buffer_size); + + std::vector buffer(chunk_size); + std::string contents; + + ssize_t total_read = 0; + bool has_read_zero = false; + + while (!stream.eof()) { + stream.read(buffer.data(), buffer.size()); + contents.append(buffer.data(), stream.gcount()); + total_read += stream.gcount(); + if (stream.gcount() == 0) { + CHECK(!has_read_zero); + has_read_zero = true; + CHECK(total_read == input_length); + REQUIRE(stream.eof()); + } + + // Reading zero characters shouldn't mess up the stream + stream.read(buffer.data(), 0); + CHECK(stream.gcount() == 0); + } + + if (!has_read_zero) { + stream.read(buffer.data(), buffer.size()); + CHECK(stream.gcount() == 0); + has_read_zero = true; + } + + CHECK(contents.size() == input_length); + CHECK(has_read_zero); + } + } + } + } } diff --git a/sql/builtin_functions.cc b/sql/builtin_functions.cc index e341aadba..4d70c0d74 100644 --- a/sql/builtin_functions.cc +++ b/sql/builtin_functions.cc @@ -3647,7 +3647,16 @@ BoundFunction fetcher(const std::vector & args) } else { std::ostringstream streamo; - streamo << stream.rdbuf(); + + // Could do stream << streambuf, but that eats exceptions which the + // users need to be able to see any fetcher errors + constexpr size_t BUFFER_SIZE = 16384; + while (stream) { + char buffer[BUFFER_SIZE]; + stream.read(buffer, BUFFER_SIZE); + streamo.write(buffer, stream.gcount()); + } + blob = CellValue::blob(streamo.str()); } stream.close(); diff --git a/utils/testing/parse_context_test.cc b/utils/testing/parse_context_test.cc index 25e1e53ba..6460814f9 100644 --- a/utils/testing/parse_context_test.cc +++ b/utils/testing/parse_context_test.cc @@ -33,7 +33,7 @@ using namespace std; using boost::unit_test::test_suite; -#if 0 +#if 1 BOOST_AUTO_TEST_CASE( test_float_parsing ) { @@ -615,7 +615,12 @@ BOOST_AUTO_TEST_CASE( test_csv_data ) vector > reference; for (unsigned i = 0; i < nchunk_sizes; ++i) { - BOOST_CHECK_NO_THROW(test_csv_data_size(chunk_sizes[i], reference)); + try { + test_csv_data_size(chunk_sizes[i], reference); + } catch (const std::exception & exc) { + cerr << "exception on chunk size: " << chunk_sizes[i] << ": " << exc.what() << endl; + BOOST_CHECK_EQUAL(exc.what(), ""); + } } } diff --git a/utils/testing/parse_context_test_data.csv b/utils/testing/parse_context_test_data.csv new file mode 100644 index 000000000..f77de8fa0 --- /dev/null +++ b/utils/testing/parse_context_test_data.csv @@ -0,0 +1,10000 @@ +"aaa","aaaaaaa_aaa","aaaaaaa_aaaaa","aaaaaaa_aaaa","aaaaaa_aa","aaaaaaaaaa_aaaa","aaaaaa" +"00,000",,"aaaaaa@aaaaaaaaaa.aaa",00/00/0000 0:00:00AA,0.00,"0000A000","AAAA" +"00,000",,"aaaaaaaa@aaaaaaaaaa.aaa",00/00/0000 00:00:00AA,0.00,"0000A000","AAAA" +"00,000","000,000","aaaaaa@aaaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,0.00,"0000A000","AAAAAAAA AAA AAAAAAA" +"00,000","000,000","aaaa@aaaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,0.00,"0000A000","AAAAAAAA AAA AAAAAAA" +"00,000","000,000","aaaaa@aaaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,0.00,"0000A000","AAAAAAAA AAA AAAAAAA" +"00,000",,"aaaaaa@aaaaaaaaaa.aaa",00/00/0000 00:00:00AA,0.00,"0000A000","AAAA" +"000,000","00,000","aa@aaaaaaaaaa.aaa",00/00/0000 00:00:00AA,0.00,"0A00000A","AAAAAAAA AAA AAAAAAA" +"000,000","000,000","aaaaaaaaaa000@aaaaaaa.aaa",00/00/0000 00:00:00AA,0.00,"0A00000A","AAAAAAAA" +"000,000",,"aaaa@aaaaaaaaaa.aaa",00/00/0000 0:00:00AA,0.00,"0A00000A","AAAA" +"000,000","000,000","aaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,00.00,"0000A000","AAAAAAAA" +"000,000","000,000","aaaaaaaa@aaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,00.00,"0A00000A","AAAAAAAA" +"00,000","00,000","aaaaaaaaa0000@aaaaa.aa",00/00/0000 00:00:00AA,00.00,"0000A000","AAAAAAAA AAA AAAAAAA" +"00,000","00,000","aaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,00.00,"A000A000","AAAAAAAA AAA AAAAAAA" +"00,000","000,000","aaaaaa.aaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,00.00,"A000A000","AAAAAAAA" +"00,000",,"aaaaaaa@aaaaaaaaaa.aaa",00/00/0000 00:00:00AA,00.00,"0000A000","AAAA" +"00,000",,"aaaaaaa@aaaaaaaaaa.aaa",00/00/0000 00:00:00AA,00.00,"A000A000","AAAA" +"00,000",,"aaaaaa@aaaaaaaaaa.aaa",00/00/0000 0:00:00AA,00.00,"A000A000","AAAA" +"00,000","00,000","aaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,00.00,"A000A000","AAAAAAAA" +"000,000","00,000","aaaa@aaaaaaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,00.00,"0000A000","AAAAAAAA AAA AAAAAAA" +"000,000","00,000","Aaaaa@aaaaaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,00.00,"0000A000","AAAAAAAA AAA AAAAAAA" +"000,000",,"aaaaa.aaaaaaa@aaaa.aaa",00/00/0000 0:00:00AA,00.00,"0000A000","AAAA" +"000,000","00,000","aaaaaa0@aaaaaaaaaa.aaa",00/00/0000 0:00:00AA,00.00,"0000A000","AAAAAAAA" +"000,000","00,000","aaaaaaa000@aaa.aaa",00/00/0000 0:00:00AA,00.00,"0000A000","AAAAAAAA" +"00,000","000,000","aaaaaa@aaaaaaaaa.aaa",00/00/0000 0:00:00AA,00.00,"A000A000","AAAAAAAA" +"00,000","00,000","aaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,00.00,"A000A000","AAAAAAAA" +"00,000","000,000","aaaaa.aaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,00.00,"A000A000","AAAAAAAA" +"00,000","000,000","aaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,00.00,"A000A000","AAAAAAAA" +"000,000","00,000","aaaaaaa0000@aaaaa.aaa",00/00/0000 0:00:00AA,00.00,"0A00000A","AAAAAAAA AAA AAAAAAA" +"00,000","00,000","aaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,00.00,"A000A00A","AAAAAAAA" +"000,000","000,000","aaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,00.00,"0A00000A","AAAAAAAA AAA AAAAAAA" +"000,000","000,000","aaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,00.00,"0A00000A","AAAAAAAA AAA AAAAAAA" +"000,000","000,000","aaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,00.00,"0A00000A","AAAAAAAA AAA AAAAAAA" +"000,000","000,000","aaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,00.00,"0A00000A","AAAAAAAA AAA AAAAAAA" +"000,000","00,000","aaaaaaa@aaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,00.00,"0A00000A","AAAAAAAA AAA AAAAAAA" +"00,000","00,000","aaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,00.00,"A000A000","AAAAAAAA" +"00,000","00,000","aaaaaaa.aaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,00.00,"AA00A000","AAAAAAAA AAA AAAAAAA" +"0,000",,"aaaaaaaaaa@aaa.aaa",00/00/0000 0:00:00AA,00.00,"AA000000","AAAA" +"000,000",,"aaaaaaa@aaaaaaa.aa",00/00/0000 0:00:00AA,00.00,"AA00A00A","AAAA" +"000,000",,"aaaaaaaaa0@aaaaaaaaa.aa",00/00/0000 0:00:00AA,00.00,"0000A000","AAAA" +"000,000","000,000","aaaaaa@aaaaaaaaa.aa",00/00/0000 0:00:00AA,00.00,"0000A000","AAAAAAAA AAA AAAAAAA" +"00,000",,"aaaaa00@aaaaaa.aaa",00/00/0000 00:00:00AA,00.00,"A00A0AA0","AAAA" +"00,000",,"aaaaaaaaaaaaaa@aaaa.aa",00/00/0000 00:00:00AA,00.00,"A00A0AA0","AAAA" +"00,000",,"Aaaaaa_aaaAaaaaaaaaa@aaaaaa.aaa",00/00/0000 00:00:00AA,00.00,"A00A0AA0","AAAA" +"00,000",,"aaaaaaa0000@aaaaaa.aaa",00/00/0000 00:00:00AA,00.00,"A00A0AA0","AAAA" +"00,000",,"a-aaaaaaa@aaaaaaaaa.aa",00/00/0000 00:00:00AA,00.00,"A00A0AA0","AAAA" +"000,000","00,000","aaaaaa.aaaaaaa@aaaaaaaaa.aa",00/00/0000 00:00:00AA,00.00,"0A000A00","AAAAAA AAAA AAAAA" +"000,000","00,000","aaaaaa.aaaaaaa@aaaaaaaaa.aa",00/00/0000 00:00:00AA,00.00,"0A000A00","AAAAAA AAAA AAAAA" +"000,000","000,000","aaaaaaa@aaaaaaaaa.aa",00/00/0000 0:00:00AA,00.00,"A00A00AA","AAAAAAAA" +"00,000",,"aaaaa@aaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,00.00,"A000AA00","AAAA" +"00,000",,"aaaaaaaa@aaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,00.00,"A000AA00","AAAA" +"00,000",,"aaaaa@aaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,00.00,"A000AA00","AAAA" +"000,000","000,000","aaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,00.00,"00000000","AAAAAAAA AAA AAAAAAA" +"000,000","00,000","aaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,00.00,"00000000","AAAAAAAA" +"000,000","00,000","aaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,00.00,"00000000","AAAAAAAA" +"000,000","000,000","aaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,00.00,"00000A0A","AAAAAAAA" +"000,000","000,000","aaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,00.00,"00000A0A","AAAAAAAA" +"000,000",,"aaaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,00.00,"00000A0A","AAAA" +"000,000",,"aaaaaaaa.aaaaaaaaaa@aaaa.aaaaaa.aa",00/00/0000 0:00:00AA,00.00,"000AA000","AAAA" +"000,000",,"aaaaaa@aaaaaaaaaa.aaa",00/00/0000 0:00:00AA,00.00,"0000A00A","AAAA" +"00,000","000,000","aaaa@aaaaaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,00.00,"00000000","AAAAAAAA" +"00,000",,"aaaaa.aaa@aaaaaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,00.00,"00000000","AAAA" +"000,000","000,000","aaaaaaaa@aaaaaaaaa.aa",00/00/0000 00:00:00AA,00.00,"0A0A0AA0","AAAAAAAA AAA AAAAAAA" +"000,000","000,000","aaaaaaaa@aaaaaaaaa.aa",00/00/0000 00:00:00AA,00.00,"0A0A0AA0","AAAAAAAA AAA AAAAAAA" +"00,000","000,000","aaaaa@aaaaaaaaa.aa",00/00/0000 00:00:00AA,00.00,"A000000A","AAAAAAAA" +"00,000",,"aaaaaaaa@aaaaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,00.00,"A000000A","AAAA" +"00,000","00,000","aaaaa@aaa.aaa",00/00/0000 00:00:00AA,00.00,"A000000A","AAAAAAAA" +"00,000",,"Aaaaaa.Aaaa@aa.aaaa.aaa",00/00/0000 00:00:00AA,00.00,"A000000A","AAAA" +"00,000",,"aaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,00.00,"A000000A","AAAA" +"00,000",,"aaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,00.00,"A000000A","AAAA" +"000,000","000,000","aaaaaaaaaaaa0@aaaaa.aaa",00/00/0000 00:00:00AA,00.00,"00000000","AAAAAAAA AAA AAAAAAA" +"0,000",,"aaaa@aaaaaa.aa",00/00/0000 0:00:00AA,00.00,"000A0A0A","AAAA" +"0,000",,"aaaa@aaaaaa.aa",00/00/0000 0:00:00AA,00.00,"000A0A0A","AAAA" +"00,000","000,000","aaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,00.00,"0000A00A","AAAAAAAA" +"000,000","000,000","aaaaa.aaaaa@aaaaaaaaa.aa",00/00/0000 0:00:00AA,00.00,"0000000A","AAAAAAAA" +"000,000",,"aaaaaaa.aaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,00.00,"0000000A","AAAA" +"00,000",,"aaaaaaaa@aaaaaa.aaa",00/00/0000 0:00:00AA,00.00,"0A0A00AA","AAAA" +"00,000",,"aaaaa@aaaaaaaaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,00.00,"0A0A00AA","AAAA" +"00,000",,"aaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,00.00,"A0000A00","AAAA" +"00,000","000,000","aaaaaaaa@aaaaaaaaaa.aa",00/00/0000 0:00:00AA,00.00,"0A000000","AAAAAAAA AAA AAAAAAA" +"00,000","0,000","Aaa.Aaaaaa@aaaaaa-aaaaaaaaaa.aaa",00/00/0000 0:00:00AA,00.00,"0000A000","AAAAAAAA" +"00,000","000,000","aaaaaaa.aaaaaaaaa@aaaaaa.aaa",00/00/0000 0:00:00AA,00.00,"0000A00A","AAAAAAAA AAA AAAAAAA" +"00,000",,"aaaaa@aaaaaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,00.00,"0000A00A","AAAA" +"00,000",,"aaaa@aaaaaaaaa.aa",00/00/0000 0:00:00AA,00.00,"0A0AA000","AAAA" +"00,000",,"a.aaaaaa@aaaaaaaaa.aa",00/00/0000 00:00:00AA,00.00,"0A0A00AA","AAAA" +"00,000",,"a.aaaaaa@aaaaaaaaa.aa",00/00/0000 00:00:00AA,00.00,"0A0A00AA","AAAA" +"00,000",,"aaaaaaa@aaaaaaaaaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,00.00,"0A0A00AA","AAAA" +"000,000",,"aaaaa.aaaaaaaa@aaaa.aaa",00/00/0000 00:00:00AA,00.00,"AA000000","AAAA" +"00,000",,"aaaaaaa@aaaaaaaaaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,00.00,"0A0A00AA","AAAA" +"00,000",,"aaaaa@aaaaaa.aaa",00/00/0000 00:00:00AA,00.00,"0A0A00AA","AAAA" +"000,000",,"aaaaaaaaaaaa@aaaaaaaaa.aa",00/00/0000 00:00:00AA,00.00,"AA000000","AAAA" +"00,000",,"aaaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,00.00,"0A0A00AA","AAAA" +"000,000",,"aaaaaaaaaaaa@aaaaaaaaa.aa",00/00/0000 00:00:00AA,00.00,"AA000000","AAAA" +"00,000",,"Aaaaaa@aaaaaa.aaa",00/00/0000 00:00:00AA,00.00,"0A0A00AA","AAAA" +"00,000",,"aaaaa@aaaaaaaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,00.00,"0A0A00AA","AAAA" +"00,000","000,000","aaaaaaaaaa@aaaaaa.aaa",00/00/0000 00:00:00AA,00.00,"0A0A00AA","AAAAAAAA" +"00,000","000,000","a.aaaaaaa@aaaaaa.aaa",00/00/0000 00:00:00AA,00.00,"0A0A00AA","AAAAAAAA" +"00,000",,"aaaaa@aaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,00.00,"0A0A00AA","AAAA" +"00,000",,"aaaaa@aaaaaaaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,00.00,"0A0A00AA","AAAA" +"00,000",,"aaaaaaaa@aaaaaaaaaaa.aa",00/00/0000 00:00:00AA,00.00,"0A0A00AA","AAAA" +"00,000",,"aaaaa-aa@aaaaaa.aaa",00/00/0000 00:00:00AA,000.00,"0A0A00AA","AAAA" +"000,000",,"aaaaaaaaaa@aaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"A000A000","AAAA" +"000,000","000,000","aaaaaaaaaa_aaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,000.00,"A000A000","AAAAAAAA" +"000,000","000,000","aaaaaaaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"0A00000A","AAAAAAAA" +"000,000","000,000","aaaaaaa@aaa-aaaa.aa",00/00/0000 0:00:00AA,000.00,"0A00000A","AAAAAAAA" +"000,000",,"aaaaaa@aaaaaaaaaa.aaa",00/00/0000 00:00:00AA,000.00,"0A00000A","AAAA" +"000,000",,"aaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,000.00,"0A00000A","AAAA" +"000,000",,"aaaaaa@aaaaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,000.00,"0A00000A","AAAA" +"00,000","000,000","aaaaaa@aaaaa.aa",00/00/0000 00:00:00AA,000.00,"0A0A00AA","AAAAAAAA" +"000,000",,"aaaaaaaaaaa@aaa.aaa",00/00/0000 00:00:00AA,000.00,"A000A00A","AAAA" +"000,000",,"aaaaaaaaaa000@aaaaaaa.aaa",00/00/0000 00:00:00AA,000.00,"00000000","AAAA" +"00,000","00,000","aaaaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,000.00,"A0000A00","AAAAAAAA" +"000,000",,"aaaaaaaaa@aaaaaaaaaaa.aa",00/00/0000 00:00:00AA,000.00,"AA000A0A","AAAA" +"000,000","000,000","aaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,000.00,"AA000A0A","AAAAAAAA AAA AAAAAAA" +"000,000","000,000","aaaaaa.aaaaaa@aaa.aa",00/00/0000 0:00:00AA,000.00,"0000A000","AAAAAAAA" +"000,000","00,000","aaaaa@aaaaaa.aa",00/00/0000 0:00:00AA,000.00,"00000A0A","AAAAAAAA" +"000,000","00,000","aaaaaaaaa@aa.aaaaaaaaa.aa",00/00/0000 0:00:00AA,000.00,"0000A000","AAAAAAAA" +"000,000",,"aaaaaaaa@aaaaaa.aa",00/00/0000 0:00:00AA,000.00,"0A000A00","AAAA" +"000,000",,"aaaaaaa@aaaaaa.aa",00/00/0000 0:00:00AA,000.00,"0A000A00","AAAA" +"000,000","000,000","aaaaaa@aaa.aaa",00/00/0000 0:00:00AA,000.00,"0000A000","AAAAAA AAAA AAAAA" +"000,000",,"aaaa.aaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,000.00,"00000A0A","AAAA" +"0,000","000,000","aaaaaaaaaa@aa.aaaaaaaaa.aa",00/00/0000 0:00:00AA,000.00,"AA0A0A00","AAAAAAAA" +"0,000",,"aaa@aaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"AA0A0A00","AAAA" +"0,000",,"aaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,000.00,"AA0A0A00","AAAA" +"0,000",,"aaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,000.00,"AA0A0A00","AAAA" +"00,000","000,000","aaaaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"0000A00A","AAAAAAAA AAA AAAAAAA" +"00,000","000,000","Aaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"00000000","AAAAAAAA" +"00,000","000,000","a_aaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,000.00,"00000000","AAAAAAAA" +"00,000","000,000","a_aaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,000.00,"00000000","AAAAAAAA" +"00,000","000,000","a_aaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,000.00,"00000000","AAAAAAAA" +"00,000",,"aaaaaaaaaa@aaaaaaaa.aa",00/00/0000 0:00:00AA,000.00,"00000000","AAAA" +"00,000",,"aaaaaaaaaa@aaaaaaaa.aa",00/00/0000 0:00:00AA,000.00,"00000000","AAAA" +"00,000","00,000","aaaaaaaaaa@aaaa.aa",00/00/0000 0:00:00AA,000.00,"A00A0AA0","AAAAAAAA AAA AAAAAAA" +"00,000",,"aaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,000.00,"00000A00","AAAA" +"000,000",,"aaaaa@aaaaa.aa",00/00/0000 0:00:00AA,000.00,"0A00000A","AAAA" +"000,000","000,000","aaaaaaa@aaaaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"0A00000A","AAAAAA AAAA AAAAA" +"000,000",,"aaaaaaaaa@aaaaaaaaa.aa",00/00/0000 0:00:00AA,000.00,"0A00000A","AAAA" +"000,000",,"aaaaaa.a@aaaaaaaaa.aa",00/00/0000 0:00:00AA,000.00,"0A00000A","AAAA" +"000,000",,"aaaaa@aaaaaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"0A00000A","AAAA" +"000,000","000,000","aaaaaa@aaaaaaaaa.aa",00/00/0000 0:00:00AA,000.00,"0A00000A","AAAAAAAA" +"000,000",,"aaaaaaaa_aaaaaa@aaaaaaaaa.aa",00/00/0000 0:00:00AA,000.00,"0A00000A","AAAA" +"000,000","000,000","aaaaaaa@aaaaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"0A00000A","AAAAAAAA" +"000,000","00,000","aaaaaaa.aaaaaa@aaaa.aaaaaaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"0A00000A","AAAAAAAA" +"000,000","00,000","aaaaaa@aaaaaaaaaaaa.aa",00/00/0000 0:00:00AA,000.00,"0A00000A","AAAAAAAA" +"000,000","00,000","aaaaaa@aaaaaaaaaaaa.aa",00/00/0000 0:00:00AA,000.00,"0A00000A","AAAAAAAA" +"000,000","00,000","aaaaaa@aaaaaaaaaaaa.aa",00/00/0000 0:00:00AA,000.00,"0A00000A","AAAAAAAA" +"000,000","00,000","aaaaaa.aaaaaa@aaaaaaaaa.aa",00/00/0000 0:00:00AA,000.00,"0A00000A","AAAAAAAA" +"000,000","00,000","aaaaaaaaaaaa@aaaaaaaaa.aa",00/00/0000 0:00:00AA,000.00,"0A00000A","AAAAAAAA" +"000,000","000,000","aaaaaa@aaaaaaaaa.aa",00/00/0000 0:00:00AA,000.00,"0A00000A","AAAAAAAA" +"000,000","000,000","aaaaaaaa@aaaaaaaaa.aa",00/00/0000 0:00:00AA,000.00,"0A00000A","AAAAAA AAAA AAAAA" +"000,000","000,000","aaaaaaaaaaaaaa@aaa.aaa",00/00/0000 0:00:00AA,000.00,"0A00000A","AAAAAAAA" +"000,000",,"aaaaaaaa@aaaaaaaaaaaaaaa.aa",00/00/0000 0:00:00AA,000.00,"0A00000A","AAAA" +"000,000",,"aaaaaaaa@aaaaaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"0A00000A","AAAA" +"000,000",,"aaaaaaaaa@aaaaaaaaa.aa",00/00/0000 0:00:00AA,000.00,"0A00000A","AAAA" +"000,000",,"aaaaaa.aaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"0A00000A","AAAA" +"000,000","000,000","aaaaaaaa@aaa.aa",00/00/0000 0:00:00AA,000.00,"0A00000A","AAAAAA AAAA AAAAA" +"000,000",,"aaaaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"0A00000A","AAAA" +"000,000",,"aaaaaaaa@aaaaaaaaa.aa",00/00/0000 0:00:00AA,000.00,"0A00000A","AAAA" +"000,000",,"aaaaaa.aaaaaaa@aaaaaaaaa.aa",00/00/0000 0:00:00AA,000.00,"0A00000A","AAAA" +"000,000",,"aaaaaa@aaaaaaaaa.aa",00/00/0000 0:00:00AA,000.00,"0A00000A","AAAA" +"000,000",,"aaaaaaaa@aaaaaaaaa.aa",00/00/0000 0:00:00AA,000.00,"0A00000A","AAAA" +"000,000","000,000","aaaaa@aaaaaaaaa.aa",00/00/0000 0:00:00AA,000.00,"0A00000A","AAAAAAAA" +"000,000",,"aaaaaa@aaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"0A00000A","AAAA" +"000,000",,"aaaaaaaa@aaaaaaaaa.aa",00/00/0000 0:00:00AA,000.00,"0A00000A","AAAA" +"000,000",,"aaaaaa@aaaaaaaaa.aa",00/00/0000 0:00:00AA,000.00,"0A00000A","AAAA" +"000,000","00,000","aaaaaaaaa@aaaaaaaaa.aa",00/00/0000 0:00:00AA,000.00,"0A00000A","AAAAAAAA" +"000,000",,"aaaaa@aa.aaa",00/00/0000 0:00:00AA,000.00,"0A00000A","AAAA" +"000,000",,"aaaaaaaa@aaaaaaaaa.aa",00/00/0000 0:00:00AA,000.00,"0A00000A","AAAA" +"000,000",,"aaaaaa.aaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,000.00,"0A00000A","AAAA" +"000,000",,"aaaaaa@aaaaaaaaaaaa.aa",00/00/0000 0:00:00AA,000.00,"0A00000A","AAAA" +"000,000","00,000","aaaaaaa@aaaaaaaaa.aa",00/00/0000 0:00:00AA,000.00,"000AA0A0","AAAAAAAA" +"00,000",,"aaaaa000000@aaaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"A000A000","AAAA" +"00,000","000,000","aaaaa000000@aaaaa.aaa",00/00/0000 0:00:00AA,000.00,"A000A000","AAAAAAAA" +"000,000","00,000","aaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,000.00,"0000A000","AAAAAAAA AAA AAAAAAA" +"00,000",,"aaaaa@aaaaaaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"A000A000","AAAA" +0,,"aaaa@aaaaaaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"A000A000","AAAA" +"000,000","000,000","aaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,000.00,"A0000000","AAAAAAAA" +"000,000",,"aaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,000.00,"A0000000","AAAA" +"000,000","00,000","aaaaaaa@aa.aaa",00/00/0000 0:00:00AA,000.00,"A0000000","AAAAAAAA" +"000,000",,"aaaaa@aaaaa.aa",00/00/0000 0:00:00AA,000.00,"0000000A","AAAA" +"000,000",,"aaaaaaaaa@aa.aaa",00/00/0000 0:00:00AA,000.00,"A0000000","AAAA" +"000,000","000,000","Aaaaaaa@aaaaaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"A0000000","AAAAAAAA" +"000,000",,"Aaaaa@aaaaaaaaa.aa",00/00/0000 0:00:00AA,000.00,"A0000000","AAAA" +"00,000",,"aaaaaaaa@aaaaaaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"A000A000","AAAA" +"00,000",,"aaaaaaaa.aaaaa@aaaaaaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"A000A000","AAAA" +"000,000",,"aaaaaaaaaa@aaaaaaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"A0000000","AAAA" +"000,000","000,000","aaaaa@aaaaaaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"A0000000","AAAAAAAA" +"000,000",,"aaaaaaaa@aaaaaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"A0000000","AAAA" +"000,000",,"aaaaaa@aaaaaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"A0000000","AAAA" +"000,000",,"aaa@aaaaaaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,000.00,"A0000000","AAAA" +"000,000",,"aaaaaa@aaaaaaaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,000.00,"A0000000","AAAA" +"000,000",,"aaaa@aaa.aaa",00/00/0000 00:00:00AA,000.00,"A0000000","AAAA" +"000,000",,"aaaaaa@aaaaaaaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,000.00,"A0000000","AAAA" +"000,000",,"aaaaaa@aaa.aaa",00/00/0000 00:00:00AA,000.00,"A0000000","AAAA" +"000,000",,"aaaaaa@aaa.aaa",00/00/0000 00:00:00AA,000.00,"A0000000","AAAA" +"000,000",,"aaa@aaaaaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,000.00,"A0000000","AAAA" +"000,000",,"aaaa@aaaaaaaa.aaa",00/00/0000 00:00:00AA,000.00,"A0000000","AAAA" +"000,000",,"aaaaa.aaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,000.00,"A0000000","AAAA" +"000,000",,"aaaa@aaaaaaaa.aa",00/00/0000 00:00:00AA,000.00,"A0000000","AAAA" +"000,000",,"aaaaaaa@aaaaaaaa.aa",00/00/0000 00:00:00AA,000.00,"A0000000","AAAA" +"00,000","00,000","aaaaaaaa0@aaa.aaa",00/00/0000 0:00:00AA,000.00,"A000A00A","AAAAAAAA" +"00,000","00,000","aaaaa@aaaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"0A00000A","AAAAAA AAAA AAAAA" +"000,000","000,000","aaaaaa@aaaa.aa",00/00/0000 0:00:00AA,000.00,"00000A00","AAAAAAAA" +"000,000","00,000","aaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,000.00,"A0000000","AAAAAAAA" +"000,000","000,000","aaaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,000.00,"A0000000","AAAAAAAA" +"00,000",,"aaaaaaaaa@aaa.aaa",00/00/0000 00:00:00AA,000.00,"A00A0000","AAAA" +"000,000",,"aaaaaaaaa@aaaaaaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,000.00,"A0000000","AAAA" +"000,000","00,000","aaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,000.00,"A0000000","AAAAAAAA" +"000,000",,"aaaaaa@aaaaaaaaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,000.00,"0A00A00A","AAAA" +"000,000","00,000","aaaaa@aaaa.aa",00/00/0000 00:00:00AA,000.00,"A000000A","AAAAAAAA" +"000,000","000,000","aaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,000.00,"A000000A","AAAAAAAA AAA AAAAAAA" +"000,000",,"aaaaaaaaaaaaa@aaaa.aa",00/00/0000 00:00:00AA,000.00,"A000000A","AAAA" +"0,000","00,000","aaaaaaa.aaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,000.00,"0A00AA00","AAAAAAAA AAA AAAAAAA" +"00,000","00,000","aaaaaaa@aaaaaaaaaaaaa.aa",00/00/0000 0:00:00AA,000.00,"00000000","AAAAAA AAAA AAAAA" +"00,000",,"aaaaaaaaa@aaaaaaaaaaaaa.aa",00/00/0000 0:00:00AA,000.00,"00000000","AAAA" +"00,000","000,000","aaaaa0@aaaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"0A00000A","AAAAAAAA" +"00,000","00,000","aaaa.aaa@aaaaaaaaa.aa",00/00/0000 0:00:00AA,000.00,"A000000A","AAAAAAAA AAA AAAAAAA" +"00,000","00,000","aaaaaaaaaaaa@aaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"A000A00A","AAAAAAAA" +"000,000",,"aaaaaaa_aaaa@aaaaa.aa",00/00/0000 0:00:00AA,000.00,"A0000000","AAAA" +"000,000",000,"000aaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"AA00000A","AAAAAA AAAA AAAAA" +"00,000","000,000","aaaaaaa@aaaaaa.aa",00/00/0000 0:00:00AA,000.00,"00000A0A","AAAAAA AAAA AAAAA" +"00,000",,"aaaa.aaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,000.00,"00000A0A","AAAA" +"00,000",,"aaaaaaaa@aaaaaaaaa.aa",00/00/0000 0:00:00AA,000.00,"A000000A","AAAA" +"00,000",,"aaaaa@aaa.aa",00/00/0000 0:00:00AA,000.00,"A000A00A","AAAA" +"00,000",,"aaaa0000@aaaaa.aaa",00/00/0000 00:00:00AA,000.00,"A000000A","AAAA" +"000,000","000,000","aaaaaaaaaa@aaaaaaaaa.aa",00/00/0000 00:00:00AA,000.00,"0A00000A","AAAAAA AAAA AAAAA" +"000,000",,"aaaaaaaa@aaaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"0A00000A","AAAA" +"000,000","000,000","aaaaa000@aaaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"000AA0A0","AAAAAAAA" +"00,000",,"aaaaaa@aaa-aa.aaa",00/00/0000 0:00:00AA,000.00,"0000A00A","AAAA" +"00,000",,"aaaa000@aaaaa.aaa",00/00/0000 00:00:00AA,000.00,"AA00A00A","AAAA" +"00,000","00,000","aaaaaaaaa@aa.aa.aaa",00/00/0000 00:00:00AA,000.00,"00000000","AAAAAAAA" +"000,000",,"aaaaaaaaa0@aaaaa.aaa",00/00/0000 0:00:00AA,000.00,"0000000A","AAAA" +"000,000",,"aaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,000.00,"0000000A","AAAA" +"00,000",,"aaaaaaaaaaaaa0@aaa.aaa",00/00/0000 0:00:00AA,000.00,"0A00AA0A","AAAA" +"00,000",,"aaaaa0aaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,000.00,"0A00AA0A","AAAA" +"00,000","000,000","aaaaaa0aaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,000.00,"0A00AA0A","AAAAAAAA" +"00,000","00,000","aaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"0A00AA0A","AAAAAAAA" +"00,000",,"aaaaaaaaa@aaa.aaa",00/00/0000 0:00:00AA,000.00,"0A00AA0A","AAAA" +"00,000",,"aaaaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"0A00AA0A","AAAA" +"00,000","000,000","aaaaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"0A00AA0A","AAAAAAAA" +"000,000","000,000","aaaaaaaa000@aaa.aaa",00/00/0000 0:00:00AA,000.00,"0A000A0A","AAAAAAAA" +"000,000",,"aaaaaaaa_aaaaa@aa.aaa",00/00/0000 0:00:00AA,000.00,"00000A00","AAAA" +"000,000","00,000","aaaaa.aaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"A0000000","AAAAAAAA" +"00,000","000,000","aaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,000.00,"A000A000","AAAAAAAA" +"000,000",,"aaaaa00@aaaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"A000A000","AAAA" +"00,000","000,000","aaaaaaa.aaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,000.00,"A000000A","AAAAAAAA" +"000,000",,"aaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,000.00,"00000A00","AAAA" +"000,000","00,000","aaaaaa.aaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,000.00,"0A000A0A","AAAAAAAA" +"000,000","00,000","aaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,000.00,"0A000A0A","AAAAAAAA" +"000,000","00,000","aaaaaaaa@000.aaa",00/00/0000 0:00:00AA,000.00,"A000A00A","AAAAAAAA" +"000,000",,"AaaaaA@aaa.aaa",00/00/0000 0:00:00AA,000.00,"A000A00A","AAAA" +"00,000","00,000","aaaaa.a.aaaaaa@aaaaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"0A0AA0A0","AAAAAAAA AAA AAAAAAA" +"00,000",,"aaaaaaaa0@aaaaa.aaa",00/00/0000 0:00:00AA,000.00,"0000000A","AAAA" +"00,000",,"aaaaaaaaaaaaa@aaaaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"AA00A000","AAAA" +"00,000","00,000","aaaaaaa00@aaaaaaaaa.aaa",00/00/0000 00:00:00AA,000.00,"A000AA0A","AAAAAAAA" +"00,000",,"aaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,000.00,"000A0AAA","AAAA" +"000,000","000,000","aaaaaa0000@aaaaa.aaa",00/00/0000 0:00:00AA,000.00,"0A00000A","AAAAAAAA" +"000,000","000,000","aaaaa@aaaaaaaaa.aa",00/00/0000 0:00:00AA,000.00,"0A00000A","AAAAAA AAAA AAAAA" +"00,000",,"aaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"AA000000","AAAA" +"00,000",,"aaaaa.aaaaa@aaaa.aaaaaa.aa",00/00/0000 0:00:00AA,000.00,"AA000000","AAAA" +"00,000",,"aaaa.aaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,000.00,"00000A0A","AAAA" +"00,000","000,000","aaaaa.aaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,000.00,"0A00A00A","AAAAAA AAAA AAAAA" +"00,000",,"aaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"0A00A00A","AAAA" +"00,000",,"aaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"0A00A00A","AAAA" +"00,000",,"aaaaaaaaaaaaa@aaaaa.aa",00/00/0000 0:00:00AA,000.00,"0A00A00A","AAAA" +"00,000",,"aaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"0A00A00A","AAAA" +"00,000",,"aaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"0A00A00A","AAAA" +"00,000",,"a_a_@aaaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"0A00A00A","AAAA" +"00,000",,"aaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"0A00A00A","AAAA" +"00,000",,"aaaa_aaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"0A00A00A","AAAA" +"00,000",,"aaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,000.00,"0A00A00A","AAAA" +"00,000",,"aaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"0A00A00A","AAAA" +"00,000",,"aaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"0A00A00A","AAAA" +"00,000",,"aaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"0A00A00A","AAAA" +"00,000",,"aaaaaaaa@aaaaa.aa",00/00/0000 0:00:00AA,000.00,"0A00A00A","AAAA" +"00,000","00,000","aaaa_aaa_aa@aaaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"0A00A00A","AAAAAAAA" +"00,000",,"aaaaa_000@aaaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"0A00A00A","AAAA" +"00,000",,"aaaa_aaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"0A00A00A","AAAA" +"00,000",,"aaaaaaaa00@aaaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"0A00A00A","AAAA" +"00,000",,"aaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"0A00A00A","AAAA" +"00,000",,"aaaaaaaa@aaa.aa",00/00/0000 0:00:00AA,000.00,"0A00A00A","AAAA" +"00,000",,"aaaaaa00@aaaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"0A00A00A","AAAA" +"00,000",,"aaaaaa_aaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"0A00A00A","AAAA" +"00,000",,"aaaaaaaa_000@aaaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"0A00A00A","AAAA" +"00,000",,"aaaaaaa_000@aaaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"0A00A00A","AAAA" +"00,000",,"aaaaa_aa_aaaa@aaaaa.aaa",00/00/0000 0:00:00AA,000.00,"0A00A00A","AAAA" +"00,000","000,000","aaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"0A00A00A","AAAAAAAA" +"00,000",,"aaaaaaaa000aa@aaaaa.aaa.aa",00/00/0000 0:00:00AA,000.00,"0A00A00A","AAAA" +"00,000",,"aaaaaaa_@aaaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"0A00A00A","AAAA" +"00,000",,"aaaaaaa@aaaaa.aaa.aa",00/00/0000 0:00:00AA,000.00,"0A00A00A","AAAA" +"00,000",,"aaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,000.00,"0A00A00A","AAAA" +"00,000","00,000","aaaaaaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,000.00,"0A00A00A","AAAAAAAA" +"000,000","00,000","aaaaaa000@aaa.aaa",00/00/0000 0:00:00AA,000.00,"0A000A0A","AAAAAAAA AAA AAAAAAA" +"000,000","000,000","Aaaa.Aaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,000.00,"A0000000","AAAAAAAA AAA AAAAAAA" +"000,000","00,000","aaaaaaaaaaaaa0@aaa.aaa",00/00/0000 00:00:00AA,000.00,"A0000000","AAAAAAAA" +"000,000",,"aaa.a.aaaaaa@aa.aaa",00/00/0000 00:00:00AA,000.00,"A0000000","AAAA" +"000,000","000,000","Aaaaaaaa0000@aaaaa.aaa",00/00/0000 00:00:00AA,000.00,"A0000000","AAAAAA AAAA AAAAA" +"000,000",,"aaaaaaaaa@aaaaaaaaaa.aaa",00/00/0000 00:00:00AA,000.00,"A0000000","AAAA" +"000,000",,"aaaaaaaaaaa@aaaaa.aa",00/00/0000 00:00:00AA,000.00,"A0000000","AAAA" +"000,000","0,000","aaaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,000.00,"A0000000","AAAAAAAA" +"000,000",,"aaaaaaaa@aa.aaa",00/00/0000 00:00:00AA,000.00,"A0000000","AAAA" +"000,000","000,000","aaaaaa@aaa.aaa",00/00/0000 00:00:00AA,000.00,"A0000000","AAAAAA AAAA AAAAA" +"000,000",,"aaaaaa.a.aaaaa@aaaaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"0A000A0A","AAAA" +"00,000","000,000","aaaaa@aaaaaaaaa.aa",00/00/0000 00:00:00AA,000.00,"A000000A","AAAAAAAA" +"000,000","00,000","aaaaa.aaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,000.00,"0A0AA00A","AAAAAAAA" +"000,000","0,000","aaaaaaaaaaa@aaaaaaaaa.aa",00/00/0000 00:00:00AA,000.00,"0A0AA00A","AAAAAAAA" +"000,000","00,000","Aaaaa000@aaa.aaa",00/00/0000 00:00:00AA,000.00,"A0000000","AAAAAA AAAA AAAAA" +"000,000",,"a.aaaaaa@aaaaaaaaaaaaa.aa",00/00/0000 00:00:00AA,000.00,"00000000","AAAA" +"000,000","00,000","aaaaa@aaaa.aa",00/00/0000 00:00:00AA,000.00,"A000000A","AAAAAAAA" +"000,000","000,000","aaaaaaa_aaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,000.00,"A000000A","AAAAAAAA" +"00,000","00,000","aaaaaa_aaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,000.00,"000A0AA0","AAAAAAAA AAA AAAAAAA" +"00,000",,"aaaaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"0000000A","AAAA" +"000,000",,"aaaaaaa.aaaa@aaaaaaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"A0000A00","AAAA" +"000,000","000,000","aaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,000.00,"A0000000","AAAAAAAA" +"000,000",,"a0_aaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,000.00,"000AAA00","AAAA" +"000,000",,"aaaaa00@aaaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"A0000000","AAAA" +"00,000",,"Aaaa_Aaaaaaaa@Aaaaaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"0000000A","AAAA" +"00,000",,"AAaaaaaa@aaaaaaaaaaaa.aa",00/00/0000 0:00:00AA,000.00,"0000A00A","AAAA" +"00,000",,"aaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,000.00,"A0000000","AAAA" +"00,000","00,000","aaaaaaa.aaaaaa000@aaaaa.aaa",00/00/0000 0:00:00AA,000.00,"A0000000","AAAAAAAA" +"000,000","00,000","aaaaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,000.00,"0A0A0A00","AAAAAAAA" +"000,000",,"aaaaaa.aaaaaa@aaaaaaaaa.aa",00/00/0000 0:00:00AA,000.00,"0A0A0A00","AAAA" +"00,000",,"aaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"0000000A","AAAA" +"000,000","000,000","aaaaaaaa00@aaaaa.aaa",00/00/0000 0:00:00AA,000.00,"00000A00","AAAAAAAA" +"000,000",,"aaaaa.aaaaa@aa.aaaaaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"00000A00","AAAA" +"000,000","0,000","aaaaaaaa@aaaaaaaaa.aa",00/00/0000 00:00:00AA,000.00,"0A00000A","AAAAAAAA" +"000,000","00,000","aaaaa@aaaaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"0A00000A","AAAAAA AAAA AAAAA" +"00,000","00,000","aaaaa.aaaaaaaa@aaaaaaaaa.aa",00/00/0000 0:00:00AA,000.00,"0A000000","AAAAAAAA AAA AAAAAAA" +"00,000","00,000","aaaaaaaaa0000@aaaaa.aa",00/00/0000 0:00:00AA,000.00,"0A000000","AAAAAAAA" +"00,000",,"aaaaaaaaa00@aaaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"0A000000","AAAA" +"00,000",,"aaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"0A000000","AAAA" +"00,000","00,000","aaaaa@aaaaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"0000000A","AAAAAAAA" +"00,000",,"aaaaaaaaa@aaaaaaaaa.aa",00/00/0000 0:00:00AA,000.00,"0000000A","AAAA" +"00,000",,"aaaa@aaaaaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"0000000A","AAAA" +"00,000","00,000","aaaaaaa@aaaaaaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"0000000A","AAAAAAAA" +"00,000",,"aaaaaaaaa@aaaa.aa",00/00/0000 0:00:00AA,000.00,"0000000A","AAAA" +"00,000","00,000","aaaaaaaaa@aaa.aaa",00/00/0000 0:00:00AA,000.00,"0000000A","AAAAAA AAAA AAAAA" +"000,000","000,000","aaaaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,000.00,"A0000000","AAAAAAAA" +"000,000",,"aaaaaa.aaaaaa@aaaaaaaaa.aa",00/00/0000 0:00:00AA,000.00,"0A0A0A00","AAAA" +"000,000","000,000","aaaaaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,000.00,"A0000000","AAAAAAAA" +"000,000","00,000","aaa@aaaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"0A0A0A00","AAAAAAAA" +"00,000","00,000","aaaaa.aaaaaaaa@aaaaaaaaa.aa",00/00/0000 0:00:00AA,000.00,"00000000","AAAAAAAA" +"00,000","000,000","aaaaa@aaaaaaaaa.aa",00/00/0000 0:00:00AA,000.00,"A000000A","AAAAAAAA" +"00,000",,"aaaaaaaaa@aaaaaaaaa.aa",00/00/0000 0:00:00AA,000.00,"A000000A","AAAA" +"000,000","000,000","aaaaaaaaaaa@aaaaaaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"A0000000","AAAAAAAA AAA AAAAAAA" +"00,000","000,000","aaaaaaaa00@aaaaa.aaa",00/00/0000 0:00:00AA,000.00,"00000000","AAAAAAAA" +"000,000",,"aaaa@aaaaaaaaa.aaa",00/00/0000 00:00:00AA,000.00,"0A00000A","AAAA" +"000,000",,"Aaaaa.Aaaaa@aa.aaaaaaaaa.aaa",00/00/0000 00:00:00AA,000.00,"0A000A0A","AAAA" +"000,000",,"aaaaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,000.00,"0A000A0A","AAAA" +"00,000",,"aaaaaaaaaaaaa00@aaaaa.aaa",00/00/0000 00:00:00AA,000.00,"A0000A00","AAAA" +"00,000","000,000","aa00@aaa.aaa",00/00/0000 00:00:00AA,000.00,"A0000A00","AAAAAAAA" +"00,000",,"aaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,000.00,"A0000A00","AAAA" +"000,000",,"a.aaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,000.00,"AA00AA00","AAAA" +"00,000",,"aaaaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,000.00,"00000A00","AAAA" +"00,000",,"aaaaaaaaa.aaaaaaa@aaaaaaaaaa.aa",00/00/0000 00:00:00AA,000.00,"A00AAAA0","AAAA" +"00,000",,"aaaaaaa.aaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,000.00,"00000000","AAAA" +"000,000",,"aaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,000.00,"00000000","AAAA" +"00,000","000,000","aaaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,000.00,"0A00000A","AAAAAAAA" +"000,000",,"aaaaa.aaaaaaaa@aa-aaaaa.aaa",00/00/0000 0:00:00AA,000.00,"0A0A0A00","AAAA" +"00,000",,"aaaaaaaaaa@aaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"0A0A00AA","AAAA" +000,000,"a.aaaaaaaa@aaaaaaaaa.aa",00/00/0000 0:00:00AA,000.00,"A000A000","AAAAAAAA" +"00,000","00,000","aaaaaaaaa@aaa.aaa",00/00/0000 0:00:00AA,000.00,"00000000","AAAAAAAA" +"000,000",,"aaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,000.00,"A0000000","AAAA" +"000,000",,"aaaaa@aaaaaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"A0000000","AAAA" +"00,000",,"aaaaaaa@AaaaAaa.aa.aa",00/00/0000 0:00:00AA,000.00,"A0000000","AAAA" +"000,000","000,000","aaaaaaaaaaaa@aa.aaa",00/00/0000 0:00:00AA,000.00,"0A000A00","AAAAAA AAAA AAAAA" +"000,000","000,000","aaaaaa_00@aaaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"0A000A00","AAAAAAAA AAA AAAAAAA" +"000,000",,"aaaaaaaa@aaaaaaaaaaaaa.aa",00/00/0000 0:00:00AA,000.00,"0A000A00","AAAA" +"00,000","00,000","aaaaaaaaa.aaaaaaa@aaaaaaaaa.aa",00/00/0000 0:00:00AA,000.00,"AA0A0000","AAAAAAAA AAA AAAAAAA" +"000,000","0,000","aaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,000.00,"A0000000","AAAAAAAA" +"000,000",,"Aa@aaaaaaaaa.aa",00/00/0000 0:00:00AA,000.00,"A0000000","AAAA" +"00,000",,"aaaaaaaaaa@aaaaaaa.aa",00/00/0000 0:00:00AA,000.00,"00000A0A","AAAA" +"00,000",,"aaa@aaaaaaaaaa.aaa",00/00/0000 00:00:00AA,000.00,"A000A000","AAAA" +"00,000",,"aaaaaaaa@aaaaaaaaaa.aaa",00/00/0000 00:00:00AA,000.00,"A000A000","AAAA" +"000,000",,"aaaaaa@aaaaaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"0A00A00A","AAAA" +"00,000",,"aaaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,000.00,"0000AA0A","AAAA" +"000,000",,"aaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,000.00,"00000A0A","AAAA" +"00,000","000,000","aaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,000.00,"0A00000A","AAAAAA AAAA AAAAA" +"00,000",,"aaaa@aaaaaaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"A000A00A","AAAA" +"00,000",,"aaaaa@aaaaaaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"A000A00A","AAAA" +"00,000",,"aaaaa0@aaaaaaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"A000A00A","AAAA" +"00,000",,"aaaaaa@aaaaaaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"A000A00A","AAAA" +"00,000",,"aaaaaaaaa@aaaaaaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"0000AA0A","AAAA" +"000,000",,"aaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,000.00,"0A00000A","AAAA" +"000,000","00,000","aaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,000.00,"A0000000","AAAAAAAA" +"000,000","00,000","aaaaa@aaaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"A0000000","AAAAAAAA" +"000,000","0,000","aaaa@aaaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"A0000000","AAAAAAAA" +"00,000",,"aaaaaaaa0000@aaaaa.aaa",00/00/0000 0:00:00AA,000.00,"0000A00A","AAAA" +"00,000",,"aaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,000.00,"00000A0A","AAAA" +"00,000",,"aaa000@aaa.aaa",00/00/0000 0:00:00AA,000.00,"00000A0A","AAAA" +"00,000",,"aaaa-aaaaaaa@aaa.aaa.aa",00/00/0000 0:00:00AA,000.00,"00000A0A","AAAA" +"00,000","000,000","aaaaaaaa00@aaaaa.aaa",00/00/0000 0:00:00AA,000.00,"00000A0A","AAAAAAAA" +"00,000",,"aaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,000.00,"00000A0A","AAAA" +"00,000",,"aaaaaa0000@aaa.aaa",00/00/0000 0:00:00AA,000.00,"00000A0A","AAAA" +"00,000",,"aaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,000.00,"00000A0A","AAAA" +"00,000","000,000","aaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,000.00,"00000A0A","AAAAAA AAAA AAAAA" +"00,000",,"aaa000@aaa.aaa",00/00/0000 0:00:00AA,000.00,"00000A0A","AAAA" +"00,000",,"aaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,000.00,"00000A0A","AAAA" +"00,000",,"aaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,000.00,"00000A0A","AAAA" +"00,000",,"aaaaaa00@aaaaa.aaa",00/00/0000 0:00:00AA,000.00,"00000A0A","AAAA" +"00,000",,"aaaaa.aaa@aaaaa.aaa",00/00/0000 0:00:00AA,000.00,"00000A0A","AAAA" +"00,000",,"aaaaaaaa0000@aaaaa.aaa",00/00/0000 0:00:00AA,000.00,"00000A0A","AAAA" +"00,000",,"aaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"00000A0A","AAAA" +"00,000",,"aaaa000@aaaaa.aaa",00/00/0000 0:00:00AA,000.00,"00000A0A","AAAA" +"00,000",,"aaaaaaaaa@aaaaaaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"00000A0A","AAAA" +"00,000",,"aaaa000@aaaaa.aaa",00/00/0000 0:00:00AA,000.00,"00000A0A","AAAA" +"00,000",,"aaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,000.00,"00000A0A","AAAA" +"00,000",,"aaaaaaaa00@aaaaa.aaa",00/00/0000 0:00:00AA,000.00,"00000A0A","AAAA" +"000,000","000,000","aaaaa00@aaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"00000A00","AAAAAAAA" +"00,000",,"aaaaaaaa.aaaaaaa@aaaaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"AA0A00AA","AAAA" +"00,000",,"aaaaa@aaaaaaaaaa.aaa",00/00/0000 00:00:00AA,000.00,"A000A000","AAAA" +"00,000","000,000","Aaaaaaa000@aaa.aaa",00/00/0000 0:00:00AA,000.00,"A00A0A00","AAAAAAAA" +"0,000",,"aaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,000.00,"AA000A00","AAAA" +"000,000",,"aaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,000.00,"000A00A0","AAAA" +"00,000","00,000","Aaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"00000000","AAAAAAAA" +"000,000",,"aaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"0A0A0A00","AAAA" +"00,000",,"aaaaaaaaa@aaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"A000A000","AAAA" +"000,000",,"aaaa_aaa000@aaaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"AA0A00A0","AAAA" +"00,000","000,000","aaaaaaaa@aaaaa.aa",00/00/0000 0:00:00AA,000.00,"AA00A00A","AAAAAAAA AAA AAAAAAA" +"000,000","00,000","AAAAAAAAAA@aaaaa.aaa",00/00/0000 0:00:00AA,000.00,"A0000000","AAAAAAAA AAA AAAAAAA" +"000,000","000,000","aaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"A0000000","AAAAAAAA" +"000,000","00,000","aaaaaaaaaaaaa@aaaaa.aa",00/00/0000 0:00:00AA,000.00,"A0000000","AAAAAAAA" +"00,000",,"aaaa@aaaaaaaaaa.aaa",00/00/0000 00:00:00AA,000.00,"A000A000","AAAA" +"00,000",,"aaaaaa@aaaaaaaaaa.aaa",00/00/0000 00:00:00AA,000.00,"A000A000","AAAA" +"000,000","000,000","aaaaaaaaaaaa00@aaaaaaa.aaa",00/00/0000 00:00:00AA,000.00,"A0000000","AAAAAAAA" +"00,000",,"aaaa@aaaaaaaaaa.aaa",00/00/0000 00:00:00AA,000.00,"A000A000","AAAA" +"00,000",,"aaaaa@aaaaaaaaaa.aaa",00/00/0000 00:00:00AA,000.00,"A000A000","AAAA" +"000,000","00,000","aaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,000.00,"A0000000","AAAAAAAA" +"00,000",,"aaaaaa@aaaaaaaaaa.aaa",00/00/0000 00:00:00AA,000.00,"A000A000","AAAA" +"00,000",,"aaaaaaaa@aaaaaaaaaa.aaa",00/00/0000 00:00:00AA,000.00,"A000A000","AAAA" +"000,000","00,000","aaaaaaaaaa.aa@0.aa",00/00/0000 0:00:00AA,000.00,"A0000A0A","AAAAAAAA" +"00,000",,"aaaaa@aaaaaaaaaa.aaa",00/00/0000 00:00:00AA,000.00,"A000A000","AAAA" +"00,000",,"aaaaaa@aaaaaaaaaa.aaa",00/00/0000 00:00:00AA,000.00,"A000A000","AAAA" +"00,000",,"aaaa@aaaaaaaaaa.aaa",00/00/0000 00:00:00AA,000.00,"A000A000","AAAA" +"00,000",,"aaaaaaaaa@aaaaaaaaaa.aaa",00/00/0000 00:00:00AA,000.00,"A000A000","AAAA" +"000,000",,"aaaaaaa@aaaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,000.00,"A0000000","AAAA" +"000,000",,"aaaaaa.aaaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,000.00,"0A00000A","AAAA" +"000,000","00,000","aaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,000.00,"A0000000","AAAAAAAA AAA AAAAAAA" +"00,000",,"aaaaaa@aaaaaaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"A000A00A","AAAA" +"000,000","00,000","aaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,000.00,"0000000A","AAAAAAAA" +"000,000",,"Aaaaaaaaa0000@aaaaa.aaa",00/00/0000 00:00:00AA,000.00,"0A000000","AAAA" +"000,000",,"aaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,000.00,"0000000A","AAAA" +"00,000",,"aaaaaaaaaa@aaaaaaaaa.aa",00/00/0000 0:00:00AA,000.00,"A0000000","AAAA" +"00,000",,"aaaa@aaaaaaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"A000A00A","AAAA" +"00,000",,"aaaaa@aaaaaaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"A000A00A","AAAA" +"000,000",,"aaaaaaaaaa@aaaaaa.aaa",00/00/0000 00:00:00AA,000.00,"A0000000","AAAA" +"0,000",,"aaaaaaaa@aaaaaaaaa.aa",00/00/0000 00:00:00AA,000.00,"0000A00A","AAAA" +"00,000",,"aaaaaa0@aaaaaaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"A000A000","AAAA" +"00,000",,"aaaaaaaaaaa@aaaaaaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"A000A00A","AAAA" +"00,000",,"aaaa@aaaaaaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"A000A00A","AAAA" +"00,000",,"aaaaaaa@aaaaaaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"A000A000","AAAA" +"00,000",,"aaaaaaaaa@aaaaaaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"0000AA0A","AAAA" +"000,000","00,000","aaaaaa_000@aaaaa.aaa",00/00/0000 0:00:00AA,000.00,"A0000000","AAAAAAAA" +"00,000","0,000","AAAAAAAA@aaa.aaa",00/00/0000 0:00:00AA,000.00,"0000A000","AAAAAAAA" +"000,000","00,000","aaaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"00000A00","AAAAAAAA" +"00,000",,"aaaaaaaa@aaa.aaa",00/00/0000 0:00:00AA,000.00,"A0000000","AAAA" +"00,000",,"aaaaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"0000000A","AAAA" +"00,000","00,000","aaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"0000000A","AAAAAAAA" +"00,000",,"aaaaaaa@aaa.aaa",00/00/0000 0:00:00AA,000.00,"0A00A000","AAAA" +"000,000",,"aaaaaa.aaaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,000.00,"0A00000A","AAAA" +"000,000",,"aaaaaa@aaaaaaaaaaaa.aa",00/00/0000 00:00:00AA,000.00,"0A00000A","AAAA" +"000,000",,"aaaaaaaa@aaaaaaaaa.aa",00/00/0000 00:00:00AA,000.00,"0A00000A","AAAA" +"000,000",,"aaaaa.aaaa@aaaaa.aaa",00/00/0000 00:00:00AA,000.00,"A0000A0A","AAAA" +"000,000","000,000","aaaaaaaa@aaaaaaaaa.aa",00/00/0000 00:00:00AA,000.00,"0A00000A","AAAAAA AAAA AAAAA" +"000,000","000,000","aaaaaaa@aaaaaaaa.aaa",00/00/0000 00:00:00AA,000.00,"0A00000A","AAAAAA AAAA AAAAA" +"000,000",,"aaaaa@aaaaa.aa",00/00/0000 00:00:00AA,000.00,"0A00000A","AAAA" +"000,000",,"aaaaaa@aaaaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,000.00,"0A00000A","AAAA" +"000,000",,"aaaaaa@aaaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,000.00,"0A00000A","AAAA" +"000,000",,"aaaaaaa_aaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"0000A00A","AAAA" +"00,000","00,000","aaaaaaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,000.00,"0A00A00A","AAAAAAAA" +"00,000","000,000","aaaaaa@aaaaaaaaa.aa",00/00/0000 0:00:00AA,000.00,"0000AA0A","AAAAAAAA" +"000,000",,"aaaa_aaaaaaaaa@aaa.aaa",00/00/0000 0:00:00AA,000.00,"000AAAAA","AAAA" +"00,000","00,000","aaaaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,000.00,"0000000A","AAAAAAAA AAA AAAAAAA" +"00,000",,"aaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"00000A00","AAAA" +"00,000",,"aaaaaaaaa@aaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"00000A0A","AAAA" +"00,000",,"aaaa@aaaaa.aaa",00/00/0000 0:00:00AA,000.00,"A0000000","AAAA" +"00,000","000,000","aaaaaaaa@aaaa.aaa",00/00/0000 00:00:00AA,000.00,"0A00AA0A","AAAAAAAA" +"000,000",,"aaaaaa_aaaaaaa@aa.aaa",00/00/0000 00:00:00AA,000.00,"AA000000","AAAA" +"000,000","000,000","aaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,000.00,"0A00000A","AAAAAA AAAA AAAAA" +"00,000",,"aaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,000.00,"AA00000A","AAAA" +"00,000",,"aaaa00@aaaaaaa.aaa",00/00/0000 00:00:00AA,000.00,"AA00000A","AAAA" +"00,000",,"aaa_aaaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,000.00,"AA00000A","AAAA" +"00,000","00,000","aaaaa00@aaaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"0000A00A","AAAAAAAA" +"000,000",,"aaaaaa.aaaaaa@aaaa.aa",00/00/0000 0:00:00AA,000.00,"0000000A","AAAA" +"00,000",,"aaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,000.00,"0000000A","AAAA" +"00,000",,"aaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"0000000A","AAAA" +"00,000",,"aaaaa.aaaaaaaaaaaa@aaaaaaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"0000000A","AAAA" +"000,000",,"aaaaaaaaaaaaa@0aaa.aaa",00/00/0000 0:00:00AA,000.00,"0A00000A","AAAA" +"000,000","000,000","aaaaa@aaaaaa.aa",00/00/0000 00:00:00AA,000.00,"0A000A00","AAAAAAAA" +"00,000","00,000","aaaaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,000.00,"A0000A00","AAAAAAAA" +"00,000","000,000","aaaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,000.00,"A0000000","AAAAAA AAAA AAAAA" +"00,000","000,000","aaaaaaa.aaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,000.00,"A0000000","AAAAAA AAAA AAAAA" +"00,000",,"aaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,000.00,"A0000000","AAAA" +"00,000",,"aaaaa.aaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,000.00,"A0000000","AAAA" +"00,000",,"aaaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,000.00,"A0000000","AAAA" +"00,000",,"aaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,000.00,"A0000000","AAAA" +"00,000","00,000","aaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,000.00,"A0000000","AAAAAAAA AAA AAAAAAA" +"00,000","00,000","aaaaa0@aaaaaaa.aaa",00/00/0000 00:00:00AA,000.00,"A0000000","AAAAAAAA AAA AAAAAAA" +"00,000",,"aaaaaaaaaa@aaaaaaaaa.aaa",00/00/0000 00:00:00AA,000.00,"A0000000","AAAA" +"00,000",,"aaaaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,000.00,"A0000000","AAAA" +"00,000",,"aaaa.aaaaaaaa@aaa.aaa",00/00/0000 00:00:00AA,000.00,"A0000000","AAAA" +"00,000",,"aaaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,000.00,"A0000000","AAAA" +"00,000",,"a_aaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,000.00,"A0000000","AAAA" +"00,000",,"aaaaa000@aaaaa.aaa",00/00/0000 00:00:00AA,000.00,"A0000000","AAAA" +"00,000",,"aaaaaa.aaaa@aaaaa.aaa",00/00/0000 00:00:00AA,000.00,"A0000000","AAAA" +"00,000",,"a.aaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,000.00,"A0000000","AAAA" +"00,000",,"aaaaaa.aaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,000.00,"A0000000","AAAA" +"00,000",,"aaa.aaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,000.00,"A0000000","AAAA" +"00,000","000,000","aaaaa@aaaaaaaa.aa",00/00/0000 00:00:00AA,000.00,"A0000000","AAAAAAAA" +"00,000",,"aaaaaaaaa@aaaaaaaaa.aaa",00/00/0000 00:00:00AA,000.00,"A0000000","AAAA" +"00,000",,"aaaaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,000.00,"A0000000","AAAA" +"000,000","000,000","aaaaaaaa@aa.aaaaa.aaa",00/00/0000 0:00:00AA,000.00,"0A0A0A00","AAAAAAAA" +"000,000","000,000","aaaaaaaaa@aaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"0A0A0A00","AAAAAAAA AAA AAAAAAA" +"00,000",,"aaaa.aaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,000.00,"A000AA00","AAAA" +"000,000",,"aaaa0@aaaaaaaaa.aa",00/00/0000 0:00:00AA,000.00,"00000A00","AAAA" +"000,000","000,000","aaaaaaaaaaaaaa@aaaa.aaa",00/00/0000 0:00:00AA,000.00,"00000A00","AAAAAA AAAA AAAAA" +"000,000",,"aaaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"A0000000","AAAA" +"00,000",,"aaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,000.00,"A000A000","AAAA" +"000,000","00,000","aaaa@aaaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"A0000000","AAAAAAAA" +"000,000",,"aaaaa.aaaaaaa@aaaaaaaaa.aa",00/00/0000 0:00:00AA,000.00,"0A0A0A00","AAAA" +"000,000","00,000","aaaaa.aaaaaaa@aaaaaaaaa.aa",00/00/0000 0:00:00AA,000.00,"0A0A0A00","AAAAAAAA" +"000,000","000,000","aaaaaaaa@aa.aaaaa.aaa",00/00/0000 0:00:00AA,000.00,"A0000000","AAAAAA AAAA AAAAA" +"000,000","000,000","aaaaa@aaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"A0000000","AAAAAAAA" +"000,000","000,000","aaaaaaaaaaaa@aaaaa.aa",00/00/0000 0:00:00AA,000.00,"A0000000","AAAAAAAA" +"000,000","000,000","aaaaaaaaaaaa@aaaaaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"A0000000","AAAAAAAA" +"00,000",,"aaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"0000AA0A","AAAA" +"000,000",,"aaaaaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"AA000A00","AAAA" +"000,000","00,000","aaaa@aaaaaaaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"A0000000","AAAAAAAA" +"000,000",,"Aaaaa_A_Aaaaaa@aaaaaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"000A0A00","AAAA" +"00,000","000,000","aaaaa_aaaa000@aaaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"A0000000","AAAAAAAA" +"00,000",,"aaaaa@aaaaaaaaaaaaaaa.aa",00/00/0000 0:00:00AA,000.00,"A000AA00","AAAA" +"000,000","000,000","aaaa_a00@aaaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"A0000000","AAAAAAAA AAA AAAAAAA" +"000,000","000,000","aaaaaaaa0@aaa.aaa",00/00/0000 0:00:00AA,000.00,"A0000000","AAAAAAAA" +"00,000",,"aaaaaaaa_000@aaaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"A0000000","AAAA" +"000,000","00,000","aaaaaa@aaaaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"A0000000","AAAAAAAA" +"00,000",,"aaaaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"0000000A","AAAA" +"00,000","000,000","aaaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"0000000A","AAAAAAAA" +"000,000","000,000","a.aaaa@aaaaaaaaa.aa",00/00/0000 0:00:00AA,000.00,"A0000000","AAAAAAAA" +"000,000","0,000","aaaaaa@aaaaaaaaaaaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"A0000000","AAAAAAAA" +"000,000","000,000","aaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"A0000000","AAAAAAAA AAA AAAAAAA" +"000,000","000,000","aaaa000@aaa.aaa",00/00/0000 0:00:00AA,000.00,"A0000000","AAAAAA AAAA AAAAA" +"000,000","00,000","aaaa.aaaaaaa-aaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"A0000000","AAAAAAAA" +"000,000","00,000","aaaaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,000.00,"A0000000","AAAAAAAA" +"000,000","0,000","aaaaaa.aaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,000.00,"A00AA0A0","AAAAAAAA" +"000,000","000,000","aaaaa0@aaaaaa.aaa",00/00/0000 00:00:00AA,000.00,"A0000000","AAAAAAAA" +"000,000",,"aaaaaaaaa@aaaaaaaaa.aaa",00/00/0000 00:00:00AA,000.00,"0A00000A","AAAA" +"00,000",,"aaaaaaa@aaaaaaaaa.aa",00/00/0000 00:00:00AA,000.00,"0000A00A","AAAA" +"000,000",,"a.aaaaaaaa@a0aaa0aaa.aa",00/00/0000 00:00:00AA,000.00,"AA00AA00","AAAA" +"00,000",,"aaa@aaaaaaaaaa.aaa",00/00/0000 00:00:00AA,000.00,"00000000","AAAA" +"00,000",,"aaaaa@aaaaaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"A0000000","AAAA" +"000,000","00,000","aaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,000.00,"A0000000","AAAAAAAA" +"000,000","000,000","aaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"A0000000","AAAAAAAA" +"000,000","000,000","aaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"A0000000","AAAAAAAA" +"000,000","00,000","aaaaa0000@aaaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"AA00000A","AAAAAAAA AAA AAAAAAA" +"000,000","0,000","aaaaaaaaaa.aaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,000.00,"A0000000","AAAAAAAA" +"000,000","00,000","aaaaaa_aaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"A0000000","AAAAAAAA" +"000,000",,"aaaaaa@AAaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"A0000000","AAAA" +"000,000",,"aa@aaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"A0000000","AAAA" +"00,000","00,000","aaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,000.00,"A0000000","AAAAAAAA" +"00,000","0,000","aaaaa@aaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"A0000000","AAAAAAAA" +"000,000","000,000","aaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"0A00AA0A","AAAAAA AAAA AAAAA" +"000,000","00,000","aaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,000.00,"A0000000","AAAAAAAA" +"000,000","00,000","aaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,000.00,"A0000000","AAAAAAAA" +"00,000",,"aaaaaaa00@aaaaaaa.aaa",00/00/0000 00:00:00AA,000.00,"0000000A","AAAA" +"00,000",,"aaaaaa@aaaaaa.aa.aa",00/00/0000 00:00:00AA,000.00,"0000000A","AAAA" +"00,000",,"aaaaaa@aaaa.aa",00/00/0000 00:00:00AA,000.00,"0000000A","AAAA" +"00,000",,"aaaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,000.00,"0000000A","AAAA" +"00,000","00,000","Aaaa.Aaaaaa@aaaaaaa.aa",00/00/0000 00:00:00AA,000.00,"0000000A","AAAAAAAA AAA AAAAAAA" +"00,000","00,000","aaaaaaaaa0000@aaaaa.aa",00/00/0000 00:00:00AA,000.00,"0000000A","AAAAAA AAAA AAAAA" +"00,000","000,000","aaaaa_aaa00@aaaaa.aaa",00/00/0000 00:00:00AA,000.00,"AA000000","AAAAAAAA" +"000,000",,"aaaaa00@aaaaaa.aa",00/00/0000 0:00:00AA,000.00,"000AAA00","AAAA" +"000,000","000,000","aaaaaa.aaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,000.00,"A0000000","AAAAAA AAAA AAAAA" +"000,000","000,000","aa.aaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,000.00,"A0000000","AAAAAA AAAA AAAAA" +"0,000",,"aaaa@aaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,000.00,"A0000000","AAAA" +"0,000","00,000","aaa00a@aaa.aaa",00/00/0000 00:00:00AA,000.00,"00000A00","AAAAAAAA" +"000,000","00,000","aaaaaa.aaaaaa@aaaaaaaaaaaaaa.aa",00/00/0000 0:00:00AA,000.00,"A0000000","AAAAAAAA" +"000,000",,"Aaaaaaaa.Aaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,000.00,"0A0AA00A","AAAA" +"000,000",,"aaaaaaaaa@aaaaaaaaaa.aaa",00/00/0000 00:00:00AA,000.00,"A0000000","AAAA" +"000,000",,"aaaaaaa@aaaaaaaaa.aa",00/00/0000 00:00:00AA,000.00,"A0000000","AAAA" +"00,000","0,000","aaaaaaaa@aaa.aaa",00/00/0000 00:00:00AA,000.00,"0000000A","AAAAAAAA" +"0,000","000,000","aaaaaaaaa@aaa.aaa",00/00/0000 00:00:00AA,000.00,"0A0AA0A0","AAAAAA AAAA AAAAA" +"0,000",,"aaaaaa0000@aaaaa.aaa",00/00/0000 0:00:00AA,000.00,"0A000000","AAAA" +"00,000","00,000","aa_aaaa@aaaaaaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"0A000A00","AAAAAAAA" +"000,000","00,000","aaaaaaa00@aaaaaaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"A000A000","AAAAAA AAAA AAAAA" +"000,000",,"Aaaaaaaa00@aaa.aaa",00/00/0000 0:00:00AA,000.00,"A000000A","AAAA" +"00,000",,"aaaaaa0000@aaaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"AA000A00","AAAA" +"00,000",,"aaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,000.00,"AA000A00","AAAA" +"000,000",,"aaaaaaaaa0000@aaaaa.aaa",00/00/0000 00:00:00AA,000.00,"0A000000","AAAA" +"00,000",,"aaaaaa00@aaaaa.aaa",00/00/0000 0:00:00AA,000.00,"AA000A00","AAAA" +"00,000",,"aaaaa@aaaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"AA000A00","AAAA" +"00,000",,"aaaaa000@aaa.aaa",00/00/0000 0:00:00AA,000.00,"AA000A00","AAAA" +"0,000",,"aaaaaaa_00@aaaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"0000000A","AAAA" +"000,000","00,000","aaaaaa.aaaaaaa@aaaaaaaaa.aa",00/00/0000 0:00:00AA,000.00,"A0000000","AAAAAAAA" +"000,000",,"AaaaaaaAaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"0000A000","AAAA" +"000,000","000,000","AaaaaaaAaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"0000A000","AAAAAAAA" +"000,000",,"aaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"A0000000","AAAA" +"000,000","00,000","aaaaaaaaa_0000@aaaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"A0000000","AAAAAAAA" +"000,000",,"aaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,000.00,"A0000000","AAAA" +"00,000",,"aaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,000.00,"A0000A00","AAAA" +"00,000",,"aaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,000.00,"A0000A00","AAAA" +"00,000",,"aaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,000.00,"A0000A00","AAAA" +"00,000",,"aaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,000.00,"A0000A00","AAAA" +"00,000",,"aaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,000.00,"A0000A00","AAAA" +"00,000",,"aaaaaa_aaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"A0000A00","AAAA" +"00,000",,"aaaaa_aaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"A0000A00","AAAA" +"00,000","000,000","aaaaaaaa@aaaaaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"AA000A00","AAAAAAAA" +"00,000",,"aaa_aaaa@aaaaa.aaa",00/00/0000 0:00:00AA,000.00,"0000A00A","AAAA" +"000,000",,"aaaaaaaa@aaa.aaa",00/00/0000 0:00:00AA,000.00,"0000AA00","AAAA" +"000,000","000,000","aaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,000.00,"A0000000","AAAAAAAA" +"000,000","00,000","aaaaaaa_aaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"A0000000","AAAAAAAA" +"000,000","0,000","aaa_aaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"A0000000","AAAAAA AAAA AAAAA" +"000,000","00,000","aaaaaa0@aaaa.aaa",00/00/0000 0:00:00AA,000.00,"A0000000","AAAAAA AAAA AAAAA" +"000,000",,"aaaa@aaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"A0000000","AAAA" +"000,000",,"aaaa0000@aaaaaaa.aaa",00/00/0000 00:00:00AA,000.00,"A000AA00","AAAA" +"000,000","000,000","aaaaaaaaa00@aaaaaaa.aaa",00/00/0000 00:00:00AA,000.00,"A0000000","AAAAAA AAAA AAAAA" +"000,000","0,000","AAAAAAA_AAAAA@aaa.aaa",00/00/0000 00:00:00AA,000.00,"A0000000","AAAAAAAA" +"000,000",,"aaa.aaaaaaaaaa00@aaaaaaa.aaa",00/00/0000 00:00:00AA,000.00,"A0000000","AAAA" +"000,000","0,000","aaaaaaaaa@aaa.aaa",00/00/0000 00:00:00AA,000.00,"A0000000","AAAAAAAA" +"000,000","000,000","aaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,000.00,"A0000000","AAAAAAAA" +"000,000","000,000","a_aaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,000.00,"A0000000","AAAAAA AAAA AAAAA" +"000,000","000,000","aaaaa.aaaaaaa@aaa.aaa",00/00/0000 00:00:00AA,000.00,"A0000000","AAAAAAAA" +"000,000","00,000","aaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,000.00,"A0000000","AAAAAA AAAA AAAAA" +"0,000",,"aaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,000.00,"AA00A00A","AAAA" +"0,000",,"aaaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,000.00,"AA00A00A","AAAA" +"0,000","0,000","aaaaaaaaaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,000.00,"AA00A00A","AAAAAAAA" +"0,000",,"aaaaaa00@aaaaaaaaa.aaa",00/00/0000 00:00:00AA,000.00,"AA00A00A","AAAA" +"000,000","00,000","aaaaaaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,000.00,"A0000000","AAAAAAAA" +"000,000","000,000","aaaaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,000.00,"A0000000","AAAAAAAA" +"000,000",,"aaaaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,000.00,"A0000000","AAAA" +"000,000",,"aaaaaaaaaaaaaa@aaa.aaa",00/00/0000 00:00:00AA,000.00,"A0000000","AAAA" +"000,000","00,000","aaaaaaaa00@aaaaaaa.aaa",00/00/0000 00:00:00AA,000.00,"00000000","AAAAAA AAAA AAAAA" +"000,000","00,000","aaaaaa_aaaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,000.00,"A0000000","AAAAAAAA" +"000,000","00,000","aaaaaaaaa0@aaaaaaa.aaa",00/00/0000 00:00:00AA,000.00,"0A00A00A","AAAAAAAA" +"000,000",,"aa000@aaaaaaa.aaa",00/00/0000 00:00:00AA,000.00,"0A00A00A","AAAA" +"000,000",,"aaaa_aaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,000.00,"0A00A00A","AAAA" +"000,000","000,000","aaaaaa@aaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"A0000000","AAAAAA AAAA AAAAA" +"00,000",,"aaaaaaaaa00@aaaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"00000000","AAAA" +"00,000",,"aaaa00@aaaaa.aaa",00/00/0000 0:00:00AA,000.00,"AA00AA00","AAAA" +"00,000",,"aaaaa00@aaaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"0A000A00","AAAA" +"000,000","00,000","aaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,000.00,"A000A000","AAAAAAAA" +"000,000",,"aaaa@aaaaaaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"AA0A00A0","AAAA" +"000,000",,"aaaaaaaa_aaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"AA0A00A0","AAAA" +"000,000",,"aaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"AA0A00A0","AAAA" +"000,000",,"aaaa_aaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"AA0A00A0","AAAA" +"000,000",,"aaaaaaaaaa_aa@aaaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"AA0A00A0","AAAA" +"000,000",,"aaaaaaaa@aaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"AA0A00A0","AAAA" +"000,000","000,000","aaa_aaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"AA0A00A0","AAAAAAAA" +"000,000",,"aaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"AA0A00A0","AAAA" +"000,000",,"aaaaaaaaa_aaaaaaa@aaaaaaaa.aa",00/00/0000 0:00:00AA,000.00,"AA0A00A0","AAAA" +"000,000",,"aaaaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"AA0A00A0","AAAA" +"000,000",,"aaaaaaaaaa@aaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"AA0A00A0","AAAA" +"000,000",,"aaa.aaaaa@aa.aa.aaa",00/00/0000 0:00:00AA,000.00,"AA0A00A0","AAAA" +"000,000",,"aaaaaaaaa@aaaaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"AA0A00A0","AAAA" +"000,000",,"aaaaa.aaaaaa@aa.aa.aaa",00/00/0000 0:00:00AA,000.00,"AA0A00A0","AAAA" +"000,000",,"aaa.aaaaaaaaaa@aa.aa.aaa",00/00/0000 0:00:00AA,000.00,"AA0A00A0","AAAA" +"000,000",,"aaaaaaaaa@aaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"AA0A00A0","AAAA" +"000,000",,"aaaaa00@aaaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"AA0A00A0","AAAA" +"000,000",,"aaaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"AA0A00A0","AAAA" +"000,000",,"aaaaa.aaaaa-aaaaa@aa.aa.aaa",00/00/0000 0:00:00AA,000.00,"AA0A00A0","AAAA" +"000,000",,"aaaaaa@aaaaaaa-aaa.aaa",00/00/0000 0:00:00AA,000.00,"AA0A00A0","AAAA" +"000,000",,"aaaaa.aaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,000.00,"AA0A00A0","AAAA" +"000,000",,"aaaaa-aaaaaa.aaaaa@aa.aa.aaa",00/00/0000 0:00:00AA,000.00,"AA0A00A0","AAAA" +"000,000",,"aaaaaa.aaaaa-aaaaaa@aaaa.aaa",00/00/0000 0:00:00AA,000.00,"AA0A00A0","AAAA" +"000,000",,"aaaaaaa_00_0@aaaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"AA0A00A0","AAAA" +"000,000",,"aaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"AA0A00A0","AAAA" +"000,000",,"aaaaa000@aaaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"AA0A00A0","AAAA" +"000,000","000,000","aaaaaaaaaaa@aaaaa.aa",00/00/0000 0:00:00AA,000.00,"AA0A00A0","AAAAAAAA" +"000,000",,"aaaaaaaaaa@aaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"AA0A00A0","AAAA" +"000,000","000,000","aaaaaa.aaaa@aaaa.aa",00/00/0000 0:00:00AA,000.00,"AA0A00A0","AAAAAAAA" +"000,000",,"aaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"AA0A00A0","AAAA" +"000,000",,"aaaaa.aaaaaa@aa.aa.aaa",00/00/0000 0:00:00AA,000.00,"AA0A00A0","AAAA" +"000,000",,"aaaaaa.aaaa@aa.aa.aaa",00/00/0000 0:00:00AA,000.00,"AA0A00A0","AAAA" +"000,000","000,000","aaaaa_aaaaaaaa@aaaaaaaaa.aa",00/00/0000 0:00:00AA,000.00,"AA0A00A0","AAAAAAAA" +"000,000",,"aaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"AA0A00A0","AAAA" +"000,000",,"aaaaaaa_aaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"AA0A00A0","AAAA" +"000,000",,"aaa_aaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"0000000A","AAAA" +"000,000","0,000","aaaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"0000000A","AAAAAAAA" +"000,000",,"aaaaa_aa000@aaaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"0000000A","AAAA" +"000,000",,"aaaaaaaa@aaaaaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"0000000A","AAAA" +"00,000",,"aaaaaaaa@aaaaaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"00000A0A","AAAA" +"000,000","00,000","aaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"A0000000","AAAAAAAA" +"000,000","00,000","aaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"A0000000","AAAAAAAA" +"000,000","000,000","aaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"A0000000","AAAAAAAA" +"00,000",,"Aaaaaaaa000@aaa.aaa",00/00/0000 0:00:00AA,000.00,"AA00A000","AAAA" +"0,000",,"aaaaa0000@aaaaa.aaa",00/00/0000 00:00:00AA,000.00,"A0000000","AAAA" +"000,000",,"aaaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,000.00,"00000000","AAAA" +"000,000",,"aaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,000.00,"00000A0A","AAAA" +"000,000",,"aaaa_aaa_aaa@aaaaa.aaa",00/00/0000 0:00:00AA,000.00,"0A000A00","AAAA" +"000,000",,"aaaaaaa0000@aaaaa.aaa",00/00/0000 0:00:00AA,000.00,"0A000A00","AAAA" +"000,000",,"aaaaaaaaa@aaa.aaa",00/00/0000 0:00:00AA,000.00,"0A000A00","AAAA" +"000,000","000,000","aaaaaaaaaa000@aaaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"A0000000","AAAAAAAA" +"000,000",,"aaaaaaaa_aaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,000.00,"A0000000","AAAA" +"000,000","000,000","aaaaaaa.aaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,000.00,"A0000000","AAAAAAAA" +"000,000","0,000","aaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"A0000000","AAAAAA AAAA AAAAA" +"00,000",,"aaa_aa@aaaaaaa.aaa",00/00/0000 00:00:00AA,000.00,"0000000A","AAAA" +"000,000",,"aaaaaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,000.00,"AA000000","AAAA" +"00,000","00,000","aaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,000.00,"A000A000","AAAAAAAA" +"000,000",,"aaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,000.00,"0A000A0A","AAAA" +"000,000",,"aaa_aaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"A0000000","AAAA" +"000,000","000,000","aaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,000.00,"A0000000","AAAAAAAA" +"000,000","00,000","aaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,000.00,"A0000000","AAAAAAAA AAA AAAAAAA" +"000,000","000,000","aaaaa.a.aaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,000.00,"A0000000","AAAAAA AAAA AAAAA" +"000,000","00,000","aaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,000.00,"A0000000","AAAAAAAA" +"000,000","00,000","aaaaaaa00@aaaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"A0000000","AAAAAAAA" +"00,000",,"aaaa_aaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"00000000","AAAA" +"00,000","00,000","aaaa.aaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"00000000","AAAAAAAA" +"00,000",,"aaaaaaa0000@aaaaa.aaa",00/00/0000 0:00:00AA,000.00,"00000000","AAAA" +"00,000",,"aaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,000.00,"00000000","AAAA" +"00,000",,"aaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"00000000","AAAA" +"00,000",,"aaaaaaaaaaaaa0@aaaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"00000000","AAAA" +"00,000",,"aaaaaaaa.aaaaa@aaaa.aaaaa.aa.aa",00/00/0000 0:00:00AA,000.00,"00000000","AAAA" +"00,000",,"aaaaaa_aaa@aaaaa.aaa",00/00/0000 0:00:00AA,000.00,"00000000","AAAA" +"00,000",,"aaaaaaa.aaaaaaa@aaaa.aaaaa.aa.aa",00/00/0000 0:00:00AA,000.00,"00000000","AAAA" +"00,000",,"aaaaaaa_aaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,000.00,"00000000","AAAA" +"00,000",,"aaaaaa.aaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,000.00,"00000000","AAAA" +"00,000",,"aaaaaa000@aaaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"00000000","AAAA" +"00,000","00,000","aaaa000@aaaaa.aaa",00/00/0000 0:00:00AA,000.00,"00000000","AAAAAAAA" +"00,000","00,000","aaaaaa.aaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,000.00,"A000A000","AAAAAAAA" +"00,000",,"aaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,000.00,"A00AA000","AAAA" +"000,000","00,000","aaaaa.aaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,000.00,"A0000000","AAAAAAAA" +"000,000","000,000","aaaa0000@aaaaa.aaa",00/00/0000 00:00:00AA,000.00,"A0000000","AAAAAAAA AAA AAAAAAA" +"000,000","00,000","aaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"AA00A000","AAAAAAAA" +"00,000",,"aaaaaa@aaaaaaa.aa",00/00/0000 0:00:00AA,000.00,"A000AA00","AAAA" +"00,000",,"aaaaaa0@aaaaa.aa",00/00/0000 0:00:00AA,000.00,"A000AA00","AAAA" +"00,000","000,000","aaaaa.aaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,000.00,"A000AA00","AAAAAAAA" +"00,000","00,000","aaaaaa.aaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,000.00,"A000AA00","AAAAAAAA AAA AAAAAAA" +"00,000","000,000","aaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"A000AA00","AAAAAAAA" +"00,000",,"aaaaaaa.aaaaaaaa@aa.aaa",00/00/0000 0:00:00AA,000.00,"A000AA00","AAAA" +"00,000","00,000","aaaaaaaa.aaaaaaaaa@aa.aaa",00/00/0000 0:00:00AA,000.00,"A000AA00","AAAAAAAA" +"0,000",,"aaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,000.00,"00000000","AAAA" +"0,000",,"aaaa0000@aaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"00000000","AAAA" +"0,000",,"aaaaaaaaaa@aaa.aaa",00/00/0000 0:00:00AA,000.00,"00000000","AAAA" +"00,000",,"aaaaa00@aaa.aaa",00/00/0000 0:00:00AA,000.00,"A000000A","AAAA" +"0,000",,"aaaaaaaaaaaaa_aaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,000.00,"00000000","AAAA" +"0,000","000,000","aaaaaaaaaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"00000000","AAAAAAAA" +"0,000",,"aaaaaa000@aaaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"00000000","AAAA" +"0,000",,"aaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"00000000","AAAA" +"0,000",,"aaaaaa0000@aaaaa.aaa",00/00/0000 0:00:00AA,000.00,"00000000","AAAA" +"0,000","00,000","aaaaaaaaaa@aaa.aaa",00/00/0000 0:00:00AA,000.00,"0A000A0A","AAAAAAAA" +"000,000","000,000","aaaaa@aaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"A000000A","AAAAAAAA" +"000,000",,"aaaaaaa.aaaa@aaaaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"A000000A","AAAA" +"000,000",,"aaaaaa.aaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,000.00,"A000000A","AAAA" +"00,000",,"aaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"A0000A00","AAAA" +"000,000",,"aaaa.aaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,000.00,"0A000000","AAAA" +"000,000",,"aaaaaaaa000@Aaaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"0000000A","AAAA" +"00,000",,"aaaaaa00@aaaaa.aaa",00/00/0000 0:00:00AA,000.00,"0000A000","AAAA" +"00,000",,"aaaaaa@aaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"0000A000","AAAA" +"00,000",,"aaaaaaaa0@aaa.aaa",00/00/0000 0:00:00AA,000.00,"0000A000","AAAA" +"00,000",,"aaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,000.00,"0000A000","AAAA" +"00,000",,"aaaaaa@aaaa.aaa",00/00/0000 0:00:00AA,000.00,"0000A000","AAAA" +"00,000","00,000","aaa0aaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,000.00,"A0000000","AAAAAAAA AAA AAAAAAA" +"00,000",,"aaaaaaaaa@aaa.aaa",00/00/0000 0:00:00AA,000.00,"000AA00A","AAAA" +"00,000","000,000","aaaaaaa0@aaaaaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"000AA00A","AAAAAAAA" +"000,000",,"aaaaaaaaaa@aaaaaa-aaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"0A00A000","AAAA" +"000,000","000,000","aaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"AA00000A","AAAAAAAA" +"000,000",,"aaaaaa@aaaaaa-aaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"A0000000","AAAA" +"0,000","000,000","aaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,000.00,"0A000A0A","AAAAAAAA" +"00,000","000,000","aaaa@aaaaaaaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"A000AA0A","AAAAAAAA" +"000,000","000,000","aaaaaaa.aaaaaaaa.aa@aaaaa.aaa",00/00/0000 00:00:00AA,000.00,"AA00A000","AAAAAAAA" +"000,000","000,000","aaaaaaaaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,000.00,"AA00A000","AAAAAAAA" +"00,000",,"aaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,000.00,"0A00AA00","AAAA" +"00,000","00,000","aaaaaaaaa0@aaaaa.aaa",00/00/0000 00:00:00AA,000.00,"0A00AA00","AAAAAAAA AAA AAAAAAA" +"00,000","0,000","aaaaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,000.00,"00000000","AAAAAAAA" +"000,000","000,000","aaaaaa.aaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,000.00,"00000000","AAAAAA AAAA AAAAA" +"00,000","000,000","aaaaaa.aaaa@aaaaa.aaa",00/00/0000 00:00:00AA,000.00,"A0000A0A","AAAAAAAA" +"00,000",,"aaaaaa@aaaaaaaaa.aaa",00/00/0000 00:00:00AA,000.00,"A0000000","AAAA" +"00,000","000,000","aaaaaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,000.00,"A0000000","AAAAAAAA AAA AAAAAAA" +"000,000",,"Aaaaaa@aaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,000.00,"000A000A","AAAA" +"00,000",,"aaaaaaaaaaaaa000@aaa.aaa",00/00/0000 00:00:00AA,000.00,"0000A000","AAAA" +"00,000",,"a.a.aaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,000.00,"0000000A","AAAA" +"00,000",,"aaa0000@aaaaa.aaa",00/00/0000 0:00:00AA,000.00,"0A00A000","AAAA" +"000,000",,"aaaaaa00@aaaaa.aaa",00/00/0000 0:00:00AA,000.00,"0A00AA0A","AAAA" +"00,000",,"aaaaaa_aaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,000.00,"A000000A","AAAA" +"00,000",,"aaaaaa@aaa.aaa",00/00/0000 0:00:00AA,000.00,"0000A00A","AAAA" +"00,000","000,000","aaaaaaa.aaaa@aaaa.aaaaa.aaa",00/00/0000 0:00:00AA,000.00,"0000A00A","AAAAAAAA" +"00,000",,"aaaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,000.00,"AA000000","AAAA" +"0,000",,"aaaaaaaaaaaaaaaa00@aaaaa.aaa",00/00/0000 0:00:00AA,000.00,"00000A0A","AAAA" +"000,000",,"aaaaaaaaaaaaaaa@aaaaaaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"A0000000","AAAA" +"000,000","00,000","aaaaa0000@aaaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"A0000000","AAAAAAAA" +"000,000","00,000","aaaaa.aaaa@aaaaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"A0000000","AAAAAAAA" +"000,000","00,000","Aaaaa-aa00@aaaaaa.aa",00/00/0000 0:00:00AA,000.00,"A0000000","AAAAAAAA" +"000,000","00,000","aaaaaaaa.aaaa@aaaaa.aaa",00/00/0000 0:00:00AA,000.00,"A0000000","AAAAAAAA" +"000,000","000,000","aaaaaaa00@aaaaa.aaa",00/00/0000 0:00:00AA,000.00,"A0000000","AAAAAAAA" +"000,000","00,000","a_aaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,000.00,"A0000000","AAAAAA AAAA AAAAA" +"000,000","00,000","aaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,000.00,"A0000000","AAAAAAAA" +"000,000",,"aaaaaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"A0000000","AAAA" +"00,000","0,000","aaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,000.00,"A000AA00","AAAAAA AAAA AAAAA" +"00,000",,"aaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,000.00,"A00AA00A","AAAA" +"000,000","000,000","aaaaaaaaaaaaaaa@aaa.aaa",00/00/0000 0:00:00AA,000.00,"A0000000","AAAAAAAA" +"0,000",,"aaaaaa00@aaaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"0A000A00","AAAA" +"000,000","0,000","aaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,000.00,"A0000000","AAAAAAAA" +"00,000",,"aaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,000.00,"A000AA0A","AAAA" +"00,000","00,000","aaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"A000AA0A","AAAAAAAA" +"00,000",,"aaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,000.00,"A000AA0A","AAAA" +"000,000","000,000","AAAAAAAAAA@AAAAA.AAA",00/00/0000 0:00:00AA,000.00,"A0000000","AAAAAA AAAA AAAAA" +"00,000","0,000","aaaaaaaaa@aaaa.aa",00/00/0000 0:00:00AA,000.00,"AA000000","AAAAAAAA" +"00,000","00,000","aaaaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,000.00,"A000AA00","AAAAAAAA" +"00,000",,"aaa.aaaa@aaaaa.aaa",00/00/0000 00:00:00AA,000.00,"0A000A00","AAAA" +"00,000",,"aaaaaa0@aaaaa.aaa",00/00/0000 00:00:00AA,000.00,"0A000A00","AAAA" +"000,000",,"aaaaaaaaaaaaaaa-0000@aaaaaaa.aaa",00/00/0000 00:00:00AA,000.00,"0A0A0A00","AAAA" +"000,000",,"aaaaaaaaaaaaaaa-0000@aaaaaaa.aaa",00/00/0000 00:00:00AA,000.00,"0A0A0A00","AAAA" +"00,000",,"aaaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,000.00,"0000000A","AAAA" +"00,000",,"aaaa_aaaaa_aaaa@aaaaa.aaa",00/00/0000 00:00:00AA,000.00,"0000000A","AAAA" +"00,000",,"aaaaaaa_aaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,000.00,"0000000A","AAAA" +"00,000","000,000","aaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,000.00,"A000AA00","AAAAAAAA" +"00,000","00,000","aaaaaaaa@aaa.aaa",00/00/0000 0:00:00AA,000.00,"A000AA00","AAAAAAAA" +"00,000",,"aaaaaaa@aaaaaa-aaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"0A00000A","AAAA" +"00,000",,"aaaaaaaaa@aaaaaa-aaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"0A00000A","AAAA" +"00,000",,"aaaaaaa@aaaaaa-aaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"0A00000A","AAAA" +"00,000","00,000","aaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,000.00,"0A00000A","AAAAAA AAAA AAAAA" +"000,000",,"aaaaa@aaaaaaaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"00000A0A","AAAA" +"0,000",,"aaaa_aaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"000A0000","AAAA" +"00,000","00,000","aaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,000.00,"A000AA0A","AAAAAAAA" +"0,000",,"aaaaaaa0000@aaaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"0A000A0A","AAAA" +"00,000",,"aaaaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,000.00,"00000A0A","AAAA" +"000,000","00,000","aaaaaa_@aaaaaaa.aaa",00/00/0000 00:00:00AA,000.00,"A0000000","AAAAAAAA" +"00,000","00,000","Aaaaa00@aa.aaa",00/00/0000 00:00:00AA,000.00,"0000AA0A","AAAAAAAA" +"00,000",,"AaaaaaAaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,000.00,"0000AA0A","AAAA" +"00,000","00,000","Aaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,000.00,"0000AA0A","AAAAAAAA" +"00,000","000,000","AaaaaAaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,000.00,"0000AA0A","AAAAAAAA" +"00,000",,"AAAAAAA@AAAAA.AA.AA",00/00/0000 00:00:00AA,000.00,"0A00AA00","AAAA" +"00,000","00,000","AAAAAA.AAAAAAAA@AAAAAA.AAA",00/00/0000 00:00:00AA,000.00,"0A00AA00","AAAAAA AAAA AAAAA" +"00,000",,"AAAAAAAA@AAAAA.AA.AA",00/00/0000 00:00:00AA,000.00,"0A00AA00","AAAA" +"000,000","000,000","aaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,000.00,"A0000000","AAAAAAAA AAA AAAAAAA" +"000,000",,"aaaaaaaaa00@aaaaa.aaa",00/00/0000 00:00:00AA,000.00,"A0000000","AAAA" +"000,000","000,000","aaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,000.00,"A0000000","AAAAAAAA" +"000,000",,"aaaaaaa@aaaaaaaa.aaa",00/00/0000 00:00:00AA,000.00,"A0000000","AAAA" +"000,000","00,000","aaaaa_aaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,000.00,"A0000000","AAAAAA AAAA AAAAA" +"000,000","00,000","aaaa0000@aaa.aaa",00/00/0000 00:00:00AA,000.00,"A0000000","AAAAAAAA" +"000,000",,"aaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,000.00,"A0000000","AAAA" +"000,000",,"aaaaaa@aaaaaaaaaa.aaa",00/00/0000 00:00:00AA,000.00,"A0000000","AAAA" +"000,000","000,000","aaaaaaaaa0@aaaaa.aaa",00/00/0000 00:00:00AA,000.00,"0000AA0A","AAAAAAAA" +"00,000",,"Aaaaa.Aaaaaa@aaaaaa.aaa",00/00/0000 00:00:00AA,000.00,"A000AA00","AAAA" +"000,000","000,000","aaaaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,000.00,"A0000000","AAAAAAAA" +"00,000",,"aaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,000.00,"00000000","AAAA" +"00,000",,"AAAAAAAAAAAAAA@aaaaaaa.aaa",00/00/0000 00:00:00AA,000.00,"00000000","AAAA" +"00,000",,"aaa.aaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,000.00,"00000000","AAAA" +"00,000",,"aaaa000000@aaaaa.aaa",00/00/0000 00:00:00AA,000.00,"00000000","AAAA" +"00,000","000,000","a.aaaaa00@aaaaaaa.aaa",00/00/0000 00:00:00AA,000.00,"00000000","AAAAAAAA" +"00,000",,"aaaaaaaa0@aaaaa.aaa",00/00/0000 00:00:00AA,000.00,"00000000","AAAA" +"00,000",,"aaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,000.00,"00000000","AAAA" +"00,000",,"aaaaaaa00@aaaaa.aaa",00/00/0000 00:00:00AA,000.00,"00000000","AAAA" +"00,000",,"aaaaaaaaaa00@aaaaa.aaa",00/00/0000 00:00:00AA,000.00,"00000000","AAAA" +"00,000",,"aaaa.aaa@aaaaa.aaa",00/00/0000 00:00:00AA,000.00,"00000000","AAAA" +"00,000",,"Aaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,000.00,"00000000","AAAA" +"00,000",,"aaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,000.00,"00000000","AAAA" +"00,000",,"aaaa.aaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,000.00,"00000000","AAAA" +"00,000",,"aaaaa00@aaaaaaa.aaa",00/00/0000 00:00:00AA,000.00,"00000000","AAAA" +"00,000",,"aaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,000.00,"00000000","AAAA" +"00,000",,"aa@aaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,000.00,"00000000","AAAA" +"00,000","00,000","aaaaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,000.00,"00000000","AAAAAAAA" +"00,000",,"aaaaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,000.00,"00000000","AAAA" +"00,000",,"aaaa_aaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,000.00,"00000000","AAAA" +"00,000",,"aaaaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,000.00,"00000000","AAAA" +"00,000",,"aaaaaaa0@aaaa.aaa",00/00/0000 00:00:00AA,000.00,"00000000","AAAA" +"00,000",,"aaaaaa.aaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,000.00,"00000000","AAAA" +"00,000",,"aaaaaa_aaaaaaaa@aaaaaa.aaa",00/00/0000 00:00:00AA,000.00,"00000000","AAAA" +"000,000","000,000","aaaaaa0@aaa.aaa",00/00/0000 00:00:00AA,000.00,"0A0AAA0A","AAAAAAAA" +"00,000","000,000","aaaaaa00@aaaaa.aaa",00/00/0000 00:00:00AA,000.00,"A000AA00","AAAAAA AAAA AAAAA" +"00,000","000,000","aaaaaa@aaa-aa.aaa",00/00/0000 0:00:00AA,000.00,"0000A000","AAAAAAAA" +"000,000","00,000","aaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,000.00,"A0000000","AAAAAAAA" +"000,000","000,000","Aaaaaa0000@aaa.aaa",00/00/0000 0:00:00AA,000.00,"A0000000","AAAAAAAA" +"000,000","00,000","a_aaaaaa@aaa.aaa",00/00/0000 0:00:00AA,000.00,"A0000000","AAAAAAAA AAA AAAAAAA" +"000,000",,"aaaaa@aaaaaaaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"0A00A00A","AAAA" +"000,000",,"aaa000@aaaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"0A00A00A","AAAA" +"000,000",,"aaaaaaaaa@aaa.aaa",00/00/0000 0:00:00AA,000.00,"AA00A000","AAAA" +"000,000",,"aaaaaaaaa@aaa.aaa",00/00/0000 0:00:00AA,000.00,"AA00A000","AAAA" +"000,000",,"aaaaaaaa@aaaaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"AA00A000","AAAA" +"000,000","000,000","aaaaaa@aaaaaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"AA00A000","AAAAAA AAAA AAAAA" +"00,000",,"aaaaaa.aaaaa@aaaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"000A00A0","AAAA" +"000,000","00,000","Aaa.Aaa@aaaaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"000AA0AA","AAAAAA AAAA AAAAA" +"00,000","000,000","aaaaaaa.aaaaaaa@aaaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"000A00A0","AAAAAAAA" +"0,000",,"aaaaaa.aaaaaaa@aa.aaa",00/00/0000 0:00:00AA,000.00,"000A0AA0","AAAA" +"000,000",,"aaa@aaaaaaaaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"A000000A","AAAA" +"000,000",,"aaaaaaaaaa@aaa.aaa",00/00/0000 0:00:00AA,000.00,"0A00AA00","AAAA" +"000,000",,"aaaaaa.aaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"0000000A","AAAA" +"000,000",,"aaaaa.aaaaaa@aaaa.aaa",00/00/0000 0:00:00AA,000.00,"0000000A","AAAA" +"00,000","00,000","aaaaaaaa_0@aaaaa.aaa",00/00/0000 0:00:00AA,000.00,"A000A00A","AAAAAA AAAA AAAAA" +"00,000",,"aaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,000.00,"A000A00A","AAAA" +"00,000",,"aaaa.aaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,000.00,"A000A00A","AAAA" +"000,000",,"aaaaaaa_aaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"0000AA0A","AAAA" +"00,000",,"aaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"0000000A","AAAA" +"00,000",,"aaa0000@aaa.aaa",00/00/0000 0:00:00AA,000.00,"00000A0A","AAAA" +"000,000",,"aaaaaa.aaaaaaaaa@aaaa.aaa",00/00/0000 0:00:00AA,000.00,"A000AA00","AAAA" +"00,000",,"aaaaa@aaaaaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"A000AA00","AAAA" +"00,000",,"aaaaaaa.aaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,000.00,"00000A0A","AAAA" +"00,000",,"aaaaaaa@aaaaaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"00000A0A","AAAA" +"00,000",,"aaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"00000A0A","AAAA" +"00,000",,"aaaaaaa000@aaaaa.aaa",00/00/0000 0:00:00AA,000.00,"00000A0A","AAAA" +"00,000","00,000","aaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,000.00,"00000A0A","AAAAAAAA" +"00,000",,"aaaa00@aaaaaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"00000A0A","AAAA" +"00,000",,"aaaaaa0@aaa.aaa",00/00/0000 0:00:00AA,000.00,"00000A0A","AAAA" +"00,000",,"aaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,000.00,"00000A0A","AAAA" +"00,000",,"aaaaa00@aaaaaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"00000A0A","AAAA" +"00,000",,"aaaaaaa@aaaaaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"00000A0A","AAAA" +"00,000",,"aaaaaaa@aaaaa.aa",00/00/0000 0:00:00AA,000.00,"00000A0A","AAAA" +"00,000",,"aaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"00000A0A","AAAA" +"00,000","000,000","aaaaaa@aaaaaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"00000A0A","AAAAAAAA" +"00,000",,"aaaaa@aaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"00000A0A","AAAA" +"00,000",,"aaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,000.00,"00000A0A","AAAA" +"00,000",,"aaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"00000A0A","AAAA" +"00,000",,"aaaaaa00@aaa.aaa",00/00/0000 0:00:00AA,000.00,"00000A0A","AAAA" +"00,000",,"aaaaaaa000@aaa.aaa",00/00/0000 0:00:00AA,000.00,"00000A0A","AAAA" +"00,000","000,000","aaaaaa0000@aaa.aaa",00/00/0000 0:00:00AA,000.00,"00000A0A","AAAAAAAA" +"00,000",,"aa_aaaaaaa_aaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,000.00,"00000A0A","AAAA" +"00,000",,"aaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"00000A0A","AAAA" +"00,000",,"aaaaaaaa.aaaaaaa@aaa.aaa",00/00/0000 0:00:00AA,000.00,"00000A0A","AAAA" +"00,000",,"aaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,000.00,"00000A0A","AAAA" +"00,000",,"aaaaaaaaaa@aaa.aaa",00/00/0000 0:00:00AA,000.00,"00000A0A","AAAA" +"00,000","000,000","aaa00@aaaaaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"00000A0A","AAAAAAAA" +"00,000",,"aaaaaa@aaaaaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"00000A0A","AAAA" +"00,000",,"aaaaaaaaaaa@aaa.aaa",00/00/0000 0:00:00AA,000.00,"00000A0A","AAAA" +"00,000",,"aaaaaa0000@aaaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"00000A0A","AAAA" +"00,000",,"aaaaaaa00@aaaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"00000A0A","AAAA" +"00,000",,"aaaaaaaaaaaaa@aaa.aaa",00/00/0000 0:00:00AA,000.00,"00000A0A","AAAA" +"00,000",,"aaaaaa0@aaaaaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"00000A0A","AAAA" +"00,000","000,000","aaaaa@aaaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"00000A0A","AAAAAAAA AAA AAAAAAA" +"00,000",,"aaaaaaaaaa00@aaaaa.aaa",00/00/0000 0:00:00AA,000.00,"00000A0A","AAAA" +"00,000",,"aaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,000.00,"00000A0A","AAAA" +"00,000",,"aa0aa00@aaaaa.aaa",00/00/0000 0:00:00AA,000.00,"000A0000","AAAA" +"00,000",,"a_aaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,000.00,"A0000A00","AAAA" +"00,000","00,000","aaaaaaaaa00@aaaaa.aaa",00/00/0000 0:00:00AA,000.00,"0A0A0000","AAAAAAAA" +"00,000",,"aaaaa.aaaaaaaaa@aaaa.aaa",00/00/0000 0:00:00AA,000.00,"AA00A000","AAAA" +"00,000",,"aaaaaaa@aaa.aaa",00/00/0000 0:00:00AA,000.00,"000A0000","AAAA" +"00,000",,"aaaaaaaa.aaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,000.00,"000A0000","AAAA" +"00,000",,"aaaaaaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,000.00,"000A0000","AAAA" +"00,000",,"aaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,000.00,"000A0000","AAAA" +"00,000",,"aaaaaaa@aaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"000A0000","AAAA" +"00,000",,"aaaaaaaa@aaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"000AAA0A","AAAA" +"00,000",,"aaaaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,000.00,"000AAA0A","AAAA" +"00,000",,"aaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"000AAA0A","AAAA" +"00,000",,"aa_aaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"000AAA0A","AAAA" +"00,000",,"aaaaaaaaaaaaaa@aaa.aaa",00/00/0000 0:00:00AA,000.00,"000AAA0A","AAAA" +"00,000",,"a_aaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"000AAA0A","AAAA" +"00,000",,"aaaaaaaa.aaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,000.00,"AA00AA00","AAAA" +"00,000",,"aaaaaaa@aaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"000AAA0A","AAAA" +"00,000",,"aaaaaa00@aaaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"0A000A00","AAAA" +"00,000","0,000","aaaaaaa00@aaaaa.aaa",00/00/0000 0:00:00AA,000.00,"0A000A00","AAAAAA AAAA AAAAA" +"00,000",,"aaaaaaaaaaa@aaa.aaa",00/00/0000 0:00:00AA,000.00,"0A000A00","AAAA" +"00,000",,"aaaaaaaa00@aaaaa.aaa",00/00/0000 0:00:00AA,000.00,"0A000A00","AAAA" +"00,000",,"aaaaaa00@aaaaa.aaa",00/00/0000 0:00:00AA,000.00,"0A000A00","AAAA" +"00,000",,"aaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,000.00,"0A000A00","AAAA" +"000,000",,"aaaaaa_aaaa_aaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"A0000000","AAAA" +"000,000","00,000","Aaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"A0000000","AAAAAAAA" +"00,000",,"aaaa.aaaaaaaa@aaaa.aaa",00/00/0000 0:00:00AA,000.00,"00000A0A","AAAA" +"000,000","00,000","aaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,000.00,"00000A0A","AAAAAAAA" +"000,000","00,000","aaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"00000A0A","AAAAAA AAAA AAAAA" +"000,000",,"aaa.aaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,000.00,"0A000A0A","AAAA" +"000,000",,"aaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,000.00,"AA00000A","AAAA" +"000,000",,"aaaaa00@aaa.aaa",00/00/0000 0:00:00AA,000.00,"AA00000A","AAAA" +"000,000",,"aaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,000.00,"AA00000A","AAAA" +"000,000","00,000","aaaa_aaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,000.00,"0A000A00","AAAAAA AAAA AAAAA" +"000,000",,"aaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,000.00,"0A000A00","AAAA" +"000,000","000,000","a0aaaaaaa0@aaa.aaa",00/00/0000 0:00:00AA,000.00,"0A000A00","AAAAAAAA" +"000,000",,"aaaaaaaaaa0a@aaa.aaa",00/00/0000 0:00:00AA,000.00,"0A000A00","AAAA" +"000,000",,"aaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,000.00,"0A000A00","AAAA" +"000,000",,"aaaaaaaaa@aaa.aaa",00/00/0000 0:00:00AA,000.00,"0A000A00","AAAA" +"000,000",,"aaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"0A000A00","AAAA" +"000,000",,"aaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,000.00,"0A000A00","AAAA" +"000,000",,"aaaaaaa00@aaaaa.aaa",00/00/0000 0:00:00AA,000.00,"0A000A00","AAAA" +"000,000",,"aaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"0A000A00","AAAA" +"000,000",,"aaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,000.00,"0A000A00","AAAA" +"00,000","000,000","aaaaaaa.aaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,000.00,"A000AA0A","AAAAAAAA" +"000,000",,"aaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,000.00,"A00AA00A","AAAA" +"000,000",,"aaaaaaa.aaaaaaaa@aaaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"A00AA00A","AAAA" +"000,000",,"aaaa.aaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,000.00,"A00AA00A","AAAA" +"00,000",,"aaaaaaaaa.aaaaaaaaa@aaaa.aaa",00/00/0000 0:00:00AA,000.00,"A000AA00","AAAA" +"00,000","000,000","aaaa.aa.a000000@aaaa.aaa",00/00/0000 0:00:00AA,000.00,"0A00AA0A","AAAAAA AAAA AAAAA" +"00,000",,"aaaaaa.aaaaaaaaa@aaaa.aaa",00/00/0000 0:00:00AA,000.00,"0A00AA0A","AAAA" +"00,000",,"aaaaa.aaaaaaaaaa@aaaa.aaa",00/00/0000 0:00:00AA,000.00,"0A00AA0A","AAAA" +"00,000",,"aaaa.aaaaa@aaaa.aaa",00/00/0000 0:00:00AA,000.00,"0A00AA0A","AAAA" +"00,000",,"aaaaaaa.a.aaaaa@aaaaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"0A00AA0A","AAAA" +"000,000",,"aaaaaaaa.aaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,000.00,"A00A0A0A","AAAA" +"000,000","000,000","aaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,000.00,"A00A0A0A","AAAAAAAA" +"000,000",,"aaaaaaa.aaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,000.00,"0A00000A","AAAA" +"000,000",,"aaaaa.aaaaaa@aaaaaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"0A0A0AA0","AAAA" +"00,000",,"aaa0000@aaaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"AA000000","AAAA" +"000,000","000,000","aaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,000.00,"0000A000","AAAAAA AAAA AAAAA" +"000,000",,"aaaaaaa.aaaaaaaa@aaa.aaa",00/00/0000 0:00:00AA,000.00,"0A000000","AAAA" +"00,000",,"aaaaa.aaaaaaaaa@aaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"A000AA0A","AAAA" +"00,000",,"aaaaaa.a.aaaaa@aaaaaaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"A000AA0A","AAAA" +"00,000",,"aaaaaaaaaaaaaaaaaaa00@aaaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"A000AA0A","AAAA" +"00,000",,"aaaaaaa.aaaaaaa@aaa.aaa",00/00/0000 0:00:00AA,000.00,"A000AA0A","AAAA" +"00,000",,"Aaaaaa.Aaaaa@aaa.aaa",00/00/0000 0:00:00AA,000.00,"A000AA0A","AAAA" +"00,000","000,000","aaaaaaa000a@aaa.aaa",00/00/0000 0:00:00AA,000.00,"A000AA0A","AAAAAAAA" +"00,000",,"AAAAAAA@aaa.aaa",00/00/0000 0:00:00AA,000.00,"A000AA0A","AAAA" +"00,000",,"aaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"A000AA0A","AAAA" +"000,000","00,000","aaaa00@aaaaa.aaa",00/00/0000 0:00:00AA,000.00,"A0000000","AAAAAAAA" +"000,000",,"aaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,000.00,"0A0A0AA0","AAAA" +"000,000",,"AaaaaaaaAaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,000.00,"A0000A00","AAAA" +"000,000","00,000","aaaaaaaaaa000@aaa.aaa",00/00/0000 0:00:00AA,000.00,"A0000000","AAAAAAAA" +"000,000","000,000","aaaaaa_aaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"A0000000","AAAAAAAA" +"000,000","0,000","aaaaa0aa@aaaaa.aaa",00/00/0000 0:00:00AA,000.00,"A0000000","AAAAAAAA" +"000,000","000,000","aaaaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"A0000000","AAAAAAAA" +"000,000",,"aaaaaaa@aaaaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"A0000000","AAAA" +"000,000","000,000","aaaaaa0@aaa.aaa",00/00/0000 0:00:00AA,000.00,"A0000000","AAAAAAAA" +"000,000","000,000","a.aaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,000.00,"0A000000","AAAAAAAA" +"000,000","00,000","aaaaaaaaaaaaa00@aaaaa.aaa",00/00/0000 0:00:00AA,000.00,"A0000000","AAAAAAAA" +"000,000",,"aaaaa.aaaaa@aaaaaaaa.aaa",00/00/0000 0:00:00AA,000.00,"00000A0A","AAAA" +"000,000","000,000","AAaaaaa000@aaa.aaa",00/00/0000 0:00:00AA,000.00,"A0000000","AAAAAAAA" +"0,000","00,000","aaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A00000A","AAAAAA AAAA AAAAA" +"000,000",,"aaaaa_aaa00@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A0000000","AAAA" +"000,000",,"aaa0000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A0000000","AAAA" +"00,000","00,000","aaaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A000000A","AAAAAAAA" +"00,000",,"aaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A000000A","AAAA" +"00,000",,"Aaaaaa.Aaaa@aa.aaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A000000A","AAAA" +"000,000",,"aaaaaaaaaaaa00@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A0000000","AAAA" +000,"00,000","aaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A000AA00","AAAAAAAA AAA AAAAAAA" +"000,000",,"aaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A0000000","AAAA" +"000,000","00,000","aaaaaaaa@aaa-aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A0000000","AAAAAAAA" +"000,000",,"Aaaaaaa.Aaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A0000000","AAAA" +"000,000",,"aaaaaa.aaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A00A000","AAAA" +"000,000",,"aaaaaaaaaa00@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A00A000","AAAA" +"000,000",,"aaaa_aaaaaa-aaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A00A000","AAAA" +"000,000",,"aaaaa_aaaaa-aaaaaa@aa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A00A000","AAAA" +"000,000",,"aaaaaaa.aaaaa@aaa.aaaaa.aa.aa",00/00/0000 0:00:00AA,"0,000.00","0A00A000","AAAA" +"000,000",,"aaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A00A000","AAAA" +"00,000","00,000","aaaaaaaa.aaaaa@aa.aaa",00/00/0000 0:00:00AA,"0,000.00","00000A00","AAAAAAAA AAA AAAAAAA" +"000,000","00,000","aaaaaaaaaaaaaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AA000A00","AAAAAAAA" +"000,000","000,000","aaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0000000A","AAAAAAAA" +"000,000","00,000","aaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0000000A","AAAAAAAA" +"000,000",,"aaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0000000A","AAAA" +"000,000","000,000","aaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A0000000","AAAAAA AAAA AAAAA" +"000,000",,"aaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0000000A","AAAA" +"00,000",,"aaaaaa@aaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0000A00A","AAAA" +"00,000","000,000","aaaaaa00@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A000A0A","AAAAAAAA" +"00,000",,"aaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A000A0A","AAAA" +"00,000",,"aaaaaa.aaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A000A0A","AAAA" +"00,000",,"aaaaaa@aaaaaaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A000A0A","AAAA" +"00,000","000,000","aaaaaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A000A0A","AAAAAAAA" +"00,000",,"aaaaaaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A000A0A","AAAA" +"000,000",,"Aaaaa_aaaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0A000000","AAAA" +"000,000",,"aaaaaaaa_aaa00@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0A000000","AAAA" +"00,000","00,000","aaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0000A00A","AAAAAAAA" +"000,000","000,000","aaaaa_aaaaa00@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AA000A00","AAAAAAAA" +"000,000",,"aaaaa.aaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","A0000A00","AAAA" +"000,000","0,000","aaaaaa_aaa00@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","A0000A00","AAAAAAAA" +"000,000",,"aaa_aaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","A0000A00","AAAA" +"00,000",,"a00aa00@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AA00A000","AAAA" +"00,000",,"aaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AA00A000","AAAA" +"00,000",,"aaaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AA00A000","AAAA" +"00,000",,"aaaaaa0@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AA00A000","AAAA" +"000,000","000,000","aaaa_aaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0A000A00","AAAAAAAA" +"00,000",,"aaaaaaa_aaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AA00A000","AAAA" +"00,000",,"aaaaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AA00A000","AAAA" +"00,000",,"aaaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AA00A000","AAAA" +"000,000","000,000","aaaaaaa00@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0000A000","AAAAAAAA" +"00,000",,"aaaaaaaaaaa@aaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A000000A","AAAA" +"000,000",,"a0000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A00AA000","AAAA" +"000,000",,"aaa@aaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","00000000","AAAA" +"00,000",,"aaaaaa@aaa.aa.aaa",00/00/0000 0:00:00AA,"0,000.00","0000A00A","AAAA" +"00,000","00,000","aaaaa.a.aaaaa@aaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A0A0AAA","AAAAAA AAAA AAAAA" +"00,000",,"aaaaaa0000@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A000000A","AAAA" +"00,000",,"aaaaa00@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A000000A","AAAA" +"00,000","00,000","aaaaaaaa00@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A000A00","AAAAAAAA" +"00,000",,"aaaaa-aaaa.aaaa@aaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A000A00","AAAA" +"00,000",,"aaaaaa@aaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A000A00","AAAA" +"00,000",,"aaaaaaa@aaaaaaaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A000A00","AAAA" +"00,000",,"aaaaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A000A00","AAAA" +"00,000","0,000","aaaaaa.aaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A000A00","AAAAAAAA" +"00,000",,"aaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A000A00","AAAA" +"00,000",,"Aaaaaaaa.Aaaaaaaaa@AAAAAAAAAAAAA.AAA",00/00/0000 0:00:00AA,"0,000.00","0A000A00","AAAA" +"00,000",,"AAaaaaaaa@aaaaa.aa",00/00/0000 0:00:00AA,"0,000.00","0A000A00","AAAA" +"00,000","000,000","Aaaa_Aaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A000A00","AAAAAAAA" +"00,000",,"Aaaa.Aaaaaaaaa@AaaaAaaaaAaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A000A00","AAAA" +"00,000",,"aaaaa.aaaaaaa@aa.aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A000A00","AAAA" +"00,000",,"AaaaaA@aaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A000A00","AAAA" +"000,000","000,000","aaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AA00A000","AAAAAAAA" +"00,000",,"Aaaaaaa.Aaaaaaa@AaaaaAaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A000A00","AAAA" +"000,000",,"aaaaaaaa.aaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AA00A000","AAAA" +"00,000",,"aaaaaaaa.aaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A000A00","AAAA" +"00,000","000,000","aaaaa0000@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A000A00","AAAAAA AAAA AAAAA" +"00,000",,"aaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A000A00","AAAA" +"00,000",,"aaaaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A000A00","AAAA" +"00,000","000,000","aaa0@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AA00A00A","AAAAAAAA" +"00,000",,"AAaaaaaaa@aaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A000A00","AAAA" +"00,000",,"aaaaaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A000A00","AAAA" +"00,000",,"Aaaaaa.Aaaaaa@aaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A000A00","AAAA" +"00,000",,"aaaaa@aaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A000A00","AAAA" +"00,000",,"aaaaaa0000@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0000000A","AAAA" +"00,000","000,000","aaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0000000A","AAAAAAAA" +"000,000","00,000","aaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0000A000","AAAAAAAA" +"000,000",,"a.aaaaa00@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","00000000","AAAA" +"000,000","000,000","aaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0000000A","AAAAAAAA" +"000,000",,"aaaaaa.aaa.aaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0000000A","AAAA" +"000,000",,"aaaaaaa_aaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","00000000","AAAA" +"000,000",,"aaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0000000A","AAAA" +"00,000",,"aaaaa000@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AA00A000","AAAA" +"00,000","000,000","aaaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AA00A000","AAAAAAAA" +"000,000",,"a.aaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0000000A","AAAA" +"000,000",,"aaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0000000A","AAAA" +"00,000",,"aaaaaaaa00@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A000AA00","AAAA" +"000,000","000,000","Aaaaa00@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A000AA0A","AAAAAAAA" +"000,000","000,000","aaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A000A0A","AAAAAAAA" +"000,000",,"aaaaaaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A000A0A","AAAA" +"000,000",,"aaaaaa@aaaaaaa0.aaa",00/00/0000 0:00:00AA,"0,000.00","0A000A0A","AAAA" +"00,000",,"aaaaa0000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A000A000","AAAA" +"000,000","000,000","aaaa000@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0000AA00","AAAAAAAA" +"000,000",,"aaaa_aaaa@aa.aaa",00/00/0000 0:00:00AA,"0,000.00","0000AA00","AAAA" +"00,000",,"aaaa000000@aaaaaa.aa",00/00/0000 0:00:00AA,"0,000.00","0000A000","AAAA" +"00,000",,"aaaaaa0000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A000A000","AAAA" +"000,000","000,000","Aaaaa00@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A0000000","AAAAAA AAAA AAAAA" +"000,000",,"aaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A00000A","AAAA" +"000,000",,"aaaaaa0000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A00000A","AAAA" +"000,000",,"aaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A00000A","AAAA" +"000,000",,"aaaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0A00000A","AAAA" +"00,000",,"aaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","00000A00","AAAA" +"000,000","000,000","aaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AA000A00","AAAAAAAA" +"000,000","000,000","aaaaa.aaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","A00A00A0","AAAAAAAA" +"000,000",,"Aaaaaaaa.aaa@aaaaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","A00A00A0","AAAA" +"000,000",,"aaaaaaaaaa@aaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","A000AA0A","AAAA" +"00,000",,"aaaaaaaa0@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","A000A000","AAAA" +"000,000",,"aaaaaaaa@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AA000A0A","AAAA" +"000,000","000,000","aaaaaaa.aaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0A000000","AAAAAAAA" +"00,000","00,000","AAAAAAAA.A.AAAAAAAA@AAAAA.AAA",00/00/0000 00:00:00AA,"0,000.00","0A00000A","AAAAAAAA" +"00,000",,"AAAAA.A.AAAA@AAAAA.AAA",00/00/0000 00:00:00AA,"0,000.00","0A00000A","AAAA" +"00,000",,"aaaa_aaaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","A000AA00","AAAA" +"00,000","000,000","aaaaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","000A0AA0","AAAAAAAA" +"00,000",,"aaaaaaa000@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","000A0AA0","AAAA" +"00,000",,"aaaaa00@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","000A0AA0","AAAA" +"00,000",,"aaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","000A0AA0","AAAA" +"00,000",,"aaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","000A0AA0","AAAA" +"00,000",,"aaaaaaa00@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","000A0AA0","AAAA" +"00,000",,"aaaaaaaaaaa@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","000A0AA0","AAAA" +"000,000",,"aa_aaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0000AA00","AAAA" +"00,000","000,000","aaa@aaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","A000AA00","AAAAAAAA" +"000,000",,"aaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0000AA00","AAAA" +"000,000",,"aaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0000AA00","AAAA" +"000,000","000,000","aaaaaaaa00@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0000AA00","AAAAAAAA" +"000,000",,"aaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","A0000000","AAAA" +"000,000","0,000","aaaaaaa@aaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0000000A","AAAAAAAA" +"000,000","00,000","AAaaaaaaaaa@aaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0A0A0AA0","AAAAAAAA" +"00,000",,"aaaaa.aaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","00000A00","AAAA" +"00,000",,"aaaaaa_aaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","A0000000","AAAA" +"00,000",,"aaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0000A00A","AAAA" +"00,000","00,000","aaaaa.aaaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","00000A00","AAAAAAAA" +"00,000",,"aaaaaaaaa0000@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","A0000000","AAAA" +"00,000","000,000","aaaaaaaaaaaaaaa0000@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","A0000000","AAAAAAAA" +"00,000","000,000","aaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","00000000","AAAAAAAA AAA AAAAAAA" +"000,000","000,000","aaaa0000@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AA000000","AAAAAAAA" +"000,000",,"aaaaaaaaaa_a@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","00000A0A","AAAA" +"000,000","000,000","Aaaaaa@aaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","A00A0AAA","AAAAAAAA" +"0,000","000,000","aaaaa.aaaaa0@aa.aaa",00/00/0000 00:00:00AA,"0,000.00","000A0AA0","AAAAAAAA" +"000,000",,"aaaaaaa_aaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","00000A0A","AAAA" +"000,000",,"aaaaaa_aaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","00000A0A","AAAA" +"000,000",,"aaaaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","00000A0A","AAAA" +"000,000",,"aaa000@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","00000A0A","AAAA" +"000,000",,"aaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","00000A0A","AAAA" +"000,000",,"aaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","00000A0A","AAAA" +"000,000",,"aaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","00000A0A","AAAA" +"000,000",,"aaaaaaaa_000@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","00000A0A","AAAA" +"000,000",,"a_aaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","00000A0A","AAAA" +"00,000","00,000","aaaaaa.aaaaa@aaaaaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AA000A00","AAAAAAAA" +"00,000",,"aaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AA000A00","AAAA" +"000,000","000,000","aaaaaaaaaa.aaaaaaa@aaaaaaaaa.aa",00/00/0000 00:00:00AA,"0,000.00","A0000000","AAAAAAAA" +"000,000","000,000","aaaaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","A0000000","AAAAAAAA" +"000,000","000,000","aaaaa.aaaaa0@aa.aaa",00/00/0000 00:00:00AA,"0,000.00","A0000000","AAAAAA AAAA AAAAA" +"000,000","00,000","aaaaaaaaaaaaa00@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","A0000000","AAAAAAAA AAA AAAAAAA" +"00,000",,"aaaaaaa@aaaaaaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","A00A0AA0","AAAA" +"00,000",,"aaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","A0000A00","AAAA" +"00,000","00,000","a.aaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","A000AA00","AAAAAAAA" +"00,000",,"Aaaaaaaa.aaaaaa@aaaaaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","A00AA0AA","AAAA" +"00,000",,"aaaaaa.aaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AA0A000A","AAAA" +"00,000",,"aaaaa.aaaaaaaaa@aaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","A00AA0AA","AAAA" +"00,000",,"aaaa.aaaaaaaaa@aaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","A00AA0AA","AAAA" +"00,000",,"aaaaa.aaaaaaaa@aaaaaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","A00AA0AA","AAAA" +"000,000",,"aaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","000AA000","AAAA" +"00,000",,"aaaaaaa.aaaaaaa@aaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AA000A0A","AAAA" +"00,000",,"aaaaaaaaa@aaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AA000000","AAAA" +"00,000",,"aaaaaa.aaaaaa@aaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AA000A0A","AAAA" +"00,000",,"aaaaa@aaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AA000000","AAAA" +"00,000","00,000","aaaaa0@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0000A000","AAAAAA AAAA AAAAA" +"00,000","00,000","aaaaaaa@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0000A000","AAAAAAAA" +"00,000","000,000","aaaaa.aaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","A0000A00","AAAAAAAA" +"00,000",,"aaaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","A000AA00","AAAA" +"00,000",,"aaaaa.a.aaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","A0000A00","AAAA" +"00,000",,"Aaa_Aaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0000A00A","AAAA" +"00,000",,"aaaaaaaaa0000@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0A00000A","AAAA" +"000,000","00,000","aaaaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","00000A0A","AAAAAAAA" +"000,000",,"aaaaa000@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AA000A00","AAAA" +"000,000","000,000","aaaaaaa.aaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","A0000000","AAAAAA AAAA AAAAA" +"00,000",,"aaaaaaaa@aaaaa-aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","A000AA00","AAAA" +"000,000",,"aaaaaaaaa@aaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AA00A000","AAAA" +"00,000",,"aaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0000AA0A","AAAA" +"000,000","00,000","aaaaaaa@aaaaaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","A0000000","AAAAAAAA" +"000,000",,"aaaaaaaa_aaaaaaa@aa.aaa",00/00/0000 00:00:00AA,"0,000.00","A0000000","AAAA" +"00,000",,"aaaaaaaaaaa@aaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0000000A","AAAA" +"00,000",,"aaaaaa@aaaaaaaa.aa.aaa",00/00/0000 00:00:00AA,"0,000.00","0000000A","AAAA" +"00,000","0,000","aaaaa@aaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0000000A","AAAAAAAA" +"00,000",,"aaaaaaaaaa000@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0000000A","AAAA" +"00,000",,"aaa@aaaaaaaaaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0000000A","AAAA" +"00,000","00,000","aaaaa@aaaaa.aa.aaa",00/00/0000 00:00:00AA,"0,000.00","0000000A","AAAAAAAA" +"00,000",,"aaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0000000A","AAAA" +"00,000",,"aaaaaa_aaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0000000A","AAAA" +"00,000",,"aaaaaaa@aaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0000000A","AAAA" +"00,000",,"aaaaaaaa0@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0000000A","AAAA" +"00,000","000,000","aaaaaaaaaa@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0000000A","AAAAAAAA" +"00,000",,"aaaaaaaa@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0000000A","AAAA" +"00,000",,"aaaaaaaaaa0000@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0000000A","AAAA" +"00,000",,"aaaaaaa@aaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0000000A","AAAA" +"00,000",,"aaaaaaaaa00@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0000000A","AAAA" +"00,000",,"aaaaaaaaa0000@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0000000A","AAAA" +"00,000",,"aaaaaaaaaa0000@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0000000A","AAAA" +"00,000",,"aaaaaaaa@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0000000A","AAAA" +"00,000",,"aaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0000000A","AAAA" +"00,000",,"aaaaaaa@aaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0000000A","AAAA" +"00,000",,"aaa@aaaaaaaaaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0000000A","AAAA" +"00,000",,"aaaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0000000A","AAAA" +"00,000",,"aaaaaa@aaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0000000A","AAAA" +"00,000",,"aaaaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0000000A","AAAA" +"00,000","000,000","aaa0000000@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0000000A","AAAAAAAA" +"00,000",,"aaaaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0000000A","AAAA" +"00,000",,"aaaaa@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0000000A","AAAA" +"00,000",,"aaaaaaaa00@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0000000A","AAAA" +"00,000",,"aaaaaaaaaaaa@aaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0000000A","AAAA" +"00,000",,"aaa000@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0000000A","AAAA" +"00,000",,"aaaaaaaaa0@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0000000A","AAAA" +"00,000",,"aaaa0000@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0000000A","AAAA" +"00,000",,"aaaaaaaaa_aaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0000000A","AAAA" +"00,000",,"aaaaaaaaaaaa@aaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0000000A","AAAA" +"00,000","00,000","aaaaaaaa0@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0000000A","AAAAAAAA" +"00,000",,"aaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0000000A","AAAA" +"00,000",,"aaaaaaaaaaaaaaaa_0aaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0000000A","AAAA" +"00,000",,"aaaaaaaaa@aaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0000000A","AAAA" +"00,000",,"aaaa@aaaaaaaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0000000A","AAAA" +"000,000","000,000","aaaaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","000A0A00","AAAAAA AAAA AAAAA" +"000,000","00,000","AAaaaaaaaa@AaaaAaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","A0000000","AAAAAAAA" +"000,000","00,000","aaaaaaa0@aaaaaaaa.aa.aaa",00/00/0000 00:00:00AA,"0,000.00","A0000000","AAAAAAAA" +"000,000","00,000","aaa@aaaaaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","A0000000","AAAAAA AAAA AAAAA" +"000,000",,"aaa0@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","A0000000","AAAA" +"000,000",,"aaaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","A0000000","AAAA" +"000,000","00,000","aaaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","A0000000","AAAAAAAA" +"000,000",,"aaaaaa@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","A0000000","AAAA" +"000,000",,"aaaaaaaaa0@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","A0000000","AAAA" +"000,000","00,000","AAA0000@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","A0000000","AAAAAAAA AAA AAAAAAA" +"000,000","000,000","Aaa0000@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AA000A00","AAAAAAAA AAA AAAAAAA" +"000,000","0,000","aaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","A0000000","AAAAAAAA" +"000,000","00,000","aaaaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","A0000000","AAAAAAAA" +"00,000",,"aaaaaaaa@aaaaaaaaaaaaaaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","A00A00A0","AAAA" +"00,000",,"aaaaaaa_a_aaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","A00A00A0","AAAA" +"00,000","00,000","aaaa_aaaaa00@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0000A00A","AAAAAAAA" +"000,000",,"Aaaaaa.Aaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0A000000","AAAA" +"00,000",,"aaaaaaaaaa@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0000A000","AAAA" +"00,000","000,000","aaaaaa0000@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0000A00A","AAAAAAAA" +"00,000",,"Aaaaaaaaaa.Aaaaaaa@aaaaaa.aaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A000AA00","AAAA" +"00,000",,"aaaaaaaaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","00000000","AAAA" +"00,000",,"aaaaaaaaaaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","00000000","AAAA" +"00,000",,"aaaaaaaaa0000@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","00000000","AAAA" +"00,000",,"aaaaa.aaaaa@aaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","00000000","AAAA" +"00,000",,"aaaaaa.aaaaa@aaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","00000000","AAAA" +"00,000",,"aaaaaaaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","00000000","AAAA" +"00,000",,"aa00aaaaa0@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","00000000","AAAA" +"00,000",,"aaaaaa_aaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","00000000","AAAA" +"00,000",,"aaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","00000000","AAAA" +"00,000",,"aaaaa_aaaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","00000000","AAAA" +"00,000",,"aaa000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","00000000","AAAA" +"00,000",,"aaaaaa.aaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","00000000","AAAA" +"00,000",,"aaaaaaaaaaa0000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","00000000","AAAA" +"00,000",,"aaaaaaaaa0@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","00000000","AAAA" +"00,000",,"aaaaaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","00000000","AAAA" +"00,000",,"aaaaaaaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","00000000","AAAA" +"00,000",,"aaaaaaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","00000000","AAAA" +"00,000",,"aaaaaaaaaaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","00000000","AAAA" +"000,000",,"aaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","00000A0A","AAAA" +"000,000",,"aaaaaaaaa00@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","00000A0A","AAAA" +"000,000",,"a0a0@aaaaa.aa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A00AA0A","AAAA" +"000,000",,"aaaa_a_a@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A00AA0A","AAAA" +"000,000",,"aaaaa_aaaaaaaa@aaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A00AA0A","AAAA" +"000,000",,"aaaaaaaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A00AA0A","AAAA" +"000,000",,"aaaaaaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A00AA0A","AAAA" +"000,000",,"aaaaaa0@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A00AA0A","AAAA" +"000,000",,"aaaaaaaaaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A00AA0A","AAAA" +"000,000",,"aaaaaaaa.a.aaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AA0A0AA0","AAAA" +"00,000",,"aaa0aaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AA00A000","AAAA" +"000,000",,"aaaaaaaa.aaaa00@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","00000A0A","AAAA" +"000,000","0,000","aaaaaaa00@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","000A00AA","AAAAAAAA" +"000,000",,"AAAAAA.AAAAAA@AAAAAAAA.AAA",00/00/0000 0:00:00AA,"0,000.00","A000A00A","AAAA" +"00,000","00,000","aaaaaaa00@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A000A000","AAAAAAAA" +"00,000",,"AAAaaaaaaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AA00A000","AAAA" +"00,000","000,000","aaaa000@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A0000A00","AAAAAAAA" +"00,000",,"aaaaaa_aaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A000AA00","AAAA" +"000,000",,"aaaaaa0@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A0A0AA0","AAAA" +"000,000",,"aaaaaaa@aaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0000000A","AAAA" +"000,000",,"Aaaaaaa@AaaaaAaaaAaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A0000A00","AAAA" +"000,000",,"aaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A0000000","AAAA" +"000,000",,"aaaaaaaaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A0000000","AAAA" +"000,000",,"aaaaaaaa0000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A0000000","AAAA" +"000,000",,"aaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A0000000","AAAA" +"0,000",,"aaaaaaaa.aaaa@aaaaaa.aaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A00A00A0","AAAA" +"0,000","00,000","aaaaaaa.aaaaaa@aaaaaa.aaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A00A00A0","AAAAAAAA AAA AAAAAAA" +"00,000","000,000","aaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0000000A","AAAAAAAA" +"0,000","00,000","aaaaaaaaa.aaaaaaa@aaaaaa.aaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A00A00A0","AAAAAA AAAA AAAAA" +"0,000","00,000","aaaaaa.aaaaaaaa@aaaaaa.aaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A00A00A0","AAAAAAAA" +"000,000","000,000","aaaaaaaaa.aaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A0000000","AAAAAAAA" +000,,"aaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AA00A000","AAAA" +"0,000","000,000","aaaaaaa.aaaaa@aaaaaa.aaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A00A00A0","AAAAAAAA AAA AAAAAAA" +"000,000","00,000","aaaa_00@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A0000000","AAAAAAAA" +"000,000","000,000","aaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A0000000","AAAAAAAA" +"000,000","00,000","aaaaaaaaaaa@aaaaa.aaa.aa",00/00/0000 0:00:00AA,"0,000.00","A0000000","AAAAAAAA" +"000,000","000,000","aaa00000@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A0000000","AAAAAAAA" +"000,000","000,000","aaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A0AAA00","AAAAAAAA" +"000,000","00,000","aaaaa.aaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A0000000","AAAAAAAA" +"00,000","000,000","aaaaa.aaaaaaa@a-aaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A00A000","AAAAAAAA" +"000,000","000,000","aaa0aaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A0000000","AAAAAAAA AAA AAAAAAA" +"000,000",,"AAaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AA000A00","AAAA" +"00,000",,"aaaaaaaaaaaaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AA000A00","AAAA" +"00,000","00,000","aaaa00000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0000000A","AAAAAA AAAA AAAAA" +"000,000","00,000","aaaaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A0AA00A","AAAAAAAA" +"00,000",,"aaaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","00000A00","AAAA" +"00,000",,"aaaaaaa.aaaaaa@aaaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","000A0AA0","AAAA" +"00,000",,"aaaaa.aaaaa@aaaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","000A0AA0","AAAA" +"00,000",,"aaaaaaaa.aaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","000A0AA0","AAAA" +"00,000","00,000","aaaaaaaa.aaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","000A0AA0","AAAAAAAA" +"00,000",,"aaaaaaaaa000@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","000A0AA0","AAAA" +"00,000",,"aaaaaaa0000@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","000A0AA0","AAAA" +"00,000",,"aaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","000A0AA0","AAAA" +"00,000",,"aaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","000A0AA0","AAAA" +"00,000",,"aaaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","000A0AA0","AAAA" +"00,000","00,000","aaaaaaaa000@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","000A0AA0","AAAAAAAA" +"00,000",,"aaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","000A0AA0","AAAA" +"00,000",,"aaaaaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","000A0AA0","AAAA" +"00,000",,"aaaaaaaaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A0000A00","AAAA" +"00,000",,"aaa000@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A0000A00","AAAA" +"000,000","000,000","aaaaaa@aaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A0000000","AAAAAAAA" +"000,000",,"aaaaaaa0000@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A00AA0A","AAAA" +"000,000",,"aaa00000@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A00AA0A","AAAA" +"000,000",,"aaaaa00a@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A00A00A","AAAA" +"00,000",,"aaaa_aaaaaaaaaa@aaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AA00A00A","AAAA" +"000,000","000,000","aaaaaaa00@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A0000000","AAAAAA AAAA AAAAA" +"000,000",,"aaaaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A00A000","AAAA" +"000,000",,"aaaaaaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0000000A","AAAA" +"00,000","00,000","aaaaa.a.aaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A0000A00","AAAAAAAA" +"000,000",,"aaaaaaa@aaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0000000A","AAAA" +"000,000","000,000","aaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","00000A0A","AAAAAAAA" +"000,000","0,000","aaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A0000000","AAAAAAAA" +"000,000","00,000","aaaaaaaaaa0000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A0000000","AAAAAAAA" +"000,000",,"aaaaaa.aaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A0000000","AAAA" +"000,000","000,000","aaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A0000000","AAAAAAAA" +"000,000","00,000","aaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A0000000","AAAAAAAA AAA AAAAAAA" +"000,000","00,000","aaaaaaaaaaaaaa@aaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A0000000","AAAAAA AAAA AAAAA" +"000,000","000,000","Aaaaaaaa0000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A0000000","AAAAAAAA" +"000,000",,"aaaaaaaa000@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A0000000","AAAA" +"000,000",,"aaaaaaaa00@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A0000000","AAAA" +"00,000","000,000","aaaa_aaaa@aaaaaaaaa.aa",00/00/0000 0:00:00AA,"0,000.00","0A000A00","AAAAAAAA" +"00,000",,"aaaaa.aaaaa@aaa.aa",00/00/0000 0:00:00AA,"0,000.00","0A000A00","AAAA" +"00,000",,"AAaaaaaa@aaaaaaaaaa.aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A000A00","AAAA" +"00,000",,"aaaaaaa@aaaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A000A00","AAAA" +"00,000",,"aaaaa00000@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A000A00","AAAA" +"00,000",,"aaaaaa@aaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A000A00","AAAA" +"00,000",,"aaaa.aaaaaaaa@aaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A000A00","AAAA" +"00,000",,"aaaa_aa_aaaaaaaa@aa.aaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A000A00","AAAA" +"00,000",,"aaaaa@aaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A000A00","AAAA" +"00,000",,"aaaaaaaa.aaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A000A00","AAAA" +"00,000",,"aaaaaaaaa@aa.aaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A000A00","AAAA" +"00,000",,"aaaaaa@aaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A000A00","AAAA" +"00,000",,"aaaa@aaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A000A00","AAAA" +"00,000","00,000","aaaaaaa@aaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A000A00","AAAAAAAA" +"00,000",,"aaaaa@aaaaaaaaaaaaa.aa",00/00/0000 0:00:00AA,"0,000.00","0A000A00","AAAA" +"00,000",,"aaaaaaa@aaaaaaaaaaa.aa.aa",00/00/0000 0:00:00AA,"0,000.00","0A000A00","AAAA" +"00,000","00,000","aaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A000A00","AAAAAAAA" +"00,000","000,000","aaaaaaaaaaaaaa@aaaaaaaaa.aa",00/00/0000 0:00:00AA,"0,000.00","0A000A00","AAAAAAAA" +"00,000",,"aaaaaa.aaaaaaaaa@aaaaaaaaaaaaaaaa.aa",00/00/0000 0:00:00AA,"0,000.00","0A000A00","AAAA" +"00,000","00,000","aaaaaaaaaaaaa@aaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A000A00","AAAAAAAA" +"00,000","000,000","aaaaa-aaaaaaaaaaaaaa@aaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A000A00","AAAAAAAA" +"00,000",,"aaaaaaaa_aa@aaaaa.aa",00/00/0000 0:00:00AA,"0,000.00","0A000A00","AAAA" +"00,000",,"aaaaaaaa@aaaaaaaaa.aa",00/00/0000 0:00:00AA,"0,000.00","0A000A00","AAAA" +"00,000",,"aaaaaaaaa@aaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A000A00","AAAA" +"00,000","000,000","aaaaaa_aaaa@aaaa.aa",00/00/0000 0:00:00AA,"0,000.00","0A000A00","AAAAAAAA" +"00,000",,"aaaa.aaaaaaa@aaaaaaaaa.aa",00/00/0000 0:00:00AA,"0,000.00","0A000A00","AAAA" +"00,000",,"aaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A000A00","AAAA" +"00,000",,"aaaaaaa@aaaaaaaaa-aaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A000A00","AAAA" +"00,000","00,000","AAaaaaaa@aaaaaaaaa.aa",00/00/0000 0:00:00AA,"0,000.00","0A000A00","AAAAAAAA" +"00,000","000,000","aaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A000A00","AAAAAAAA" +"00,000",,"aaaaaa.aaaaaaaaaa@aaaa.aaaaaa.aa",00/00/0000 0:00:00AA,"0,000.00","0A000A00","AAAA" +"00,000",,"aaaaa@aaaaaaaaa.aa",00/00/0000 0:00:00AA,"0,000.00","0A000A00","AAAA" +"00,000",,"aaaaaaa@aaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A000A00","AAAA" +"00,000",,"aaa@aaaaaaaa.aa",00/00/0000 0:00:00AA,"0,000.00","0A000A00","AAAA" +"00,000",,"aaaaaaaaaa@aaaaaa.aa",00/00/0000 0:00:00AA,"0,000.00","0A000A00","AAAA" +"00,000",,"aaaaaa@aaaaaaaaaaaaaaaaaaa.aa",00/00/0000 0:00:00AA,"0,000.00","0A000A00","AAAA" +"00,000",,"aaaaaa@aaaaaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A000A00","AAAA" +"00,000",,"aaaaaaa.aaaaaaa@aaaaaaaaa.aa",00/00/0000 0:00:00AA,"0,000.00","0A000A00","AAAA" +"00,000",,"aaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A000A00","AAAA" +"00,000",,"aaaaaaaaaaaa00@aaaaaaaaa.aa",00/00/0000 0:00:00AA,"0,000.00","0A000A00","AAAA" +"00,000",,"aaaaaa@aaaaa-aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A000A00","AAAA" +"00,000",,"aaaaaa@aaaaa.aa.aa",00/00/0000 0:00:00AA,"0,000.00","0A000A00","AAAA" +"00,000",,"aaaaaa@aaaaa.aa.aa",00/00/0000 0:00:00AA,"0,000.00","0A000A00","AAAA" +"00,000",,"aaaaaa@aaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A000A00","AAAA" +"00,000",,"aaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A000A00","AAAA" +"000,000","000,000","aaaaaa.aaaaaaa@aa.aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A0000000","AAAAAAAA" +"000,000",,"aaaaaaaaaaa00000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A0000000","AAAA" +"000,000",,"aaaaaaa_aaaa_0@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A0000000","AAAA" +"000,000","00,000","aaaaaa0a_00@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A0000000","AAAAAAAA" +"000,000","00,000","aaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A0000000","AAAAAAAA AAA AAAAAAA" +"000,000","000,000","aaaaaaaa@aaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A0000000","AAAAAAAA" +"000,000","000,000","aaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A0000000","AAAAAAAA" +"000,000","000,000","aaaaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A0000000","AAAAAAAA" +"000,000","000,000","AaaaaaAaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A0000000","AAAAAA AAAA AAAAA" +"000,000","000,000","aaaaaaa_aaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","A0000000","AAAAAAAA" +"000,000","000,000","aaaaa-aaa@aaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","A0000000","AAAAAA AAAA AAAAA" +"00,000",,"aaaaaaaaa.aaaaaa@aaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","A000A000","AAAA" +"00,000",,"aaaaaaaaaaa0000@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","00000000","AAAA" +"00,000",,"aaaa.aaaaaa000@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","A000A00A","AAAA" +"000,000",,"aaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","00000000","AAAA" +"000,000",,"Aaaaaaa@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","00000000","AAAA" +"000,000",,"Aaaaaaa.Aaaaaaa@aaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","00000000","AAAA" +"000,000","000,000","Aaaa.Aaaaaaaaa@aaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","00000000","AAAAAAAA AAA AAAAAAA" +"0,000",,"aaaaaaaaaaaa00@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A0000000","AAAA" +"0,000",,"aaaaaaaaaa00@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A0000000","AAAA" +"000,000",,"aaaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A000A000","AAAA" +"000,000","00,000","aaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A000A000","AAAAAAAA" +"000,000",,"aaaaaaaaaaaaaaa00@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A000A000","AAAA" +"000,000",,"aaaaaaa@aaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A000A000","AAAA" +"000,000","00,000","aaaaaaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A000A000","AAAAAAAA" +"000,000",,"aaa.aaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A000A000","AAAA" +"000,000",,"aaaaaaaaaa.aaaaaaaa@aaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A00000A","AAAA" +"000,000",,"aaaa.aaaaa@aaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A00000A","AAAA" +"00,000",,"aaaaaaa@aaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A000AA00","AAAA" +"000,000",,"aaaaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A0000000","AAAA" +"000,000","000,000","aaaaaa.aaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A0000000","AAAAAAAA" +"000,000","0,000","aaaaaaa00@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A0000000","AAAAAAAA AAA AAAAAAA" +"000,000","00,000","aaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A0000000","AAAAAAAA AAA AAAAAAA" +"00,000",,"aaa.aa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","000A00A0","AAAA" +"00,000",,"aaaaaaa000@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","000A00A0","AAAA" +"00,000",,"aaaaa0000@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","000A00A0","AAAA" +"00,000",,"aaaaaaaa0@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","000A00A0","AAAA" +"00,000",,"a.aaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","000A00A0","AAAA" +"00,000","000,000","aaaaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","000A00A0","AAAAAAAA" +"00,000",,"aaaaaa00@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","000A00A0","AAAA" +"00,000",,"aaaaaaaaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","000A00A0","AAAA" +"00,000",,"aaaaaaaaaaaa@aaaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","000A00A0","AAAA" +"00,000",,"aaaaaaa000@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","000A00A0","AAAA" +"00,000",,"aaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","000A00A0","AAAA" +"00,000",,"aaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","000A00A0","AAAA" +"00,000",,"aaaa0aaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","000A00A0","AAAA" +"00,000",,"aaaaaaa.aaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","000A00A0","AAAA" +"00,000",,"aaaaaaaaaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","000A00A0","AAAA" +"00,000",,"aaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","000A00A0","AAAA" +"00,000",,"aaaaa00@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","000A00A0","AAAA" +"00,000",,"aaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","000A00A0","AAAA" +"00,000",,"aaaaaaaaaa0000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","000A00A0","AAAA" +"00,000","00,000","aaaaaa.aaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","000A00A0","AAAAAAAA" +"00,000","00,000","aaa.aaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","000A00A0","AAAAAAAA" +"00,000",,"aaaaaa.a.aaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","000A00A0","AAAA" +"00,000","00,000","aaaa00@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","000A00A0","AAAAAAAA" +"00,000",,"aaaaaa.aaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","000A00A0","AAAA" +"00,000",,"aaaaaaaa0000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","000A00A0","AAAA" +"00,000",,"aaaaa@aaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","000A00A0","AAAA" +"000,000",,"aaa.a.aaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A0A0A00","AAAA" +"000,000",,"aaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A0A0A00","AAAA" +"000,000","000,000","aaaaaaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AA000A0A","AAAAAAAA" +"000,000",,"aaaaaaaaa@aaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","A0000A0A","AAAA" +"00,000",,"aaaaaa.aaaaa@aa.aaa",00/00/0000 00:00:00AA,"0,000.00","00000000","AAAA" +"00,000","000,000","Aaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","00000A00","AAAAAAAA" +"000,000",,"aaaaaa.aaaaa@aaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","A0000000","AAAA" +"00,000",,"aaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","A0000000","AAAA" +"00,000","000,000","aaaaaa0000@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","A0000000","AAAAAAAA" +"00,000",,"aaaaaaaaa.a.aaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","A0000000","AAAA" +"00,000",,"AAAAAAAA000@AAA.AAA",00/00/0000 00:00:00AA,"0,000.00","0A00A00A","AAAA" +"00,000",,"aaaa000@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0000000A","AAAA" +"000,000","000,000","Aaaa.aaaaaa@aaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","A00A00A0","AAAAAA AAAA AAAAA" +"000,000","000,000","aaaaaaa.a.aaaa@aaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0000000A","AAAAAAAA" +"000,000",,"aaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","000A00A0","AAAA" +"00,000","00,000","aaaaaaa@aaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A000AA00","AAAAAAAA" +"00,000",,"aaaaaa.aaaaaaaaa@aaaaaaaaa.aa",00/00/0000 0:00:00AA,"0,000.00","AA00000A","AAAA" +"00,000",,"aaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AA00000A","AAAA" +"00,000",,"aaaaaaaaaaaa0@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AA00000A","AAAA" +"000,000",,"aaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A0000A00","AAAA" +"000,000",,"aaaaaa@aaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AA0A0000","AAAA" +"00,000",,"aaaaaa@aaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A000AA00","AAAA" +"00,000","000,000","aaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A000AA00","AAAAAAAA" +"000,000","00,000","aaaaaaa@aaaaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A0000000","AAAAAAAA" +"000,000","00,000","aaaaaa0@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AA0A0000","AAAAAAAA" +"000,000","00,000","aaaa000@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AA0A0000","AAAAAAAA" +"000,000",,"aaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A000000","AAAA" +"000,000",,"aaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A000000","AAAA" +"000,000",,"aaaaaa@aaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A000000","AAAA" +"000,000",,"aaaaa000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A000000","AAAA" +"000,000","00,000","aaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A000000","AAAAAAAA" +"000,000",,"aaaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A000000","AAAA" +"000,000",,"aaaa.aaaaaaaa@aaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A000000","AAAA" +"000,000",,"aaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A000000","AAAA" +"000,000",,"aaaaaaaaa0@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A000000","AAAA" +"000,000",,"aaa_aaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A000000","AAAA" +"000,000",,"aaaaaaaaa@000.aaa",00/00/0000 0:00:00AA,"0,000.00","0A000000","AAAA" +"000,000","000,000","aaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A000000","AAAAAAAA" +"000,000",,"aaaa00@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A000000","AAAA" +"00,000","00,000","aaaaaaa000@aaaaaaaaa.aa",00/00/0000 0:00:00AA,"0,000.00","0000AA0A","AAAAAAAA" +"000,000",,"aaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A0A000A","AAAA" +"000,000","000,000","aaaaaaaa@aaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A0000A0A","AAAAAAAA" +"00,000",,"aaaaaaa000@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A00A000","AAAA" +"00,000","00,000","aaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A000AA00","AAAAAAAA" +"00,000","000,000","aaaaaaaa@aaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A000000A","AAAAAAAA" +"00,000","00,000","AaaaaaaaaAA00@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0000AA00","AAAAAAAA" +"00,000",,"aaaaaaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A000000A","AAAA" +"000,000","00,000","aaaaaaa000@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AA000A00","AAAAAAAA" +"00,000",,"aaaaaaaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","A00A00A0","AAAA" +"00,000",,"aaaaaaa_aaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A000AA00","AAAA" +"00,000",,"aaaa.aaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A000AA00","AAAA" +"00,000",,"aaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A000AA00","AAAA" +"00,000",,"aaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A000AA00","AAAA" +"00,000","00,000","aaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A000AA00","AAAAAAAA" +"00,000","00,000","aaaaaa@aaaaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A000AA00","AAAAAA AAAA AAAAA" +"00,000",,"aaaaa_aaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A000AA00","AAAA" +"00,000","000,000","aaaaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A000AA00","AAAAAAAA" +"00,000","00,000","aaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A000AA00","AAAAAA AAAA AAAAA" +"00,000","00,000","aaaaaa_aaaaaa@aaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0000AA0A","AAAAAAAA" +"00,000",,"aaaa@aaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A000AA00","AAAA" +"000,000",,"aaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A000A00","AAAA" +"000,000",,"AAAaaaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A000A00","AAAA" +"00,000",,"aaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0000000A","AAAA" +"00,000",,"aaaaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0000000A","AAAA" +"00,000",,"aaaaaaaaa_a@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0000000A","AAAA" +"000,000",,"aaaaaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","000A00AA","AAAA" +"00,000","00,000","aaaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A000000","AAAAAAAA" +"000,000",,"aaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AA00A000","AAAA" +"000,000",,"Aaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","00000A00","AAAA" +"000,000",,"aaaaa00@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0000AA0A","AAAA" +"000,000","00,000","aaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0000AA0A","AAAAAA AAAA AAAAA" +"000,000",,"aaaaaaaaaa00@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0A00000A","AAAA" +"00,000",,"aaaaaaaa.a@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","000A000A","AAAA" +"000,000",,"aaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","00000A00","AAAA" +"000,000",,"AAAAAAAA@AAA.AAA",00/00/0000 0:00:00AA,"0,000.00","0A000000","AAAA" +"000,000",,"aaaaa@aaaaaaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A000A00","AAAA" +"000,000",,"aaaaaaaaaaaaaa00@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AA00A00A","AAAA" +"00,000",,"aaaaaaaaa0@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A000A000","AAAA" +"000,000",,"aaaaaaa_aaaaa@aaaaaaa-aaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","00000A00","AAAA" +"000,000",,"aaaaaaaaa00@aaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0000A00A","AAAA" +"000,000",,"aaaaaaaa@aaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0000A00A","AAAA" +"0,000","000,000","aaaaa0000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0000A000","AAAAAAAA" +"0,000",,"aaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AA00AA00","AAAA" +"00,000",,"aaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","000A0AA0","AAAA" +"00,000",,"aaa_aaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0000000A","AAAA" +"000,000",,"aaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","A0000000","AAAA" +"00,000","00,000","aaaaa000@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A00A00A","AAAAAAAA" +"00,000",,"aaaaaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A00A00A","AAAA" +"000,000",,"aaaaaaaaa000000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","00000000","AAAA" +"00,000","00,000","aaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A0000000","AAAAAAAA" +"000,000","000,000","aaaaaaaa@aaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A000A00","AAAAAAAA" +"000,000",,"aaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A000A00","AAAA" +"000,000",,"aaaaa_a@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A000A00","AAAA" +"00,000",,"aaaa_aaa00@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A0000A00","AAAA" +"000,000",,"aaaaaaaaa00@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","00000000","AAAA" +"00,000","000,000","aaaaaaaaaaaaaaa_000@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A000AA00","AAAAAAAA AAA AAAAAAA" +"000,000","00,000","aaaa@aaaaaaaaaa.aa",00/00/0000 0:00:00AA,"0,000.00","0A0A0A00","AAAAAAAA" +"00,000",,"aaaaaaaaa00@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A0A0000","AAAA" +"000,000","00,000","aaaaaa@aaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","A0000000","AAAAAAAA" +"00,000",,"aaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AA0A0A00","AAAA" +"00,000",,"aaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AA0A0A00","AAAA" +"00,000","00,000","Aaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AA0A0A00","AAAAAAAA AAA AAAAAAA" +"00,000",,"aaaa00@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AA0A0A00","AAAA" +"00,000","00,000","aaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AA0A0A00","AAAAAAAA" +"00,000",,"aaaaaa@aaaaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AA0A0A00","AAAA" +"00,000",,"aaaaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AA0A0A00","AAAA" +"00,000",,"aaaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AA0A0A00","AAAA" +"00,000","000,000","aaaaaaa000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AA0A0A00","AAAAAAAA" +"00,000",,"aaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AA0A0A00","AAAA" +"000,000","000,000","aaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","A0000000","AAAAAAAA" +"000,000",,"aaaaa.aaaaa@aaaaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0A0A00AA","AAAA" +"00,000","00,000","aaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","00000A00","AAAAAAAA AAA AAAAAAA" +"00,000","000,000","aaaaaaa.aaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","00000A00","AAAAAAAA" +"00,000",,"aaaaaaaaaaa@aaaaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","A0000A00","AAAA" +"00,000",,"aaaaa@aaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","A0000A00","AAAA" +"00,000",,"aaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","A0000A00","AAAA" +"00,000",,"aaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","A0000A00","AAAA" +"00,000",,"aaaa@aaaaaa.aaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","A0000A00","AAAA" +"0,000","00,000","aaaaaaaaaaa@aaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","00000000","AAAAAAAA" +"00,000",,"aaaa@aaaaaaaaaaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","A0000A00","AAAA" +"00,000","00,000","Aaaaaaaaa.Aaaaaaa@aaaaaa.aaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","A000AA00","AAAAAAAA" +"000,000","000,000","aaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AA000000","AAAAAAAA" +"0,000",,"aaaa.aaaaaa00@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","00000000","AAAA" +"0,000",,"a0aaaaaaaaaa00a0@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AA000000","AAAA" +"00,000",,"aaaaaaa.aaaaaaa@aaaaaa.aaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","A000AA00","AAAA" +"000,000","000,000","aaaaaaaaa@aaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","A000A000","AAAAAA AAAA AAAAA" +"00,000","00,000","aaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","A000AA00","AAAAAAAA" +"000,000",,"aaaaaaa.aaaaaaa@aaaaaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","00000A0A","AAAA" +"000,000",,"aaaaaaaaaaaa@aaa.aaa.aa",00/00/0000 0:00:00AA,"0,000.00","00000A0A","AAAA" +"000,000","00,000","aaaaaaa@aa.aa.aaa",00/00/0000 0:00:00AA,"0,000.00","A0000A00","AAAAAAAA" +"00,000",,"aaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A00A000","AAAA" +"00,000",,"aaaaa000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A00A000","AAAA" +"00,000",,"aaaaaaa_aaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A000A00A","AAAA" +"00,000",,"aaaaaaa@aaaaaaaa.aa",00/00/0000 0:00:00AA,"0,000.00","0000AA0A","AAAA" +"00,000",,"aaaaaaa-00@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A000000","AAAA" +"00,000",,"aaaaaaaaaa_0@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A000000","AAAA" +"000,000",,"Aaaaa_aaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A000000","AAAA" +"00,000","00,000","a@aaaaaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A000AA00","AAAAAAAA" +"000,000","000,000","aaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","00000A00","AAAAAA AAAA AAAAA" +"00,000",,"aaaaa@aaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A000A00","AAAA" +"00,000",,"aaaaaa.aaaaaaaaaa@aaaa.aaaaaa.aa",00/00/0000 0:00:00AA,"0,000.00","0A000A00","AAAA" +"00,000",,"aaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A000AA00","AAAA" +"00,000","000,000","aaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A000AA00","AAAAAAAA" +"00,000","000,000","aaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","00000000","AAAAAAAA AAA AAAAAAA" +"00,000",,"aaaaaa0aa000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A000AA0A","AAAA" +"000,000",,"aaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A00A000","AAAA" +"00,000",,"aaaaa@aaaaaaaaa.aa",00/00/0000 0:00:00AA,"0,000.00","A0000000","AAAA" +"00,000","00,000","aaaaaaa@aaaaaaaaa.aa",00/00/0000 0:00:00AA,"0,000.00","A0000000","AAAAAAAA" +"00,000",,"aaaa@aaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A000AA00","AAAA" +"00,000",,"aaaa@aaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A000AA00","AAAA" +"00,000",,"aaaaaaaa@aaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A000AA00","AAAA" +"000,000",,"aaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A0000000","AAAA" +"00,000",,"aaaaaaa@aaaaaaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","A000AA00","AAAA" +"00,000","00,000","aaaaaaaaa@aaaaaaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","A000AA00","AAAAAA AAAA AAAAA" +"00,000","00,000","aaaa@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AA000000","AAAAAAAA" +"000,000","00,000","aaaa.aaaaa@aaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","A00A000A","AAAAAAAA" +"000,000",,"aaaaa.aaaaaaaa@aaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","A00A000A","AAAA" +"000,000",,"aaaaaa.aaaa@aaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","A00A000A","AAAA" +"00,000",,"aaaaaaaaa@aaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","A000AA00","AAAA" +"00,000",,"aaaaaa@aaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","A000AA00","AAAA" +"00,000",,"aaaaaaaaa@aaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","A000AA00","AAAA" +"00,000",,"aaaaaaaa@aaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A000AA00","AAAA" +"00,000",,"Aaaaaaaa.aaaaaa@aaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A000AA00","AAAA" +"00,000",,"Aaaa.Aaaaaaaaaa@aaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A000AA00","AAAA" +"00,000",,"Aaaaaaaaaaa.Aaaaaa@aaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A000AA00","AAAA" +"00,000","000,000","Aaaaa.Aaaaa@aaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A000AA00","AAAAAAAA" +"00,000",,"aaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AA00AA00","AAAA" +"00,000",,"aaaaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AA00AA00","AAAA" +"00,000",,"aaaaa_00@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AA00AA00","AAAA" +"00,000",,"aaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AA00AA00","AAAA" +"00,000","00,000","aaaaa@aaaaaaaa-aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A000AA00","AAAAAAAA" +"000,000",,"aaaaaaaaa.aaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A000A00","AAAA" +"000,000",,"aaaaaaa.a.aaaaaaaa@aaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0000000A","AAAA" +"00,000",,"aaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A000AA00","AAAA" +"00,000","000,000","aaaa@aaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A000AA00","AAAAAAAA" +"00,000",,"aaaaaaaaa@aaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A000AA00","AAAA" +"000,000","00,000","aaaaa_aaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AA0A0AA0","AAAAAAAA" +"000,000",,"aaaaaaa_000@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","00000000","AAAA" +"000,000",,"Aaaa0@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0000000A","AAAA" +"000,000","000,000","aaaaaaa_aaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A00000A","AAAAAA AAAA AAAAA" +"00,000","00,000","aaaaaa_00@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A0000000","AAAAAAAA" +"00,000",,"aaaaaaaa000@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A0000000","AAAA" +"00,000",,"aaaa.aaaaaaaa@aaaa.aa",00/00/0000 0:00:00AA,"0,000.00","A0000000","AAAA" +"000,000","000,000","aaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A0A0A00","AAAAAA AAAA AAAAA" +"00,000",,"aaaaaa@aaaaaaaaa.aa",00/00/0000 0:00:00AA,"0,000.00","A0000000","AAAA" +"00,000","00,000","aaa0@aaaaaaaaa.aa",00/00/0000 0:00:00AA,"0,000.00","A0000000","AAAAAAAA" +"000,000","000,000","aaaa.aaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0000A000","AAAAAAAA" +"00,000",,"aaaaaaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0A000000","AAAA" +"00,000",,"aaaaaa.aaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0000A00A","AAAA" +"000,000","00,000","aaaaaaaaaa@aaa0000.aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","A0000000","AAAAAAAA AAA AAAAAAA" +"000,000",,"aaaaaaa.a.aaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","A0000000","AAAA" +"000,000","000,000","aaaaaaaa@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","A0000000","AAAAAAAA" +"00,000",,"aaaaaa@aaaaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","A000AA00","AAAA" +"00,000","000,000","aaaaaaa.aaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","A000AA00","AAAAAAAA" +"00,000",,"aaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","A000AA00","AAAA" +"00,000",,"aaaaa@aaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","A000AA00","AAAA" +"00,000",,"aaaaaa.aaaaaaaa@aaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0A000000","AAAA" +"00,000",,"aaaaa.aaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AA000000","AAAA" +"000,000","00,000","aaaaa.a.aaaa@aaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0A0AA0A0","AAAAAAAA" +"00,000","00,000","aaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","A00A0AA0","AAAAAAAA" +"00,000",,"aaaa@aaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A000AA00","AAAA" +"00,000","00,000","aaaaaaaa@aaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A000AA00","AAAAAAAA" +"00,000",,"aaaaaa@aaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A000AA00","AAAA" +"00,000",,"aaa_aaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A000AA00","AAAA" +"00,000","000,000","aaaaaa00@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A000AA00","AAAAAA AAAA AAAAA" +"00,000",,"aaaaaa_aaaaaaa@aaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A000AA00","AAAA" +"00,000",,"aaaaaaa_aaaaaaaa-aaaaaaaa@aaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A000AA00","AAAA" +"00,000","00,000","Aaaaaaaaa_Aaaaaaa@aaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A000AA00","AAAAAAAA" +"00,000",,"aaaaaa_aaaaaa@aaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A000AA00","AAAA" +"00,000","0,000","aaaaaa_aaaaaaaa@aaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A0A00AA","AAAAAAAA" +"00,000","00,000","aaaaaaaa@aaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A000AA00","AAAAAAAA" +"00,000",,"aaaa_aaaaa@aaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A000AA00","AAAA" +"00,000",,"aaaaa_aaaaaaa@aaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A000AA00","AAAA" +"00,000",,"aaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A0000000","AAAA" +"00,000",,"aaaaaaaaaaaaa@aaaaaaaaa.aa",00/00/0000 0:00:00AA,"0,000.00","A0000000","AAAA" +"00,000",,"aaaaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A0000000","AAAA" +"00,000",,"aaaa@aaaaaaaaa.aa",00/00/0000 0:00:00AA,"0,000.00","A0000000","AAAA" +"00,000","000,000","aaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A0000000","AAAAAAAA" +"00,000",,"Aaaaa@aaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A0000000","AAAA" +"000,000",,"AAaaaaaaa@aaaaaaa-aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","A0000000","AAAA" +"00,000",,"aaaaaa.aaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","000A0AA0","AAAA" +"000,000",,"aaaaa@aaaaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0000AA00","AAAA" +"000,000","000,000","aaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0000AA00","AAAAAAAA" +"000,000","000,000","aaaaa@aaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0000AA00","AAAAAAAA" +"000,000",,"aaaa000@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0000AA00","AAAA" +"000,000",,"aaaaaaaa_aaaa00@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0000AA00","AAAA" +"000,000",,"aaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0000AA00","AAAA" +"000,000",,"AAaa@AaaaaAaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0000AA00","AAAA" +"000,000",,"Aaaaa.Aaaa@aaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0000AA00","AAAA" +"000,000",,"aaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","000AAA00","AAAA" +"000,000",,"aa00aaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","00000000","AAAA" +"00,000",,"aaaaaa.aaaaa@aaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","000A000A","AAAA" +"000,000",,"aaaaaaaa.aaaaaaaa@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","000A00A0","AAAA" +"00,000",,"aaaaaaaa@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0A00000A","AAAA" +"00,000",,"aaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","000A0A00","AAAA" +"00,000","0,000","aaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0A00000A","AAAAAAAA" +"000,000",,"aaaaaaaa_aaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","A0000A00","AAAA" +"00,000",,"aAaaaaaa@aaaaaaaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","A0000000","AAAA" +"00,000",,"aaaaaaa.aaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","A000000A","AAAA" +"00,000","00,000","aaaaa0000@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0A00AA00","AAAAAAAA" +"00,000","000,000","aaaaaaaa@aaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","A000AA00","AAAAAAAA" +"00,000","0,000","aaaaaaaaaa@aaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","A000AA00","AAAAAAAA" +"00,000","00,000","aaaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0000A00A","AAAAAAAA" +"00,000",,"aaaaaaa00@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","A000A000","AAAA" +"000,000","000,000","aaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","000A0A00","AAAAAAAA" +"00,000",,"aaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","A000A00A","AAAA" +"00,000",,"aaaaaaaaa00@a0a.aaa",00/00/0000 00:00:00AA,"0,000.00","A000A00A","AAAA" +"000,000","000,000","aaaaaa.aaaaa@aaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0A00A00A","AAAAAAAA" +"00,000",,"aaaaa.aaaa@aaa.aaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","A000AA00","AAAA" +"00,000",,"Aaaa.AAaaaa@aaaaa.aaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","A000AA00","AAAA" +"00,000","000,000","aaaaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","A0000000","AAAAAAAA" +"00,000","000,000","aaaaaaa@aaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","00000A00","AAAAAAAA" +"00,000",,"aaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","00000A00","AAAA" +"000,000",,"aaaaaaaaaa@aaaaaaaaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","00000000","AAAA" +"000,000",,"aaaaaaaaa@aaaaaaaaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","00000000","AAAA" +"00,000","000,000","aaaaaaa_aaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0000AA0A","AAAAAAAA AAA AAAAAAA" +"00,000",,"aaaaa&aaaaa@0aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0000AA0A","AAAA" +"00,000","00,000","aaaaa.aaaaaaa@aaaaaa.aaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","A000AA00","AAAAAAAA" +"00,000","00,000","aaaaaaaa00@aaaaa.aaa.aa",00/00/0000 00:00:00AA,"0,000.00","0A000000","AAAAAAAA" +"00,000","00,000","aaaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0A000000","AAAAAAAA" +"000,000",,"aaaaaaa.aaaaaa@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0000A00A","AAAA" +"00,000",,"aaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","00000A00","AAAA" +"00,000",,"aaaaaaa.aaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","00000A00","AAAA" +"00,000",,"aaaaa.aaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","00000A00","AAAA" +"00,000",,"aaaaa.aaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","00000A00","AAAA" +"00,000",,"aaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","00000A00","AAAA" +"00,000",,"aaaaaaaa@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","00000A00","AAAA" +"00,000",,"aaaaaaa0@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","00000A00","AAAA" +"00,000",,"aaaaaa@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","00000A00","AAAA" +"00,000",,"aaaaaaaa@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","00000A00","AAAA" +"00,000",,"AAAAAAA@AAAAAAAA.AAA",00/00/0000 00:00:00AA,"0,000.00","00000A00","AAAA" +"00,000","000,000","aaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","00000A00","AAAAAA AAAA AAAAA" +"00,000",,"aaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","00000A00","AAAA" +"00,000",,"aaaa.aaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","00000A00","AAAA" +"00,000",,"aaaa000@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","00000A00","AAAA" +"00,000",,"Aaaaaaaaaaaaaa00@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","00000A00","AAAA" +"00,000",,"AAaaaaaaaaa@aaaaaaaaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","00000A00","AAAA" +"00,000",,"aaaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","00000A00","AAAA" +"00,000",,"Aaaa.aaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","00000A00","AAAA" +"00,000",,"aaaaaa00@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0000000A","AAAA" +"00,000","000,000","aaaaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0000000A","AAAAAAAA" +"00,000","000,000","aaaaaaaa000@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AA000000","AAAAAAAA" +"000,000","000,000","aaa_aaaaaaa@aaaaa.aa",00/00/0000 00:00:00AA,"0,000.00","000AA0A0","AAAAAAAA" +"00,000","000,000","AaaaaaAAaaa@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0000000A","AAAAAAAA" +"00,000","000,000","aaaaaaaaaaa.aaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","000AA0A0","AAAAAAAA" +"00,000","000,000","aaaa.a.aaaaaaa-aaaaaaaa@aaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","000AA0A0","AAAAAAAA" +"00,000","00,000","aaaaaa0aaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","000AA0A0","AAAAAAAA" +"00,000",,"Aaaaaaaa@aaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","000AA0A0","AAAA" +"0,000",,"aaaaaaaa@aaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0000A00A","AAAA" +"00,000","00,000","aaaaa.aaaaaaa@aaaaa.aaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A000AA00","AAAAAAAA AAA AAAAAAA" +"000,000","000,000","aaaaaaaaa@aaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A0000000","AAAAAAAA" +"000,000","00,000","Aaaaaaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0000000A","AAAAAAAA" +"00,000",,"aaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A0A0000","AAAA" +"00,000","0,000","aaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A0A0A00","AAAAAAAA" +"000,000",,"Aaaaa_aaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A000000","AAAA" +"000,000",,"aaaaaaaaaa000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A000AA00","AAAA" +"000,000","00,000","aaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A000AA00","AAAAAA AAAA AAAAA" +"000,000",,"aaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0000A00A","AAAA" +"00,000","000,000","aaaaaaaaa0000@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A0000000","AAAAAAAA" +"000,000","000,000","aaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0000A000","AAAAAAAA" +"00,000",,"aaaaaaaaaa00@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0A000000","AAAA" +"00,000","000,000","aaaaaaa@aaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A000AA00","AAAAAAAA" +"000,000",,"aaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0000000A","AAAA" +"00,000","000,000","Aaaaa.Aaaaaaaa@aaaaaaa.aa",00/00/0000 0:00:00AA,"0,000.00","0A000000","AAAAAAAA" +"00,000",,"aaaa@aaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","A000AA00","AAAA" +"000,000",,"aaaaaaaaa00@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","00000000","AAAA" +"00,000","000,000","aaaaaa@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","A000000A","AAAAAA AAAA AAAAA" +"00,000",,"aaaaaaaa@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","A000000A","AAAA" +"00,000",,"aaaaaaaaaaaa@aaaaa.aa",00/00/0000 0:00:00AA,"0,000.00","0A000000","AAAA" +"00,000",,"aaa0000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0000000A","AAAA" +"00,000","000,000","aaaaaaaa@aa.aa.aaa",00/00/0000 0:00:00AA,"0,000.00","0000000A","AAAAAAAA" +"000,000","00,000","aaa00@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A000000A","AAAAAAAA" +"000,000","00,000","aaaaaaaa@aaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A000000A","AAAAAAAA" +"000,000",,"aaaaaaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A000000A","AAAA" +"000,000",,"aaaaaaa0@aaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","00000000","AAAA" +"00,000",,"aaaaaaaaa@aaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","000AAA0A","AAAA" +"00,000",,"aaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","000AAA0A","AAAA" +"00,000",,"aaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","000AAA0A","AAAA" +"000,000","000,000","aaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A00000A","AAAAAAAA AAA AAAAAAA" +"000,000","00,000","aaaaaa.0@aa.aaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A00AA00","AAAAAAAA" +"000,000",,"aaaaaaaaa00@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A00AA00","AAAA" +"000,000","000,000","aaaaaaaaa000@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AA00AA00","AAAAAAAA AAA AAAAAAA" +"000,000",,"a0aaaaaaa0a@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A000AA00","AAAA" +"00,000","000,000","aaaaaaaa@aaaaaaaaaa.aa",00/00/0000 0:00:00AA,"0,000.00","0A000000","AAAAAAAA AAA AAAAAAA" +"00,000",,"aaaaaaaaaaa@aa.aa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A000000","AAAA" +"00,000","000,000","aaaa000@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A000A0A","AAAAAAAA" +"00,000",,"aaaaaaaaaa_aaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","A000A000","AAAA" +"00,000","00,000","aa00@aaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0000A000","AAAAAAAA AAA AAAAAAA" +"00,000",,"aaaaa.aaaaaa@aaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0A000A0A","AAAA" +"00,000",,"aaaaaaaa_aa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AA00A000","AAAA" +"00,000","00,000","aaaaaaaaa_aaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AA00A000","AAAAAAAA" +"00,000","000,000","aaaaaa0000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A0000000","AAAAAAAA" +"00,000",,"aaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A000A000","AAAA" +"00,000",,"aaa@aaaaa-aaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A000AA00","AAAA" +"000,000","000,000","aaaaaaaa_aaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","00000000","AAAAAAAA AAA AAAAAAA" +"00,000",,"aaaaa@aaaaaa.aa",00/00/0000 00:00:00AA,"0,000.00","0A000000","AAAA" +"000,000","00,000","aaaaaa0000@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AA000A00","AAAAAAAA" +"00,000","000,000","aaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A000000","AAAAAAAA" +"00,000","00,000","aaaaa_aaaaaa000@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A0000000","AAAAAAAA" +"00,000",,"aaaaaaaaa@AAAAA.AAAAAAAAA.AAA",00/00/0000 0:00:00AA,"0,000.00","0A000000","AAAA" +"00,000",,"aaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0000A00A","AAAA" +"00,000","00,000","aaaaaaaaaa_000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A00A000","AAAAAAAA AAA AAAAAAA" +"00,000","00,000","aaaaaaaaa00@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A00A000","AAAAAAAA" +"00,000","00,000","aaaaaaaa@aaaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A00A000","AAAAAAAA" +"000,000",,"aaaaaaaaa000@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A000A0A","AAAA" +"000,000","00,000","a_aaaaaaa@aaaaaaaaa.aa",00/00/0000 0:00:00AA,"0,000.00","0A0A0A00","AAAAAAAA" +"000,000","0,000","aaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A0000000","AAAAAAAA" +"00,000","000,000","aaaaaaaa@aaaaaaaaaa.aa",00/00/0000 0:00:00AA,"0,000.00","0A000000","AAAAAAAA AAA AAAAAAA" +"000,000",,"aaaaaaaaaaaaaaaaa00@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0A000A00","AAAA" +"00,000","00,000","aaaaaa@aaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A00A00A","AAAAAAAA" +"00,000",,"aaaaaa@aaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A00AA00","AAAA" +"00,000",,"aaaaa.aaaaaaaa@aaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A00AA00","AAAA" +"000,000","00,000","AAAAAAAAAAA@AAA.AAA",00/00/0000 00:00:00AA,"0,000.00","0000A000","AAAAAAAA" +"000,000",,"AAAAA00@AAA.AAA",00/00/0000 00:00:00AA,"0,000.00","0000A000","AAAA" +"000,000","000,000","aaaaaa@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","00000000","AAAAAAAA AAA AAAAAAA" +"000,000",,"aaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0A000000","AAAA" +"000,000","00,000","aaaaaaaaa00@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0000A00A","AAAAAA AAAA AAAAA" +"00,000",,"aaaaaaaaa@aaaaaaaaaaaaa.aa",00/00/0000 00:00:00AA,"0,000.00","00000000","AAAA" +"00,000",,"aaaaaaa@aaaaaaaaaaaaa.aa",00/00/0000 00:00:00AA,"0,000.00","00000000","AAAA" +"00,000",,"aaaaaaaa@aaaaaaaaaaaaa.aa",00/00/0000 00:00:00AA,"0,000.00","00000000","AAAA" +"00,000","00,000","aaaaaaa@aaaaaaaaaaaaa.aa",00/00/0000 00:00:00AA,"0,000.00","00000000","AAAAAA AAAA AAAAA" +"00,000","00,000","aaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","A0000A0A","AAAAAAAA" +"000,000","00,000","aaaaaaaaaaaa@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0A00AA00","AAAAAAAA" +"00,000",,"Aaaaaaaa@aaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0A00A00A","AAAA" +"00,000",,"aaaaaa@aaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0A00A00A","AAAA" +"00,000",,"aaaaa0@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0A00A00A","AAAA" +"00,000",,"aaaaaaa@aaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0A00A00A","AAAA" +"00,000",,"aaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","00000A0A","AAAA" +"00,000",,"aaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A0000A00","AAAA" +"000,000","000,000","aaaa_aaaaaaa@aaaa.aa",00/00/0000 0:00:00AA,"0,000.00","A0000000","AAAAAAAA" +"000,000",,"aaaaaaa@aa.aaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","00000A00","AAAA" +"00,000",,"aaaaa@aaaaaaaa-aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A000AA00","AAAA" +"000,000",,"aaaaaaaa@aaaaaaa-aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","00000A00","AAAA" +"00,000",,"AAaaaaaaaa@aaaaaaa-aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A000AA00","AAAA" +"00,000",,"aaaaaaaaaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A00000A","AAAA" +"000,000",,"aaaa@aaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A0000000","AAAA" +"000,000","000,000","aaaaa00000@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A0000000","AAAAAA AAAA AAAAA" +"000,000",,"aaaaaaaaa@aaaaaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A0000000","AAAA" +"00,000",,"aaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A00AA00","AAAA" +"00,000",,"aaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A00AA00","AAAA" +"00,000",,"aaaa_0000@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A00AA00","AAAA" +"00,000",,"aaaaaa00@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A00AA00","AAAA" +"00,000","00,000","aaaaa.aa@aaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A00AA00","AAAAAAAA" +"000,000","000,000","Aaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0000A000","AAAAAAAA" +"000,000",,"aaaaaaaa00@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0000A000","AAAA" +"00,000","00,000","aaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AA000000","AAAAAAAA" +"000,000",,"aaaaaaaaa@aa.aaa",00/00/0000 00:00:00AA,"0,000.00","A0000000","AAAA" +"000,000","00,000","aaaaa_aaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","A0000000","AAAAAAAA" +"000,000","000,000","aaaaa.aaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","A0000000","AAAAAA AAAA AAAAA" +"000,000","0,000","aaaaa00@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0000000A","AAAAAAAA" +"000,000","00,000","aaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","A0000000","AAAAAAAA" +"00,000",,"aaaaaaaa0000@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","A000000A","AAAA" +"00,000","000,000","aa.aaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","A000000A","AAAAAAAA" +"00,000",,"aaa_aaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","A000000A","AAAA" +"00,000",,"aaaaa00@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","A000000A","AAAA" +"00,000",,"aaaaaa000@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","A000000A","AAAA" +"00,000",,"aaaaaa-a@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","A000000A","AAAA" +"00,000",,"aaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A000A000","AAAA" +"000,000",,"aaaaaa__a@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A00A00A","AAAA" +"00,000","00,000","aaaaaaaa@aaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A000A00A","AAAAAAAA" +"00,000",,"aaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A000AA00","AAAA" +"00,000",,"aaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A000A00A","AAAA" +"00,000",,"aaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A000A00A","AAAA" +"00,000",,"aaaaaaaaaaaaaaaaaa@aaaaaaaaa.aa",00/00/0000 0:00:00AA,"0,000.00","A000A00A","AAAA" +"00,000","00,000","aaaaaaaaaa@aaaaa.aa",00/00/0000 0:00:00AA,"0,000.00","A000A00A","AAAAAA AAAA AAAAA" +"00,000",,"aaaa_aaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A000A00A","AAAA" +"00,000","00,000","aaaaaaaaa@aaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A000A00A","AAAAAA AAAA AAAAA" +"00,000",,"aaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A000A00A","AAAA" +"00,000",,"aaaaaa@aaaaaaaaa.aa",00/00/0000 0:00:00AA,"0,000.00","A000A00A","AAAA" +"00,000",,"aaaa@aaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A000A00A","AAAA" +"00,000",,"aaaaaaaaaaaa@aaaaa.aa",00/00/0000 0:00:00AA,"0,000.00","A000A00A","AAAA" +"00,000",,"aaaa@aaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A000A00A","AAAA" +"00,000","000,000","aaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A000A00A","AAAAAAAA AAA AAAAAAA" +"00,000",,"aaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A000A00A","AAAA" +"00,000",,"aaaaa.aaaaaaa@aaaaaaaaa.aa",00/00/0000 0:00:00AA,"0,000.00","A000A00A","AAAA" +"00,000",,"aaaaaaaaa@aaaaaaaaa.aa",00/00/0000 0:00:00AA,"0,000.00","A000A00A","AAAA" +"000,000",,"aaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A0000A0A","AAAA" +"00,000","00,000","aaaaaaa00@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","00000A00","AAAAAAAA" +"000,000",,"aaaaa@aaaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AA0AAAA0","AAAA" +"000,000",,"aaaaaa@aaaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AA0AAAA0","AAAA" +"000,000","00,000","aaaaaaaa_00@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","000AA0A0","AAAAAAAA" +"000,000",,"aaaaaaaaaaaaa@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","000AAAA0","AAAA" +"00,000",,"aaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","00000000","AAAA" +"00,000",,"aaaaaaaaaaaaaa@aaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","A000AA00","AAAA" +"00,000",,"aaaa@aaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","A000AA00","AAAA" +"00,000","00,000","aaaaaaaa@aaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","A000AA00","AAAAAAAA" +"00,000","000,000","Aaaaaa.Aaaaa@AAAA.aa",00/00/0000 00:00:00AA,"0,000.00","AA000000","AAAAAAAA" +"00,000",,"aaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","A000AA00","AAAA" +"0,000","000,000","aaaa0000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0000000A","AAAAAA AAAA AAAAA" +"00,000","00,000","aaaaaaaaaaaaa@aaaaa.aa",00/00/0000 0:00:00AA,"0,000.00","0A000A00","AAAAAAAA" +"00,000","00,000","aaaaaaaa00@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A0000000","AAAAAAAA" +"00,000",,"aaaaaaaaaa000@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0000AA0A","AAAA" +"000,000",,"aaaaa@aa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A0A00AA","AAAA" +"000,000",,"aaaaaa000@aaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A0A00AA","AAAA" +"000,000",,"aaaa0aaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A0A00AA","AAAA" +"000,000","000,000","aaaaaaaaa@aa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A0A00AA","AAAAAAAA" +"000,000",,"aaaaaaa@aa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A0A00AA","AAAA" +"000,000",,"aaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A0A00AA","AAAA" +"000,000",,"aaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A0A00AA","AAAA" +"000,000",,"aaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A0A00AA","AAAA" +"000,000","000,000","aaaaaaaaa.aaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A0A00AA","AAAAAAAA" +"000,000",,"aaaaaaaaa@aa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A0A00AA","AAAA" +"000,000",,"aaaa000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A0A00AA","AAAA" +"000,000",,"aaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","00000A00","AAAA" +"000,000","0,000","aaaaaa.aaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","00000A00","AAAAAAAA" +"00,000","000,000","aaaaaa@aaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0000000A","AAAAAAAA" +"00,000","00,000","aaaaaa.aaaaa.aaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0000000A","AAAAAAAA AAA AAAAAAA" +"00,000","0,000","aaaa.a.aaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A00AA00A","AAAAAAAA" +"00,000",,"aaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0000000A","AAAA" +"000,000","00,000","aaaaaaaaa.aa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AA000A00","AAAAAAAA" +"00,000","00,000","aaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0000000A","AAAAAAAA AAA AAAAAAA" +"00,000","000,000","aaaaaa00@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A00A00A","AAAAAAAA" +"000,000","000,000","aaaaaaa0000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A000000","AAAAAAAA AAA AAAAAAA" +"00,000","00,000","aaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","00000A00","AAAAAAAA" +"00,000","000,000","aaaaaaaaa@aaaaaaaa.aa",00/00/0000 0:00:00AA,"0,000.00","0A000A00","AAAAAAAA AAA AAAAAAA" +"000,000","000,000","aaaaaaa.aaaaaaa@aaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AA000A00","AAAAAAAA" +"00,000","00,000","aaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A000A00","AAAAAAAA AAA AAAAAAA" +"00,000","000,000","aaaaaaa000@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A000A00","AAAAAA AAAA AAAAA" +"00,000",,"aaaaa.aaaaaaaa@aaaaaaaaa-aa.aaa",00/00/0000 0:00:00AA,"0,000.00","A000AA0A","AAAA" +"00,000",,"aaaaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","000AA000","AAAA" +"00,000","00,000","aaaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A000A00","AAAAAAAA AAA AAAAAAA" +"00,000",,"aaaaaaaaa0000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A000A00","AAAA" +"00,000","0,000","aaaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A000AA00","AAAAAAAA" +"000,000","000,000","aaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AA000000","AAAAAAAA" +"00,000",,"aaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0000000A","AAAA" +"00,000",,"aaaaaaa00@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A00AA000","AAAA" +"00,000",,"Aaaaa_Aaaaaaa@aaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0000A00A","AAAA" +"00,000","00,000","aaaaa@aaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AA0A0000","AAAAAAAA" +"00,000",,"aaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","00000A00","AAAA" +"00,000",,"aaaaaa_aaaaaaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","00000A00","AAAA" +"000,000",,"aaaaaaaa.aaaaaaa@aaaaa.aaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A000A0A","AAAA" +"00,000",,"aaaaaaaaa@aaaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A00AAA00","AAAA" +"000,000","000,000","aaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A00A000","AAAAAAAA" +"000,000","000,000","aaaaa.aaaaa@aaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AA000A00","AAAAAAAA" +"000,000","00,000","aaaaaaa.aaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","00000000","AAAAAAAA" +"0,000",,"aaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","000A0000","AAAA" +"0,000",,"aaaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","000A0000","AAAA" +"0,000","000,000","aaaaaaaa.aaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","000A0000","AAAAAAAA" +"00,000",,"aaaaaaa.aaaaaaaaa@a-aaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A000A00","AAAA" +"00,000",,"Aaaaa.Aaa@aaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","000A0A00","AAAA" +"00,000",,"aaaaa.aaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A00A0AA0","AAAA" +"00,000","000,000","aaaaa.aaaaaaa@aaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A00A0AA0","AAAAAAAA" +"00,000",,"aaaaaaa.aaaaaaa@aaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A00A0AA0","AAAA" +"000,000","00,000","aaaaaaaaa00@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AA000A00","AAAAAAAA AAA AAAAAAA" +"0,000",,"Aaaaaaa_Aaaaaaa@aaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A0AAA00","AAAA" +"000,000",,"AaaaaaaA00@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A0000000","AAAA" +"0,000",,"AAaaaaaaa@aaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A00A000","AAAA" +"000,000","00,000","aaaaa000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","00000000","AAAAAAAA" +"00,000","000,000","aaaaaa.aa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","00000A00","AAAAAAAA" +"00,000",,"aaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0000000A","AAAA" +"000,000","000,000","aaaa.a.aaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A00A000A","AAAAAAAA" +"000,000",,"aaaaaaa.aa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0000AA00","AAAA" +"000,000",,"aaaaaaaaaaaaaa@aaaaa.aa",00/00/0000 0:00:00AA,"0,000.00","0000AA00","AAAA" +"000,000",,"aaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0000AA00","AAAA" +"000,000",,"aaaaaaaaaaa0000@aaaaa.aa",00/00/0000 0:00:00AA,"0,000.00","0000AA00","AAAA" +"000,000",,"aaaaaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0000AA00","AAAA" +"000,000",,"aaaa0000@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0000AA00","AAAA" +"000,000",,"aaaaa0000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0000AA00","AAAA" +"000,000","000,000","aaaaa0000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0000AA00","AAAAAAAA" +"000,000",,"aaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0000AA00","AAAA" +"000,000",,"aaaaa0@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0000AA00","AAAA" +"000,000","000,000","aaaaaa0000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0000AA00","AAAAAAAA" +"000,000",,"aaaaaa0000@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0000AA00","AAAA" +"000,000",,"aaaaa00000@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0000AA00","AAAA" +"00,000","000,000","aaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A00A00A","AAAAAAAA AAA AAAAAAA" +"00,000","000,000","aaaaaaaaaa00@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A000A000","AAAAAA AAAA AAAAA" +"00,000",,"aaaaaaaaaaaaa000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A0000A00","AAAA" +"00,000","00,000","aaaaa.aaaaa@aa.aaa",00/00/0000 0:00:00AA,"0,000.00","A0000000","AAAAAAAA" +"00,000","00,000","aaaa.aaaaa@aa.aaa",00/00/0000 0:00:00AA,"0,000.00","A0000000","AAAAAAAA" +"00,000",,"aaaaaaa.aaaaaaa@aa.aaa",00/00/0000 0:00:00AA,"0,000.00","A0000000","AAAA" +"00,000",,"aaaaa.aaaaa@aa.aaa",00/00/0000 0:00:00AA,"0,000.00","A0000000","AAAA" +"00,000","00,000","aaaaaaa.aaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AA0AAAAA","AAAAAAAA" +"00,000","00,000","aaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0000A00A","AAAAAAAA AAA AAAAAAA" +"000,000",,"aaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A0000000","AAAA" +"000,000","00,000","aaaaaaa@aaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AA000000","AAAAAAAA" +"000,000",,"aaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AA000000","AAAA" +"000,000","00,000","Aaaaaa.Aaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A000A00A","AAAAAAAA" +"00,000",,"aaaaaa@aaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A000000","AAAA" +"000,000","00,000","aaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AA000000","AAAAAAAA" +"000,000",,"aaaaaaaaaa0@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AA000000","AAAA" +"00,000",,"aaaaa00@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A00000A","AAAA" +"000,000","00,000","aaaaaaa.aaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AA000000","AAAAAAAA" +"000,000","000,000","aaaaaa.aaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","000AAAA0","AAAAAAAA" +"000,000","00,000","aaaa.aaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","000AAAA0","AAAAAAAA" +"000,000",,"aaaaaaaaaaa00@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0000AA00","AAAA" +"000,000",,"aaaa_aaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0000AA00","AAAA" +"000,000","00,000","aaaaaaaaa00@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0000AA00","AAAAAAAA" +"000,000","00,000","aaaaaa00@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0000AA00","AAAAAAAA AAA AAAAAAA" +"000,000","000,000","aaaaaaaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0000AA00","AAAAAAAA" +"00,000",,"aaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A00000A","AAAA" +"000,000","000,000","aaaaaa0@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0000AA00","AAAAAAAA" +"00,000","00,000","aaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A000A00A","AAAAAAAA AAA AAAAAAA" +"00,000",,"aaaaaaaa@aaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AA000A00","AAAA" +"00,000","000,000","aaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A00000A","AAAAAAAA" +"00,000","000,000","aaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A00000A","AAAAAAAA" +"000,000",,"aaaaaaaa00@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AA00A000","AAAA" +"00,000",,"aaaaaa.aaaa@aaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A000A00","AAAA" +"00,000",,"aaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A00000A","AAAA" +"00,000",,"aaaaaaaa.a.aaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A000A0A","AAAA" +"000,000","00,000","aaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A000A000","AAAAAAAA" +"00,000",,"aaaaaaaa@aaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","00000000","AAAA" +"000,000",,"aaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A0A00A0","AAAA" +"000,000",,"aaaaaaaaa.aaaaaa@aaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A00AA000","AAAA" +"00,000","00,000","aaa0@aaa.aaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A0A00A0","AAAAAAAA AAA AAAAAAA" +"000,000",,"aaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A000000A","AAAA" +"000,000",,"aaaaaa_aaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","00000000","AAAA" +"00,000",,"aaaaaaaa000@aaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","00000A0A","AAAA" +"000,000",,"aaaaaaaa@aaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0000A00A","AAAA" +"000,000",,"aaaaaa000@aaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0000A00A","AAAA" +"00,000",,"aaaaaaaaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0A000000","AAAA" +"00,000",,"aaaaaaaaa.aaaaaa@aa.aaa",00/00/0000 00:00:00AA,"0,000.00","A0000000","AAAA" +"00,000",,"aaaaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","A000A000","AAAA" +"000,000",,"aaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AA000A0A","AAAA" +"000,000","000,000","aaaaa000@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","00000000","AAAAAAAA AAA AAAAAAA" +"00,000","000,000","a_aaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","A0000A0A","AAAAAAAA" +"00,000",,"aaaaa@aaaa.aa",00/00/0000 00:00:00AA,"0,000.00","A000000A","AAAA" +"00,000",,"Aaaaaaaaa@aaaa.aa",00/00/0000 00:00:00AA,"0,000.00","A000000A","AAAA" +"00,000",,"Aaaaaaa@aaaa.aa",00/00/0000 00:00:00AA,"0,000.00","A000000A","AAAA" +"00,000",,"aaaaaa@aaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","000AAAA0","AAAA" +"00,000",,"aaaaaaa00@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","A000A000","AAAA" +"00,000",,"aaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AA000A00","AAAA" +"00,000",,"aaaaaa.aaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","00000A00","AAAA" +"00,000",,"aaaaaaa000@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","A000A000","AAAA" +"00,000",,"aaaaaaaa@aaaaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","A000A000","AAAA" +"00,000",,"aaaaaaaaaa@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","A000A000","AAAA" +"00,000",,"aaaaaa@aaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","A000A000","AAAA" +"00,000",,"aaaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","A000A000","AAAA" +"00,000",,"aaaaaa.aaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","A000A000","AAAA" +"00,000",,"aaaaaa000@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","A000A000","AAAA" +"00,000",,"aaa000@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","A000A000","AAAA" +"00,000",,"aaaaa0000@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","A000A000","AAAA" +"00,000",,"aaaaaaaaaaaaa@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","A000A000","AAAA" +"00,000",,"aaaaaaaa@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","A000A000","AAAA" +"00,000",,"aaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","A000A000","AAAA" +"00,000",,"aaaa000@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","A000A000","AAAA" +"00,000",,"aaaaa0@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","A000A000","AAAA" +"00,000","00,000","aaaaaa@aaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","A0000000","AAAAAAAA" +"000,000",,"aaaaa.aaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0A000000","AAAA" +"00,000",,"aaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","A000A000","AAAA" +"000,000",,"aaaaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AA000000","AAAA" +"000,000","000,000","aaa.aaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","00000A0A","AAAAAA AAAA AAAAA" +"00,000","000,000","aaaaaa.aaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0000A000","AAAAAAAA" +"000,000","000,000","aaaaa.aaaaaa@aaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0A0A00AA","AAAAAAAA" +"000,000",,"aaaaaa.aaaaa@aaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0A0A00AA","AAAA" +"000,000","0,000","aaaaaaaa.aaaaa@aaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0A0A00AA","AAAAAA AAAA AAAAA" +0,,"aaaaaaaaaaaaaaa@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","00000A0A","AAAA" +"00,000",,"Aaaaaaa@aaaa.aa",00/00/0000 00:00:00AA,"0,000.00","A000000A","AAAA" +"0,000",,"aaaaaa@aaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","A0000000","AAAA" +"0,000",,"aaaaaaaaaa@aaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","A0000000","AAAA" +"0,000",,"aaaaa.aaaa@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","A0000000","AAAA" +"000,000",,"AAaaaaaaa@aaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","000A000A","AAAA" +"00,000","000,000","aaaa.aaaaa@aaaaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","000A0AA0","AAAAAA AAAA AAAAA" +"00,000","00,000","aaaaaaaa00@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0A00A00A","AAAAAAAA AAA AAAAAAA" +"00,000",,"aaaaaaaaa@aaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","000A0AA0","AAAA" +"000,000",,"aaaaaaaaaaaaa@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","A0000A00","AAAA" +"00,000","000,000","a.aaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0A0AAA0A","AAAAAAAA" +"000,000",,"aaaaaa.aaaaaa@aaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","A0000A00","AAAA" +"00,000","000,000","aaaaaaaaaa-aaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","A0000A00","AAAAAA AAAA AAAAA" +"00,000","0,000","aaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0A000000","AAAAAAAA" +"00,000","00,000","aaaaa000@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","A0000000","AAAAAAAA" +"00,000","00,000","aaa00000@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","A0000000","AAAAAAAA" +"000,000",,"aaaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0000000A","AAAA" +"00,000","00,000","aaaaaaa_aaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","000AA000","AAAAAAAA" +"000,000",,"aaaaaaaaaa@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0000000A","AAAA" +"000,000",,"aaaaaaaaaa@aaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0000000A","AAAA" +"000,000","000,000","aaaaaa0000@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AA000A00","AAAAAA AAAA AAAAA" +"00,000",,"aaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AA00AA00","AAAA" +"00,000","000,000","aaaaaaaaaaaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AA00AA00","AAAAAAAA" +"00,000",,"aaaaaa_aaa@aaaaa.aaa.aa",00/00/0000 00:00:00AA,"0,000.00","A000AA00","AAAA" +"00,000",,"aaaaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","00000A0A","AAAA" +"00,000",,"aaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0A00A00A","AAAA" +"000,000",,"aaa.aaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","A0000000","AAAA" +"000,000",,"aaaaaa.aaaa0@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","A0000000","AAAA" +"000,000",,"aaaaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","A0000000","AAAA" +"000,000",,"aaaaaa000@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","A0000000","AAAA" +"000,000",,"aaaaa.aaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","A0000000","AAAA" +"000,000","00,000","aaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","A0000000","AAAAAAAA" +"000,000","00,000","aaaaaa000@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","A0000000","AAAAAAAA" +"000,000",,"aaaaaaaa00@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","A0000000","AAAA" +"000,000","000,000","aaaaaaaa@aaaaaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","A0000000","AAAAAAAA" +"000,000",,"aaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","A0000000","AAAA" +"000,000",,"aaaaaaa00@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","A0000000","AAAA" +"000,000",,"aaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","A0000000","AAAA" +"000,000","000,000","aaaaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0A000000","AAAAAAAA" +"000,000",,"aaaa_aaaaaaaaaa@aaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0A0AAAA0","AAAA" +"0,000","00,000","aaaaa.aaaaaaaa@aaaaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","A0000A00","AAAAAAAA" +"0,000",,"aaaaaa.aaaaaa@aaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","A0000A00","AAAA" +"00,000",,"aaaaaaaaa_aaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","00000A00","AAAA" +"000,000",,"aaaaaaa.aaaaa@aa.aaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AA000000","AAAA" +"000,000","00,000","aaaaaa000@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AA0AAA00","AAAAAA AAAA AAAAA" +"00,000",,"aaaaaa_aaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","00000A00","AAAA" +"000,000","000,000","aaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AA0AAA00","AAAAAAAA" +"000,000",,"aaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0A000000","AAAA" +"00,000","00,000","aaaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","00000A00","AAAAAAAA" +"00,000","00,000","aaaa00@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AA000000","AAAAAAAA" +"00,000",,"aaaaaaaaaa@aaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AA000A00","AAAA" +"0,000",,"aaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","A0000000","AAAA" +"000,000",,"aaaaaaaaa.aaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0000A000","AAAA" +"000,000",,"aaaaaaaaa_aaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0000A000","AAAA" +"000,000",,"aaaaaa.a.aaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0A00A00A","AAAA" +"00,000","00,000","aaaaaaaaaa00@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0A000A00","AAAAAA AAAA AAAAA" +"00,000","00,000","aaaaaa.aaaaaaaa.aaaa@aaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","000A00A0","AAAAAAAA" +"00,000",,"aaaaa.aaaaaaaaa.aaaa@aaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","000A00A0","AAAA" +"00,000","000,000","aaaaaa-aaaaaa@aaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","000A0A00","AAAAAAAA" +"00,000",,"aaaaaaaa@aaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","00000A0A","AAAA" +"000,000",,"aaaaaaaaaaa_00@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","00000000","AAAA" +"000,000",,"aaaaaaa_0000@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","00000000","AAAA" +"000,000","00,000","aaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0000A00A","AAAAAAAA" +"000,000","00,000","aaaaaa.aaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","A000A00A","AAAAAAAA" +"000,000",,"aaaaaaaa00a@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","00000000","AAAA" +"00,000",,"aaaaaa.aaaaaaaa@aaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","00000000","AAAA" +"00,000","000,000","aaa0aaaa0a@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","00000000","AAAAAAAA" +"00,000",,"Aaaaaa@aaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","A000AA00","AAAA" +"00,000","000,000","aaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","A0000000","AAAAAAAA" +"00,000",,"aaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","A000A000","AAAA" +"00,000",,"aaaaaaaaa@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","A0000000","AAAA" +"00,000",,"aaaaaa@aaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","A0000000","AAAA" +"000,000","000,000","Aaaa0000@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","A0000A0A","AAAAAAAA" +"0,000",,"aaaaaaaa@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","000A00AA","AAAA" +"0,000",,"aaaa@aaa-aaaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0000000A","AAAA" +"000,000","000,000","aaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0000A000","AAAAAA AAAA AAAAA" +"000,000","000,000","aaaaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","000A0AA0","AAAAAAAA" +"000,000",,"aaaaa00@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","000A0AA0","AAAA" +"000,000",,"aaaaaaaa@aaaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AA00000A","AAAA" +"00,000",,"aaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0A000000","AAAA" +"00,000","000,000","aaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0000A00A","AAAAAAAA" +"000,000",,"aaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","000A0AA0","AAAA" +"00,000",,"Aaaa.Aaaaaaaaaaa@aa.aaa",00/00/0000 00:00:00AA,"0,000.00","AA0A000A","AAAA" +"000,000",,"aaaaaaaa@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0A00A000","AAAA" +"000,000",,"Aaaaaa000@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0A00A000","AAAA" +"000,000",,"aaaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0A00A000","AAAA" +"000,000",,"aaaaaa00@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0A00A000","AAAA" +"000,000",,"AAAAAAAAAAA@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0A00A000","AAAA" +"000,000",,"aaaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0A00A000","AAAA" +"000,000",,"aaaaaaa0000@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0A00A000","AAAA" +"000,000",,"aaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0A00A000","AAAA" +"000,000",,"aaaaaa0000@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0A00A000","AAAA" +"000,000",,"aaa000@aaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0A00A000","AAAA" +"000,000",,"aaaaaaaa@aaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0A00A000","AAAA" +"00,000","000,000","aaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","00000000","AAAAAAAA AAA AAAAAAA" +"00,000",,"aaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0000AA00","AAAA" +"000,000",,"AAAA.AAAAAA@AAAAAAAAAAAAA.AAA",00/00/0000 0:00:00AA,"0,000.00","00000000","AAAA" +"000,000",,"aaaaaaaa@aaaaa.aa.aaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","00000000","AAAA" +"000,000",,"aaaaaa.aaaaa@aaa.aaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","00000000","AAAA" +"00,000",,"aaaaa.aaaaaaa@aaaaaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0000AA0A","AAAA" +"00,000",,"aaaaaaaaa00@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","00000000","AAAA" +"00,000",,"aaaaaa@aaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","00000000","AAAA" +"00,000",,"aaaaaaa@aaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","00000000","AAAA" +"000,000",,"aaaaa.aaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A0000A00","AAAA" +"000,000",,"aaaa.aaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A0000A00","AAAA" +"000,000",,"aaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A0000A00","AAAA" +"000,000",,"aaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A0000A00","AAAA" +"00,000","00,000","aaaaaa@aaaaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","000A0A0A","AAAAAA AAAA AAAAA" +"00,000",,"aaaaa@aaaaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","000A0A0A","AAAA" +"00,000",,"aAaaaaaaaaa@aaaaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","000A0A0A","AAAA" +"000,000",,"aaaaaaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A000AA00","AAAA" +"00,000","000,000","aaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0000AA0A","AAAAAAAA" +"00,000",,"aaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A00A000","AAAA" +"000,000",,"aaaaaaa000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A0000A00","AAAA" +"00,000","00,000","Aaaa0000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A0000000","AAAAAAAA AAA AAAAAAA" +"00,000","000,000","aaa000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A0000000","AAAAAAAA" +"00,000",,"aaaaa.aaaaaaaaa@aaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A000000","AAAA" +"000,000",,"aaaaaaa.aaaaaa-aaaaaaa@aaaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A00AA0A0","AAAA" +"00,000","000,000","aaaaaaaaaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A0000000","AAAAAAAA" +"0,000",,"aaaaaaaaaa00@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A00000A","AAAA" +"00,000",,"aaaaaaa@aaaaaaaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0000000A","AAAA" +"00,000",,"aaaaaaaaa00@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","00000000","AAAA" +"000,000","00,000","aaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A000A00A","AAAAAAAA AAA AAAAAAA" +"00,000",,"aaaa.aaaaa@aaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AA00000A","AAAA" +"00,000","00,000","aaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AA00000A","AAAAAAAA AAA AAAAAAA" +"00,000",,"aaaaa_000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0000A000","AAAA" +"00,000",,"aaaaaaa00@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0000A000","AAAA" +"00,000",,"aaaaa00@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A0000A0A","AAAA" +"00,000",,"aaaaaaaaaaa@aaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A00AA00","AAAA" +"000,000",,"aaaaaaaa@aaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","00000000","AAAA" +"000,000",,"aaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A00A00A","AAAA" +"000,000",,"aaaaaaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A00A00A","AAAA" +"000,000",,"aaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A00A00A","AAAA" +"000,000",,"aaaaaaaaaa_00@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A00A00A","AAAA" +"000,000",,"aaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A00A00A","AAAA" +"000,000",,"aaaaaaaaaa0@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A00A00A","AAAA" +"000,000",,"aaaaaa000000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A00A00A","AAAA" +"000,000",,"aaaaaaaaaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A00A00A","AAAA" +"000,000",,"aaaaaaaaaaa0000@aaaaa.aa",00/00/0000 0:00:00AA,"0,000.00","0A00A00A","AAAA" +"000,000",,"aaaaaaaaaaa0000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A00A00A","AAAA" +"000,000",,"aaaaa0000@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A00A00A","AAAA" +"000,000",,"aaaaa00@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A00A00A","AAAA" +"000,000",,"aaaaaaa@aaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A00A00A","AAAA" +"000,000",,"aaaaaaaaa000@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A00A00A","AAAA" +"000,000",,"aaaaaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A00A00A","AAAA" +"000,000",,"aaaaaaaa@aaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A00A00A","AAAA" +"000,000",,"aaaaaaaaa@aaaaa.aaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A00A00A","AAAA" +"000,000","000,000","aaaaa0000@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A00A00A","AAAAAA AAAA AAAAA" +"000,000","000,000","aaaaa0000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A00A00A","AAAAAA AAAA AAAAA" +"000,000",,"aaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A00A00A","AAAA" +"000,000",,"aaaaaaaaaaaa00@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A00A00A","AAAA" +"000,000",,"aaaaaaaa000@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A00A00A","AAAA" +"000,000",,"aaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A00A00A","AAAA" +"000,000",,"aaaaaaaaa000@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A00A00A","AAAA" +"000,000",,"aaaaaaaa@aaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A00A00A","AAAA" +"000,000",,"aaaaaaaaaaaaaaa0@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A00A00A","AAAA" +"000,000",,"aaaaaaa.aaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A00A00A","AAAA" +"000,000",,"aaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A00A00A","AAAA" +"000,000",,"aaaaaaaaaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A00A00A","AAAA" +"000,000",,"aaaaaa@aaaaaaaa.aaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A00A00A","AAAA" +"00,000",,"aaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A0A0A00","AAAA" +"00,000",,"aaaaa.aaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AA000A0A","AAAA" +"000,000",,"aaaaa_aaaaa_a@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A000A00A","AAAA" +"000,000","00,000","aaaaa00@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A000000","AAAAAAAA" +"000,000","000,000","aa00aaaaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0A00000A","AAAAAAAA" +"000,000",,"aaaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0A0AAAA0","AAAA" +"00,000",,"aaaaa_aaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0A000000","AAAA" +"00,000","00,000","aaaaaa_aa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","00000A00","AAAAAAAA" +"00,000",,"aaaaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AA000000","AAAA" +"00,000","00,000","aaaaaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0000000A","AAAAAAAA" +"00,000",,"aaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0000000A","AAAA" +"00,000",,"aaaaaaaaa@aaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0000000A","AAAA" +"00,000",,"aaa_aaaaaa00@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0000000A","AAAA" +"00,000",,"aaaaaaa@aaaaaaaa.a00.aa.aa",00/00/0000 00:00:00AA,"0,000.00","0000000A","AAAA" +"00,000",,"aaaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0000000A","AAAA" +"00,000",,"aaaaaaa@aaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0000000A","AAAA" +"00,000",,"aaaaaaaaaaa_0@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0000000A","AAAA" +"00,000",,"aaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0000000A","AAAA" +"00,000",,"Aaaa@aaaaaaaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0000000A","AAAA" +"00,000",,"aaaaaaaaaa0@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0000000A","AAAA" +"00,000",,"aaaaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0000000A","AAAA" +"000,000","00,000","aaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0A00000A","AAAAAAAA AAA AAAAAAA" +"000,000","00,000","aaaaaa.aaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","A0000000","AAAAAAAA" +"000,000",,"aaa.aaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","A0000000","AAAA" +"000,000",,"Aaaaa.aaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","A0000000","AAAA" +"000,000","000,000","aaaa00@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A0000A0A","AAAAAAAA" +"000,000",,"aaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A0000A0A","AAAA" +"000,000",,"aaaa00@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A0000A0A","AAAA" +"000,000","00,000","aaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A00000A","AAAAAAAA" +"000,000",,"aaaaaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AA0A00AA","AAAA" +"000,000","000,000","aaaa00@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0000000A","AAAAAAAA AAA AAAAAAA" +"00,000","00,000","aaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AA000A00","AAAAAAAA" +"000,000","000,000","Aaaaa.Aaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0000000A","AAAAAAAA AAA AAAAAAA" +"00,000","000,000","aaaaaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","00000000","AAAAAAAA" +"00,000","000,000","aaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A000AA00","AAAAAAAA AAA AAAAAAA" +"00,000",,"Aaaaaaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A000AA00","AAAA" +"00,000",,"aaaa@aaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A000AA00","AAAA" +"000,000",,"aaaaaaaaa00@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A00A00A","AAAA" +"000,000","00,000","Aaaaa.Aaaaa@aaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","00000A00","AAAAAAAA" +"00,000","000,000","aaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AA000A00","AAAAAAAA" +"000,000","000,000","Aaaaaaaaaaaaa00@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0000000A","AAAAAAAA" +"000,000",,"Aaaaaaaaa_aa@Aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0000000A","AAAA" +"00,000",,"aaaaa000@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0A000000","AAAA" +"00,000",,"aaaaaaaaaa@aa.aaa",00/00/0000 00:00:00AA,"0,000.00","0A000000","AAAA" +"00,000","00,000","aaaaaa.aaaaaaa@aa.aaa",00/00/0000 00:00:00AA,"0,000.00","00000A0A","AAAAAAAA" +"000,000",,"aaaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0000A000","AAAA" +"00,000","00,000","aaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0000000A","AAAAAAAA" +"000,000",,"aaa_aaaa00@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","A0000A00","AAAA" +"00,000",,"aaaaaaaaa0000@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","A0000000","AAAA" +"000,000",,"aaaaaa.aaaaaaa@aaaaaaaaa.aa",00/00/0000 00:00:00AA,"0,000.00","0A0A0A00","AAAA" +"00,000","00,000","aaaa@aaaaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","A000A000","AAAAAAAA AAA AAAAAAA" +"000,000","00,000","aaaaaaa.aaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","00000000","AAAAAA AAAA AAAAA" +"000,000","00,000","aaaaaaaaaaaaaaa0@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","00000000","AAAAAAAA AAA AAAAAAA" +"000,000","000,000","Aaaaa.Aaaaaa@00.aaa",00/00/0000 0:00:00AA,"0,000.00","00000000","AAAAAAAA" +"000,000","000,000","aaaaaa@aaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0000A000","AAAAAAAA AAA AAAAAAA" +"00,000","00,000","aaaaaaa.aaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","000A0A00","AAAAAAAA" +"000,000",,"aaaa_aaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A0000A00","AAAA" +"000,000",,"aaaa_aaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A0000A00","AAAA" +"00,000",,"aaa.aaaa@a-aaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A0000000","AAAA" +"00,000",,"aaaaaa.aaaaaaaa@a-aaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A0000000","AAAA" +"00,000",,"aaaaaa.aaaa0@a-aaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A0000000","AAAA" +"00,000",,"aaaaaa00@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A0000000","AAAA" +"00,000","00,000","aaaaa00@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A000000A","AAAAAAAA" +"00,000","0,000","Aaaaaaa.AaAaaaaa@aaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A000AA00","AAAAAAAA" +"00,000","00,000","aaaaaaaa@aaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A000AA00","AAAAAAAA AAA AAAAAAA" +"00,000",,"aaaaaaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A00A000","AAAA" +"000,000","000,000","aaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A000A0A","AAAAAAAA" +"00,000",,"aaa0@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A00AA00","AAAA" +"00,000",,"aaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A000A00","AAAA" +"000,000","00,000","aaaaa0000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AA00000A","AAAAAAAA" +"000,000","000,000","aaaaaa0000@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0000000A","AAAAAAAA" +"000,000",,"aaaa0000@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0000000A","AAAA" +"000,000",,"aaaaaaaa@aaaaaaaaa.aa",00/00/0000 0:00:00AA,"0,000.00","A000AA0A","AAAA" +"000,000","00,000","aaaaaaa@aaaaaaa.aaa.aa",00/00/0000 00:00:00AA,"0,000.00","00000000","AAAAAAAA" +"0,000","00,000","aaaaaaa0@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","A000A000","AAAAAAAA" +"000,000","000,000","aaaa_0000000@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","00000A00","AAAAAAAA" +"00,000","00,000","aaaaaa000@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0A00A00A","AAAAAAAA" +"00,000",,"aaaaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0A00A00A","AAAA" +"00,000",,"aa@aaaaaaaaaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0A00A00A","AAAA" +"00,000",,"aaaaaaaaa0000@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0A00A00A","AAAA" +"00,000",,"aaaa00@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0A00A00A","AAAA" +"00,000",,"aaaaaaaaa@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0A00A00A","AAAA" +"00,000",,"aaaa0aaa@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0A00A00A","AAAA" +"00,000",,"aaaaaaaa00@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0A00A00A","AAAA" +"00,000",,"aaaaaaa@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0A00A00A","AAAA" +"00,000",,"aaaaaaa.aaaaa@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0A00A00A","AAAA" +"00,000",,"aaaaaaaaa00@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0A00A00A","AAAA" +"00,000",,"aaaaaaaaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0A00A00A","AAAA" +"00,000","000,000","aaaaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0A00A00A","AAAAAAAA" +"00,000",,"aaa0a@aaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A0000000","AAAA" +"000,000",,"aaaaaaaaa0@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","000A0AA0","AAAA" +"00,000",,"aaaaaaaaaa@aaaaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AA00AA00","AAAA" +"000,000",,"aaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AA000A00","AAAA" +"000,000",,"Aaaaaaa_Aaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","000A0AA0","AAAA" +"00,000","000,000","aaaaaaaaa@AAAAA.AAA",00/00/0000 00:00:00AA,"0,000.00","A000A00A","AAAAAAAA" +"000,000",,"aaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","A0000000","AAAA" +"00,000",,"aaaaa@aaaaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0A0A0000","AAAA" +"00,000",,"aaaaaaa@aaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0A0A0000","AAAA" +"00,000","00,000","aaaaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0A0A0000","AAAAAAAA" +"00,000",,"aaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0A0A0000","AAAA" +"00,000",,"aaaaaaa@aaaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0A0A0000","AAAA" +"00,000",,"aaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0A0A0000","AAAA" +"00,000",,"aaaaaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0A0A0000","AAAA" +"000,000",,"aaaaaaaaaaaa_00@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","000A0000","AAAA" +"00,000","00,000","aaaaaaaaa0000@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0A00AA00","AAAAAAAA" +"000,000",,"aaaaaaa.aaaaaaaaa@aaaa.aaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0A00000A","AAAA" +"000,000","00,000","aaaa-aaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0A00000A","AAAAAAAA AAA AAAAAAA" +"00,000",,"aaaaaaaaaa_aaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","A0000A00","AAAA" +"000,000","000,000","aaaaaa@aaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","A0000000","AAAAAAAA AAA AAAAAAA" +"000,000","00,000","aaaaaaaa@aaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","A0000000","AAAAAAAA AAA AAAAAAA" +"00,000",,"aaaaaaaaaa@aaaaaaaaa.aa",00/00/0000 00:00:00AA,"0,000.00","A000AA00","AAAA" +"00,000",,"aaaa@aaaaaaaaa.aa",00/00/0000 00:00:00AA,"0,000.00","A000AA00","AAAA" +"00,000",,"aaaaa@aaaa.aa",00/00/0000 00:00:00AA,"0,000.00","A000AA00","AAAA" +"00,000",,"aaa@aaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","A000AA00","AAAA" +"00,000",,"aaaaaaaa@aaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","00000A0A","AAAA" +"000,000","00,000","aaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A0000000","AAAAAAAA AAA AAAAAAA" +"00,000","00,000","aaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","000A0A0A","AAAAAAAA" +"00,000","00,000","aaaaaa@aaaaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","000A0A0A","AAAAAA AAAA AAAAA" +"00,000","000,000","aaaa.aa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","00000A0A","AAAAAAAA" +"000,000",,"aaaaaa.aaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A00000A","AAAA" +"000,000",,"aaaaaa@aaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A00000A","AAAA" +"000,000",,"aaaa00@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A00000A","AAAA" +"000,000",,"aaaaaaaa@aaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A00000A","AAAA" +"000,000",,"aaaaaaaaa00@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A00000A","AAAA" +"000,000",,"aa_aa0@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A00000A","AAAA" +"000,000",,"aaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A000AA0A","AAAA" +"00,000",,"aaaaaaa@aaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A000AA00","AAAA" +"00,000","000,000","aaaa-aaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A0000000","AAAAAAAA" +"00,000","00,000","aaaaaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0000000A","AAAAAAAA" +"00,000",,"aaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A000A000","AAAA" +"00,000","000,000","Aaaaa00@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A000A000","AAAAAAAA" +"000,000",,"aaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0000AA00","AAAA" +"000,000",,"aaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A0000A0A","AAAA" +"0,000",,"aaaa.aaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","00000A00","AAAA" +"0,000",,"aaaaaa_aaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","00000A00","AAAA" +"00,000",,"aaaaaaaaaa@aa.aaa",00/00/0000 0:00:00AA,"0,000.00","AA000A00","AAAA" +"000,000",,"aaa0000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A00000A","AAAA" +"00,000","000,000","aaaaaaaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A000AA00","AAAAAAAA" +"00,000","000,000","aaa@AaaaAaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A000AA00","AAAAAA AAAA AAAAA" +"00,000","000,000","aaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0000A000","AAAAAAAA AAA AAAAAAA" +"000,000",,"aaaaaaa@aaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A000A0A","AAAA" +"000,000",,"aaaaaaa@0000aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","00000000","AAAA" +"00,000",,"aaaaa0aaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AA000000","AAAA" +"000,000","00,000","aaaaaa.aaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0000A000","AAAAAA AAAA AAAAA" +"00,000",,"aaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A000000","AAAA" +"00,000",,"aaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A000000","AAAA" +"00,000","00,000","aaaaaaaaa_0000@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","00000A00","AAAAAAAA" +"0,000",,"aaaaa00@aaaaaaaa.aa",00/00/0000 0:00:00AA,"0,000.00","0A000A00","AAAA" +"0,000","000,000","aaaaaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A000A00","AAAAAAAA" +"0,000",,"aaaaaaaaaa00@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A000A00","AAAA" +"0,000",,"aaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A000A00","AAAA" +"000,000","000,000","aa0000@aaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0000A00A","AAAAAAAA" +"000,000",,"aaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0000A00A","AAAA" +"000,000",,"aaaaaa.aaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0000A00A","AAAA" +"000,000","00,000","aaaaa_aaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0000A00A","AAAAAAAA" +"000,000",,"aaaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0000A00A","AAAA" +"000,000",,"aaaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0000A00A","AAAA" +"00,000","000,000","aaaaa00@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","00000000","AAAAAA AAAA AAAAA" +"000,000","000,000","aaaaaaaa00@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A0000A00","AAAAAAAA" +"00,000","000,000","aaaaaaaaa000@aaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A000000A","AAAAAAAA AAA AAAAAAA" +"00,000","00,000","aaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","000AA000","AAAAAAAA AAA AAAAAAA" +"00,000",,"aaa_aaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A000000","AAAA" +"00,000","000,000","aaaaa.a.aaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","00000000","AAAAAAAA" +"00,000",,"aaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","00000000","AAAA" +"00,000",,"aaaaaa00@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","00000000","AAAA" +"00,000","00,000","aaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AA000000","AAAAAAAA" +"00,000","000,000","aaaaaaaa0@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AA000A00","AAAAAAAA" +"00,000","00,000","aaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AA000000","AAAAAAAA" +"00,000",,"aaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","00000000","AAAA" +"000,000",,"aaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0000A00A","AAAA" +"000,000",,"aaaaaaaa@aaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0000000A","AAAA" +"000,000",,"aaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","000A0AA0","AAAA" +"000,000",,"aaaaa00@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","000A0AA0","AAAA" +"00,000",,"aaaaaaaaaaa@aaa.aaa.aa",00/00/0000 00:00:00AA,"0,000.00","00000000","AAAA" +"00,000","000,000","aaaaaaaaa@aaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","00000000","AAAAAAAA" +"000,000",,"aaaa.aaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","00000000","AAAA" +"00,000","000,000","aaaaa00@aaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0A00A00A","AAAAAAAA" +"0,000",,"aaaa_aaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0A0A0A0A","AAAA" +"0,000","00,000","aaaaaaaa.aaaaa@aaaaaaaa.aaa.aa",00/00/0000 00:00:00AA,"0,000.00","0A0A0A0A","AAAAAAAA AAA AAAAAAA" +"000,000","000,000","aaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AA000A00","AAAAAAAA" +"00,000","00,000","aaaaaaa000@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","A00AA000","AAAAAAAA" +"00,000","000,000","aaaa@aaaaaaaaa.aa",00/00/0000 0:00:00AA,"0,000.00","A000AA00","AAAAAAAA" +"00,000",,"aaa.aaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0000000A","AAAA" +"000,000",,"aaaaaaaa.aaaaaaa@aaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","00000000","AAAA" +"000,000",,"aaaa.aaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A000A000","AAAA" +"000,000",,"aaaaaaaa@a0.aaa.aa",00/00/0000 0:00:00AA,"0,000.00","0A000A0A","AAAA" +"00,000","0,000","aaaaaa00@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AA000000","AAAAAAAA" +"000,000","00,000","aaaa@aaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A000A0A","AAAAAAAA" +"00,000","00,000","aaa@aaaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A000A000","AAAAAAAA AAA AAAAAAA" +"00,000","000,000","aaaaaaa@aaaaaa.aa",00/00/0000 0:00:00AA,"0,000.00","A00AA000","AAAAAAAA" +"00,000","00,000","aaaaaaa_aaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A00AA000","AAAAAAAA" +"000,000","00,000","aaa0000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","00000000","AAAAAAAA" +"00,000","00,000","aaaaaaaa@aaaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A00000A","AAAAAAAA" +"000,000","000,000","aaaaaaaaaaa0000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A0000A0A","AAAAAAAA" +"000,000",,"aaaaaa.a.aaaaaa@aaaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A00AA0A0","AAAA" +"0,000","00,000","aaaaaaaaa00@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A00000A","AAAAAAAA" +"00,000","00,000","aaaaaaa.aaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A000A000","AAAAAAAA AAA AAAAAAA" +"00,000",,"Aaaaaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AA00A00A","AAAA" +"00,000","00,000","Aaaaa00@aaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A0000A00","AAAAAAAA" +"00,000",,"aaaaaaaaa@aa.aaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A000AA00","AAAA" +"00,000",,"aaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A000AA00","AAAA" +"000,000","000,000","aaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AA00000A","AAAAAAAA" +"000,000",,"aaaaaa_a@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AA000000","AAAA" +"00,000","000,000","aaaaaaaaaa@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AA00AA0A","AAAAAAAA" +"000,000","000,000","aaaaaaaa_aaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","00000000","AAAAAAAA AAA AAAAAAA" +"00,000","00,000","aaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","00000000","AAAAAAAA" +"00,000","00,000","aaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A00AA000","AAAAAAAA AAA AAAAAAA" +"000,000","000,000","aaaaaaaa.aaaaaaaa@aaaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","00000A0A","AAAAAAAA" +"000,000",,"aaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","000AA000","AAAA" +"00,000",,"aaaaaaa0@aaa.a00.aa.aa",00/00/0000 0:00:00AA,"0,000.00","0000AA00","AAAA" +"000,000","00,000","aaaaaa@aaa-aaaa.aa",00/00/0000 0:00:00AA,"0,000.00","0A00000A","AAAAAAAA" +"000,000",,"aaaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","A000A000","AAAA" +"00,000","00,000","aaaaaaa@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0A00A00A","AAAAAAAA" +"000,000","000,000","aaaaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0A000000","AAAAAAAA" +"00,000",,"aaaaaaaa00@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0A00A00A","AAAA" +"00,000",,"aaaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0A00A00A","AAAA" +"00,000",,"aaaaaaa000@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0A00A00A","AAAA" +"00,000",,"aaaaaaa.aaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0A00A00A","AAAA" +"00,000",,"aaaaaaaa@aaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0A00A00A","AAAA" +"00,000",,"aaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0A00A00A","AAAA" +"00,000",,"aaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0A00A00A","AAAA" +"00,000","00,000","aaaaaaaaaa.aaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0A00A00A","AAAAAAAA" +"00,000",,"aaaaaaaa.aaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0A00A00A","AAAA" +"00,000",,"aaaaaaa000@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0A00A00A","AAAA" +"00,000",,"aaaaaaa@aaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0A00A00A","AAAA" +"00,000",,"aaaaaaa.aaaaaaa@aaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0A00A00A","AAAA" +"00,000",,"aaaaaaa00@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0A00A00A","AAAA" +"00,000",,"aaaaaaaa.aaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0A00A00A","AAAA" +"00,000",,"aaaaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0A00A00A","AAAA" +"00,000",,"aaaaaa0@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0A00A00A","AAAA" +"00,000",,"aaaaaaaa.aaaaa@aaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0A00A00A","AAAA" +"00,000",,"aaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0A00A00A","AAAA" +"00,000",,"aaa.aaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0A00A00A","AAAA" +"00,000",,"aaaa00@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0A00A00A","AAAA" +"00,000","00,000","aaa000@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0A00A00A","AAAAAAAA" +"00,000","00,000","aaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0A00A00A","AAAAAAAA" +"00,000",,"aaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0A00A00A","AAAA" +"00,000",,"aaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0A00A00A","AAAA" +"00,000",,"aaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0A00A00A","AAAA" +"00,000",,"aaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0A00A00A","AAAA" +"00,000",,"aaaaaa000@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0A00A00A","AAAA" +"00,000","000,000","aaaaaaaaaaaa.00@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0A00A00A","AAAAAAAA" +"00,000",,"aaaaaaaa@aaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0A00A00A","AAAA" +"00,000",,"aaaaa@aaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0A00A00A","AAAA" +"00,000",,"aaaaaa000@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0A00A00A","AAAA" +"00,000","000,000","aaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0A00A00A","AAAAAAAA" +"00,000",,"aaaaaaa@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0A00A00A","AAAA" +"00,000",,"aaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0A00A00A","AAAA" +"000,000","00,000","aaaaaaa0@aaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","A000AA0A","AAAAAAAA" +"00,000","000,000","aaaaa_aaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","00000A00","AAAAAAAA" +"000,000",,"AAAAAAAAAAAAA@AAA.AAA",00/00/0000 00:00:00AA,"0,000.00","0000A000","AAAA" +"000,000",,"aaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0000000A","AAAA" +"000,000",,"aaaaa.aa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0000A000","AAAA" +"0,000",,"Aaaaaaaaaa@aaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","00000000","AAAA" +"00,000",,"aaaaaaa@aaaaaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","A0000000","AAAA" +"00,000",,"aaaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","A0000000","AAAA" +"00,000",,"aaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0000A000","AAAA" +"0,000",,"aaaaaaaaaa@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AA0A00A0","AAAA" +"0,000",,"aaaaa.a.aaaaaa@aaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AA0A00A0","AAAA" +"00,000","000,000","aaaaaaa.aaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","A0000000","AAAAAAAA AAA AAAAAAA" +"000,000","00,000","aaaaaaa.aaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0A000A00","AAAAAAAA AAA AAAAAAA" +"000,000","00,000","Aaaaaa0000@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","000A0000","AAAAAAAA" +"000,000","000,000","Aaaaaaa.Aaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0A000A00","AAAAAAAA" +"000,000",,"aaaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","000A0000","AAAA" +"00,000",,"aaaaaaa@aaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","00000000","AAAA" +"0,000",000,"aaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","000AA0AA","AAAAAAAA" +"000,000","000,000","aaaaaaaaaaa@aaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0A000000","AAAAAA AAAA AAAAA" +"000,000","00,000","aaaaaaaaaa@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0A000000","AAAAAA AAAA AAAAA" +"000,000",,"aaaaaaaaa_aaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0A000000","AAAA" +"000,000",000,"a.a.aaaaa00@aaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0A000000","AAAAAAAA" +"000,000",,"aaaaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0A000000","AAAA" +"000,000",,"aaaaaaa@aaaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0A000000","AAAA" +"000,000",,"aaaaaaaaaaaaaa@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0A000000","AAAA" +"000,000",,"aaaa@aaaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AA00A000","AAAA" +"000,000",,"aaaaa.aaaaaa@aaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0A000000","AAAA" +"00,000",,"aaaa0000@aaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AA000000","AAAA" +"00,000",,"aaaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","00000A00","AAAA" +"00,000","00,000","aaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0000000A","AAAAAA AAAA AAAAA" +"00,000","000,000","aaaaaaaaaaa@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","A0000000","AAAAAAAA" +"000,000",,"aaaaaa.aaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0000000A","AAAA" +"000,000","000,000","Aaaa_Aaaaaa@aaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AA0A0AA0","AAAAAAAA" +"00,000","000,000","aaaaaa.a.aaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0A00A00A","AAAAAAAA" +"000,000",,"aaaaaa@aaaaaaaaaaaa.aa",00/00/0000 00:00:00AA,"0,000.00","0A00000A","AAAA" +"000,000","000,000","aaaaaaa@aaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0A00000A","AAAAAA AAAA AAAAA" +"000,000",,"aaaaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0A00AA00","AAAA" +"000,000",,"aaa@aaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0A00000A","AAAA" +"000,000",,"aaaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","A000A000","AAAA" +"00,000",,"aaaaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0A000A00","AAAA" +"000,000",,"aaaaa_aa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0A0A000A","AAAA" +"000,000",,"aaaaaa_a_aaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0A0A000A","AAAA" +"000,000",,"aaaaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0A0A000A","AAAA" +"000,000",,"aaaaaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","000A0AA0","AAAA" +"00,000","000,000","aaaaaaaa@aaaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A000AA00","AAAAAAAA" +"00,000","00,000","aaaaa@aaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AA0A0000","AAAAAAAA" +"000,000",,"Aaaaaaaaaaaa00@Aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0000000A","AAAA" +"00,000",,"Aaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A000A000","AAAA" +"00,000",,"Aaaaa00@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A000A000","AAAA" +"000,000",,"aaaaaaa@aaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A0000000","AAAA" +"000,000",,"aaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A000A00","AAAA" +"0,000",,"aaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0000000A","AAAA" +"00,000",,"aaaaaaaaaaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0000A00A","AAAA" +"00,000",,"aaaaaa.aaaaaa@aaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A000A000","AAAA" +"000,000","000,000","aa0aa@aaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AA000000","AAAAAAAA AAA AAAAAAA" +"000,000",,"aaaaaa_@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0000AA00","AAAA" +"00,000",,"aaaaaa_aaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A000000A","AAAA" +"000,000","00,000","aaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A000A000","AAAAAAAA" +"00,000","000,000","aaaaaaaaaaa00@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A00000A","AAAAAA AAAA AAAAA" +"00,000",,"aaa0000@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0000A000","AAAA" +"00,000","000,000","aaaaaaaaaaaa000@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A00A00A","AAAAAAAA" +"000,000",,"aaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A0AAAA0","AAAA" +"000,000",,"aaaaaaa00@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A0AAAA0","AAAA" +"000,000",,"Aaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A00AA00","AAAA" +"000,000",,"aaaa@aaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A000A0A","AAAA" +"000,000","00,000","aaaaa_aa_aaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A000A0A","AAAAAAAA" +"000,000",,"aaaaaa.a.aaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A00A000","AAAA" +"000,000",,"aaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A00A000","AAAA" +"000,000",,"aaaaa000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A00A000","AAAA" +"000,000",,"aaaaaaa00@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A00A000","AAAA" +"000,000","000,000","aaaaaa000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A00A000","AAAAAAAA" +"000,000",,"aaaa.aaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A00A000","AAAA" +"000,000","000,000","aaaaa000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A00A000","AAAAAAAA" +"000,000","000,000","a.aaaaaaa0@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A00A000","AAAAAAAA" +"00,000","000,000","aaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A00AA0A","AAAAAAAA" +"000,000","000,000","aa000@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A000A00","AAAAAAAA AAA AAAAAAA" +"00,000","00,000","aaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A000A00A","AAAAAAAA" +"000,000",,"aaaaaaa@aaaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A000000A","AAAA" +"000,000","00,000","aaaa@aaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AA000A00","AAAAAAAA AAA AAAAAAA" +"000,000","00,000","aaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A000A000","AAAAAAAA" +"0,000",,"Aaaaaa.aaaaaa@aaaaaaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","00000000","AAAA" +"0,000",,"aaaaaa.aaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","00000000","AAAA" +"00,000",,"aaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0A000000","AAAA" +"00,000","00,000","aaaaaaa.aaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AA00A000","AAAAAAAA" +"000,000",,"aaaaaaa00@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","A000A000","AAAA" +"00,000",,"aaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","000AAA0A","AAAA" +"00,000","00,000","aaaaa.a.aaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A0000A0A","AAAAAAAA" +"00,000",,"aa.aaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A00AA0A","AAAA" +"000,000","000,000","aaaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A0000000","AAAAAAAA" +"000,000",,"aaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A00A000","AAAA" +"000,000",,"aaa.aaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A00A000","AAAA" +"000,000",,"aaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A00A000","AAAA" +"000,000",,"aaaa-aaaaaa@aaaa.aa",00/00/0000 0:00:00AA,"0,000.00","0A00A000","AAAA" +"000,000",,"aaaaaaaaa@aaaaaaaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A00A000","AAAA" +"000,000",,"aaaaaaaaa@aaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A00A000","AAAA" +"000,000","00,000","aaaaa@aaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A00A000","AAAAAAAA" +"000,000",,"aaaaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A00A000","AAAA" +"000,000",,"aaaa.aaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A00A000","AAAA" +"000,000",,"aaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A00A000","AAAA" +"000,000","000,000","aaaaaaa@aaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A00A000","AAAAAAAA" +"00,000",,"aaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A00000A","AAAA" +"00,000","00,000","aaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","00000000","AAAAAAAA AAA AAAAAAA" +"000,000","000,000","aaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A0000A0A","AAAAAA AAAA AAAAA" +"00,000","00,000","aaaaaa0000@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","A000A000","AAAAAAAA" +"000,000",,"aaaaaa@aaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","A0000A0A","AAAA" +"000,000","00,000","aaaaaa@aaaaaaa-aaaaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","A0000A0A","AAAAAAAA" +"000,000",,"aaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","A0000A0A","AAAA" +"000,000",,"aaaaaa00@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","A0000A0A","AAAA" +"000,000",,"aaaaaaa000@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","A0000A0A","AAAA" +"000,000",,"aaaaaaa.aaaaa@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","A0000A0A","AAAA" +"000,000",,"aaaaaaaa000@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","A0000A0A","AAAA" +"000,000",,"0000aaaaaaaa@aaaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","A0000A0A","AAAA" +"000,000",,"Aaaaaaaa.Aaaaaaa@AaaaaaAaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","A0000A0A","AAAA" +"000,000",,"aaa@aaaaaaa-aaaaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","A0000A0A","AAAA" +"000,000",,"aaaaaaaa.aaaaaaa@aaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AA0AA000","AAAA" +"000,000",,"aaaaaaa.aaaaaaa@aaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AA0AA000","AAAA" +"000,000",,"aaaaaaa.aaaaaaaa@aaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AA0AA000","AAAA" +"00,000","000,000","aaaa@aaaaaaaaa.aa",00/00/0000 00:00:00AA,"0,000.00","A000AA00","AAAAAAAA" +"000,000","0,000","aaaaaaaa@aaaaaa.aa",00/00/0000 00:00:00AA,"0,000.00","AA00A000","AAAAAAAA" +"00,000",,"aaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0A00A000","AAAA" +"00,000",,"aaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","A000AA0A","AAAA" +"00,000",,"aaaaaaaaaa@aaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0A000A0A","AAAA" +"00,000",,"Aaaaaaa.Aaaaa@aaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0A000A0A","AAAA" +"00,000",,"aaaaaa@aaaaaaaaa.aa",00/00/0000 00:00:00AA,"0,000.00","0A000A0A","AAAA" +"00,000",,"a.aaaaaaa@aaaaaaaa.aaa.",00/00/0000 00:00:00AA,"0,000.00","0A000A0A","AAAA" +"00,000",,"aaaaaaa.aaaaaaaa@aaaaaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0000000A","AAAA" +"00,000",,"aaaaaaaa@aaaaaaaa-aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","A000AA00","AAAA" +"00,000",,"aaaaaa_aaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0000A000","AAAA" +"00,000",,"aaaaa000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A00A000","AAAA" +"00,000",,"aaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A00A000","AAAA" +"00,000",,"aaaaaa.aaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","000A0A0A","AAAA" +"00,000","00,000","Aaaaaaa@aaaa-aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AA0A00A0","AAAAAAAA" +"00,000","00,000","aaaaa_aaaaa@aaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AA0A00A0","AAAAAAAA" +"000,000",,"aaaaaaaaaaaaaaaaaaaaaaaaaa@aaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","000A000A","AAAA" +"000,000","000,000","aaaaaaaaa0@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A0000A00","AAAAAAAA" +"000,000",,"aaaaaaaaaaaaa00@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A000A000","AAAA" +"000,000",,"aaaaaaaaaaa00@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A000A000","AAAA" +"000,000","000,000","aaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A00A000","AAAAAAAA" +"00,000","00,000","aaaaaaaa_aaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0000000A","AAAAAAAA" +"000,000",,"aaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A000AA00","AAAA" +"000,000",,"aaaaaaaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A000AA00","AAAA" +"000,000","000,000","aaaaaaa0@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A000AA00","AAAAAAAA" +"000,000",,"aaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A000AA00","AAAA" +"00,000","00,000","aaaaaaa@aaaaaaa.aa",00/00/0000 0:00:00AA,"0,000.00","0000A00A","AAAAAAAA AAA AAAAAAA" +"000,000",,"aaaaaaa_0@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","00000A0A","AAAA" +"00,000",,"aaaaaaaa_aaaaaaa@aaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A00AA00","AAAA" +"00,000",,"aaaa_a@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A00AA00","AAAA" +"00,000",,"aaaaaaa00@aaa-aaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A00AA00","AAAA" +"00,000","00,000","aaaaaaaa0@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A00AA00","AAAAAAAA" +"00,000",,"aaaaaaaaaaa@aaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A00AA00","AAAA" +"0,000","0,000","aaaaaaaaaaaaaaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A0000000","AAAAAAAA" +"00,000",,"aa000@aaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0000000A","AAAA" +"00,000","0,000","aaaaaa.aaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","000A0A0A","AAAAAAAA" +"000,000",,"aaaaaaaaaaaaaa@aaaaa.aa",00/00/0000 00:00:00AA,"0,000.00","0A000A00","AAAA" +"000,000",,"aaaa.aaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0A000000","AAAA" +"00,000",,"aaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","A0000000","AAAA" +"00,000","00,000","aaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","A000000A","AAAAAAAA" +"000,000",,"a_aaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A0A00A0","AAAA" +"000,000",,"aaaa.aaaaa@aaaaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A0000000","AAAA" +"00,000",,"Aaaaaa.Aaaa@aa.aaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A000000A","AAAA" +"00,000","00,000","aaaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A000000A","AAAAAAAA" +"00,000","00,000","AAAAAAAAAA@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0000AA00","AAAAAAAA AAA AAAAAAA" +"00,000","00,000","aaaaaaaaaaaaaaaaa@aaaaaaaaa.aa",00/00/0000 0:00:00AA,"0,000.00","A000000A","AAAAAA AAAA AAAAA" +000,"000,000","aaaa.aaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0000A000","AAAAAAAA" +"00,000",,"Aaaaa0000@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AA00AA00","AAAA" +"000,000",,"aaaaaaaaaa@aaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0000AA0A","AAAA" +"000,000",,"aaaaaaaaaa@aaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0000AA0A","AAAA" +"00,000",,"aaaaa0000@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0000000A","AAAA" +"00,000",,"AaaaaaaaaaA@aaaaaaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0000000A","AAAA" +"00,000",,"AAaaaaaaaa@aaaaaaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0000000A","AAAA" +"00,000","00,000","aaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0000000A","AAAAAAAA AAA AAAAAAA" +"00,000","00,000","aaaaaaa_aaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","000AA000","AAAAAAAA" +"0,000","0,000","aaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","A000AA0A","AAAAAAAA AAA AAAAAAA" +"000,000","000,000","aaa.aaaaaaaa.aaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","00000A00","AAAAAAAA" +"00,000",,"Aaaaaaa@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AA00A00A","AAAA" +"00,000",,"aaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0A00A000","AAAA" +"000,000","000,000","AaaaAaaaaa00@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","A0000000","AAAAAAAA" +000,"000,000","aaa0aaaaa0@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AA000000","AAAAAAAA" +"00,000",,"aaaa@aaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","A000AA00","AAAA" +000,,"aaaaaaaaaaaaa00@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AA000000","AAAA" +"000,000",,"aaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0A00000A","AAAA" +"000,000",,"aaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0000000A","AAAA" +"00,000",,"aaaaaaa@aaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","000AA0AA","AAAA" +"000,000",,"Aaaaa.aaaa@aaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0000000A","AAAA" +"000,000",,"aaaaaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0000000A","AAAA" +"00,000",,"aaaaaaaa0000@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0A00A00A","AAAA" +"00,000","00,000","aaaaa.aaaa@aaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","000AAAAA","AAAAAAAA" +"0,000",,"aaaaa00@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","A0000A00","AAAA" +"00,000","00,000","aaaaaaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0A00A00A","AAAAAAAA" +"000,000","00,000","aaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A00A0AAA","AAAAAAAA" +"00,000",,"aaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0000000A","AAAA" +"000,000",,"aaaaaaaa@aaaa.aa",00/00/0000 0:00:00AA,"0,000.00","AA000000","AAAA" +"000,000",,"aaaaa.aaaaa@aaaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","00000A0A","AAAA" +"00,000",,"aaaaa.aaaaaaa@aaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AA000A00","AAAA" +"00,000",,"aaa000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A00000A","AAAA" +"00,000",,"aaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A00000A","AAAA" +"00,000","00,000","aaa0@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A00000A","AAAAAAAA" +"00,000",,"aaaaa000@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A00000A","AAAA" +"00,000",,"aaaaaaa000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A00000A","AAAA" +"00,000",,"aaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A00000A","AAAA" +"00,000",,"aaa000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A00000A","AAAA" +"00,000",,"aaaaaaa@aaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A00000A","AAAA" +"00,000","00,000","aaaaaa_a_aaaaaa@aaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A00000A","AAAAAAAA" +"00,000","000,000","aa.00_aaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A00000A","AAAAAAAA" +"00,000",,"aaaaaaaa@aaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A00000A","AAAA" +"00,000","000,000","aaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A00000A","AAAAAAAA" +"00,000",,"aaaaa.aaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A00000A","AAAA" +"00,000","000,000","aaa000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A00000A","AAAAAAAA" +"000,000","00,000","aaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A00000A","AAAAAAAA" +"000,000","00,000","aaaaaaaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","00000000","AAAAAAAA" +"000,000","00,000","aaaaa00@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0000000A","AAAAAA AAAA AAAAA" +"00,000","000,000","aaaaa0@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0000000A","AAAAAAAA" +"00,000",,"aaaaaaaaa@aaaaaaaaa.aa",00/00/0000 0:00:00AA,"0,000.00","0000000A","AAAA" +"00,000","00,000","aaaaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AA00AA00","AAAAAAAA" +"000,000","000,000","aaaaaaaaaaaaa@aaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0000A00A","AAAAAAAA" +"000,000",,"a00aaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AA000A00","AAAA" +"00,000",,"aaaaaaa@aa.aaaaaaaaa.aa",00/00/0000 00:00:00AA,"0,000.00","A00A000A","AAAA" +"00,000",,"aaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","A00A000A","AAAA" +"000,000","000,000","aaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A000AA00","AAAAAAAA" +"000,000","00,000","aaa_aaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A000AA00","AAAAAAAA" +"000,000","000,000","aaaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A000AA00","AAAAAAAA" +"000,000",,"aaaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A000AA00","AAAA" +"000,000",,"aaa00@aaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A000AA00","AAAA" +"000,000",,"aaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A000AA00","AAAA" +"0,000",,"a.a.aaaaa@aaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","000A0A00","AAAA" +"00,000",,"aaaaaa@aaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","00000A0A","AAAA" +"00,000",,"aaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","000A0A00","AAAA" +"000,000",,"aaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","A0000000","AAAA" +"000,000",,"aaaaaaaaa000000@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","00000000","AAAA" +"00,000","00,000","aaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AA000A00","AAAAAAAA" +"00,000","000,000","aaaaaaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A00AA0A","AAAAAAAA" +"0,000",,"aaaaaaaaa@aaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A000A00A","AAAA" +"000,000",,"aaaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A00A000","AAAA" +"00,000","00,000","aaaaa@aaaaaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A00AAA00","AAAAAAAA AAA AAAAAAA" +"000,000",,"aaaa00@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A00A000","AAAA" +"000,000",,"aaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0A0A0AA0","AAAA" +"00,000","00,000","aaaaaa@aaaaaaaaa.aa",00/00/0000 00:00:00AA,"0,000.00","A000AA00","AAAAAAAA" +"0,000","000,000","aaaaaa.aaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A000A00","AAAAAAAA" +"0,000",,"aaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A000A00","AAAA" +"0,000",,"aaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A000A00","AAAA" +"0,000",,"aaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A000A00","AAAA" +"0,000",,"aaa.aaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A000A00","AAAA" +"0,000",,"aaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A000A00","AAAA" +"0,000",,"aaaaaa00@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A000A00","AAAA" +"0,000",,"aaaaa@aaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A000A00","AAAA" +"0,000",,"aaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A000A00","AAAA" +"0,000",,"aaaaaaa.aaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A000A00","AAAA" +"0,000",,"aaaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A000A00","AAAA" +"0,000",,"aaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A000A00","AAAA" +"0,000",,"aaaaaaaa.a.aaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A000A00","AAAA" +"0,000","000,000","aaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A000A00","AAAAAAAA" +"0,000",,"aaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A000A00","AAAA" +"0,000","000,000","aaaaaa0000@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A000A00","AAAAAAAA" +"00,000",,"aaaa.aaaaaaaaaaaa@a-a-a.aaa",00/00/0000 0:00:00AA,"0,000.00","A000A000","AAAA" +"000,000","00,000","aaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AA000A00","AAAAAAAA" +"000,000","000,000","aaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A00A00A","AAAAAA AAAA AAAAA" +"00,000",,"aaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","A000A000","AAAA" +"000,000","000,000","aaa0000aaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","A000AA00","AAAAAAAA" +"000,000","000,000","aaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AA000A00","AAAAAAAA" +"00,000",,"aaaaaaaa@aaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AA000A00","AAAA" +"000,000",,"aaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0000000A","AAAA" +"00,000",,"aaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A000A000","AAAA" +"00,000",,"aaaa_aaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A000A000","AAAA" +"00,000",,"aaaaaaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A000A000","AAAA" +"00,000",,"aaaaaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A000A000","AAAA" +"00,000",,"aaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A000A000","AAAA" +"00,000",,"aaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A000A000","AAAA" +"00,000",,"aaaa_aaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A000A000","AAAA" +"00,000",,"aaaaaaaaaaa0@aaaaaaa.aa.aa",00/00/0000 0:00:00AA,"0,000.00","A000A000","AAAA" +"00,000",,"aaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A000A000","AAAA" +"000,000",,"aaaaa@aaaaaaaaaa.aa",00/00/0000 0:00:00AA,"0,000.00","A0000000","AAAA" +"00,000",,"aaaaaaaaaaaaaaaa@aaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","000A0000","AAAA" +"00,000",,"aaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","000A0000","AAAA" +"00,000",,"aaaaaaaaa@aa.aaa",00/00/0000 00:00:00AA,"0,000.00","AA000000","AAAA" +"00,000",,"aaaaaaaaaa@aa.aaa",00/00/0000 00:00:00AA,"0,000.00","AA000000","AAAA" +"00,000",,"aaaaaa_aaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AA000000","AAAA" +"00,000",,"aaaaaaaaaaaaa00@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AA000000","AAAA" +"00,000",,"aaaaaaaaaaaa00@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AA000000","AAAA" +"00,000",,"aaaaaa0000@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AA000000","AAAA" +"00,000",,"aaaaaaaaaaaaaaaaaa@aa.aaa",00/00/0000 00:00:00AA,"0,000.00","AA000000","AAAA" +"00,000",,"aa_aaa00@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AA000000","AAAA" +"00,000","00,000","aaaaaa.aaaaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AA000000","AAAAAA AAAA AAAAA" +"00,000",,"aaaa_00@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AA000000","AAAA" +"00,000","00,000","aaaaaa.aaaaaaa@aaaaaaaaa.aa",00/00/0000 00:00:00AA,"0,000.00","AA000000","AAAAAAAA" +"00,000",,"aaaaaa.aaaaaaa@aaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AA000000","AAAA" +"00,000",,"aaaaaaaa000@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AA000000","AAAA" +"00,000",,"aaaaaaa.aaaaaaa@aa.aaa",00/00/0000 00:00:00AA,"0,000.00","AA000000","AAAA" +"00,000","00,000","a.aaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AA000000","AAAAAAAA" +"00,000",,"aaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AA000000","AAAA" +"00,000","00,000","aaaaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AA000000","AAAAAAAA" +"00,000",,"aaaaaaa00@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AA000000","AAAA" +"00,000",,"aaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AA000000","AAAA" +"00,000",,"aaaaaaaaaaa00@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AA000000","AAAA" +"00,000",,"aaaaaaaaa000@aaaaa.aa",00/00/0000 00:00:00AA,"0,000.00","AA000000","AAAA" +"00,000",,"aaaaaa00@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AA000000","AAAA" +"00,000",,"aaaaaa.aaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AA000000","AAAA" +"00,000",,"aaaaaa.aaaaaaa@aaaa.aaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AA000000","AAAA" +"00,000",,"aaa_aaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AA000000","AAAA" +"00,000",,"aaaaaaaaaaaaaa@aa.aaa",00/00/0000 00:00:00AA,"0,000.00","AA000000","AAAA" +"00,000",,"aaaa0000@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AA000000","AAAA" +"00,000",,"aaaaaa0000@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AA000000","AAAA" +"00,000",,"a_aaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AA000000","AAAA" +"00,000",,"aaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AA000000","AAAA" +"00,000",,"aaaaaaaaaa@aa.aaa",00/00/0000 00:00:00AA,"0,000.00","AA000000","AAAA" +"00,000","000,000","aaaaa000@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AA000000","AAAAAAAA" +"00,000",,"aaaaa.aaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AA000000","AAAA" +"00,000",,"aaaaaa000@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AA000000","AAAA" +"00,000",,"aaaaaaaaaaa00@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AA000000","AAAA" +"00,000",,"aaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AA000000","AAAA" +"00,000",,"aaaa_aaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AA000000","AAAA" +"00,000","000,000","aaaa_000@aaaa.aa",00/00/0000 00:00:00AA,"0,000.00","AA000000","AAAAAA AAAA AAAAA" +"00,000",,"aaaaaa000@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AA000000","AAAA" +"00,000",,"aaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AA000000","AAAA" +"00,000",,"aaaaa_aaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AA000000","AAAA" +"00,000",,"aaaaa_000@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AA00A000","AAAA" +"00,000",,"aaaaaaaa_00@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","000AA0A0","AAAA" +"00,000",,"aaaaaaaa0000@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","000AA0A0","AAAA" +"00,000",,"aaaaaaaaaaaa@aaaa.aa",00/00/0000 0:00:00AA,"0,000.00","000AA0A0","AAAA" +"00,000",,"aaaaaaaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","000AA0A0","AAAA" +"00,000",,"aaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","000AA0A0","AAAA" +"0,000","000,000","AAAAAAAA@AAAAAAA.AAA",00/00/0000 0:00:00AA,"0,000.00","0A000A00","AAAAAAAA" +"00,000","00,000","aaa0000@aaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A000A00","AAAAAAAA" +"00,000",,"aaaaaa.aaaaaa@aaaaaaaaa.aa",00/00/0000 0:00:00AA,"0,000.00","0000A000","AAAA" +"000,000",,"aaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A0000000","AAAA" +"00,000",,"aaaaaaa@aaa.aaa.aa",00/00/0000 0:00:00AA,"0,000.00","A000AA00","AAAA" +"00,000",,"aaaaaaa@aaaaa.aaa.aa",00/00/0000 0:00:00AA,"0,000.00","A000AA00","AAAA" +"00,000",,"aaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A000AA00","AAAA" +"00,000",,"aaaaaaaa@aaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A000AA00","AAAA" +"00,000",,"aaaaaaa@aaaaaa.aaa.aa",00/00/0000 0:00:00AA,"0,000.00","A000AA00","AAAA" +"00,000",,"aaaaaaaaaaaa@aaaaaaaaa.aaa.aa",00/00/0000 0:00:00AA,"0,000.00","A000AA00","AAAA" +"00,000",,"aaaaaa.aaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A000AA00","AAAA" +"00,000",,"aaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A000AA00","AAAA" +"00,000",,"aaaaaaaa@aaaaa.aaa.aa",00/00/0000 0:00:00AA,"0,000.00","A000AA00","AAAA" +"00,000",,"aaa.aaaaaaa@aaaaaaaaa.aa",00/00/0000 0:00:00AA,"0,000.00","A000AA00","AAAA" +"00,000",,"aaaa@aaaaa.aaa.aa",00/00/0000 0:00:00AA,"0,000.00","A000AA00","AAAA" +"00,000",,"aaaaaa@aaaaa.aaa.aa",00/00/0000 0:00:00AA,"0,000.00","A000AA00","AAAA" +"00,000",,"aaaaaa@aaaaaaaaa.aaa.aa",00/00/0000 0:00:00AA,"0,000.00","A000AA00","AAAA" +"00,000",,"aaaaaaa0@aaaaa.aaa.aa",00/00/0000 0:00:00AA,"0,000.00","A000AA00","AAAA" +"00,000",,"aaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A000AA00","AAAA" +"00,000",,"aaaaaaaa-aaaaaaaa.aaaaaaaa@aaaa.aaa.aa",00/00/0000 0:00:00AA,"0,000.00","A000AA00","AAAA" +"00,000",,"aaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A000AA00","AAAA" +"00,000",,"aaa@aaaaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A000AA00","AAAA" +"00,000",,"aaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A000AA00","AAAA" +"00,000",,"aaaaaaaaa.aaaaa@aaaaaaaa.aaa.aa",00/00/0000 0:00:00AA,"0,000.00","A000AA00","AAAA" +"00,000",,"aaaaaaaaaaa@aaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A000AA00","AAAA" +"00,000",,"aaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A000AA00","AAAA" +"00,000","000,000","aaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A000AA00","AAAAAAAA" +"00,000",,"aaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A000AA00","AAAA" +"00,000","000,000","aa@aaaaaaaaaaaa.aaa.aa",00/00/0000 0:00:00AA,"0,000.00","A000AA00","AAAAAAAA" +"00,000",,"aaaaa@aaa.aaa.aa",00/00/0000 0:00:00AA,"0,000.00","A000AA00","AAAA" +"00,000",,"aaaaaaaaaaaa@aaaaaaaaaaaaaaaaaaa.aaa.aa",00/00/0000 0:00:00AA,"0,000.00","A000AA00","AAAA" +"00,000",,"aaaaaaaaaaaaaa.aaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A000AA00","AAAA" +"00,000",,"aaaa_aaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A000AA00","AAAA" +"00,000",,"aaaaa.aa@aaaaa.aaa.aa",00/00/0000 0:00:00AA,"0,000.00","A000AA00","AAAA" +"00,000",,"aaaaaaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A000AA00","AAAA" +"00,000",,"aaaaa.aaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A000AA00","AAAA" +"00,000",,"aaaaa@aa.aaa.aa",00/00/0000 0:00:00AA,"0,000.00","A000AA00","AAAA" +"00,000",,"aaaaaaaa@aaaaaaaaa.aaa.aa",00/00/0000 0:00:00AA,"0,000.00","A000AA00","AAAA" +"00,000",,"aaaaaaaaaaa@aaaaa.aaa.aa",00/00/0000 0:00:00AA,"0,000.00","A000AA00","AAAA" +"00,000",,"aaaaaaa.aaaaa@aaaa.aaaa.aa.aa",00/00/0000 0:00:00AA,"0,000.00","A000AA00","AAAA" +"00,000",,"aaa000000@aaaaa.aaa.aa",00/00/0000 0:00:00AA,"0,000.00","A000AA00","AAAA" +"00,000","000,000","aaaaaaaaaa@aaaaa.aaa.aa",00/00/0000 0:00:00AA,"0,000.00","A000AA00","AAAAAAAA" +"00,000",,"aaaaaaa@aaa.aaa.aa",00/00/0000 0:00:00AA,"0,000.00","A000AA00","AAAA" +"00,000",,"aaaaaaaaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A000AA00","AAAA" +"00,000","000,000","aaaaaaaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A000AA00","AAAAAA AAAA AAAAA" +"00,000",,"aaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A000AA00","AAAA" +"00,000",,"aaaa.aaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A000AA00","AAAA" +"000,000",,"aa_aaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AA00000A","AAAA" +"000,000",,"aaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","00000A00","AAAA" +"000,000","0,000","aaaaa.aaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","00000A00","AAAAAAAA" +"000,000",,"aaaaaaaa@aaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A00000A","AAAA" +"000,000","000,000","aaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A000AA00","AAAAAAAA AAA AAAAAAA" +"00,000",,"aaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A0000000","AAAA" +"00,000",,"aaaaaaaaaa@aaaaaaaaa.aa",00/00/0000 0:00:00AA,"0,000.00","0A0AAAA0","AAAA" +"000,000",,"aaaaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","00000A00","AAAA" +"000,000","000,000","aaaaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","A000000A","AAAAAAAA" +0,"00,000","aaaaaaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","A0000A00","AAAAAA AAAA AAAAA" +0,"000,000","aaaaaaa@aaaaa.aa",00/00/0000 00:00:00AA,"0,000.00","A0000A00","AAAAAAAA" +0,"000,000","aaaaaaaaa00@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","A0000A00","AAAAAAAA" +0,"00,000","aaaaaaaaa@aaaaa.aa",00/00/0000 00:00:00AA,"0,000.00","A0000A00","AAAAAAAA" +"00,000",,"aaaa00@aaaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","A000A00A","AAAA" +"000,000","000,000","aaa__aaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0A000A0A","AAAAAAAA" +"00,000","00,000","aaaaaaaaaaa@aaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AA0A0000","AAAAAAAA" +"000,000",,"aaaaaa.aaaaaaaaa@aaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A000000","AAAA" +"00,000","00,000","aaaaaa@aaaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A000000","AAAAAAAA AAA AAAAAAA" +"00,000","000,000","aaaaaaaaa@aaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A0000000","AAAAAAAA" +"000,000","000,000","aaaaaa00@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","00000000","AAAAAAAA" +"000,000",,"aaaa_aaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","000A0000","AAAA" +"000,000",,"aaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0000000A","AAAA" +"000,000",,"aaaaaaaaaaa@aaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0000000A","AAAA" +"000,000",,"aaaaaaaaaaa@aaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A0AA00A","AAAA" +"000,000","000,000","aaa_a_aaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A0AA00A","AAAAAAAA" +"000,000",,"aaaaaa@aaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A0AA00A","AAAA" +"000,000",,"aaaaaa_a_aaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A0AA00A","AAAA" +"000,000",,"a_aaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","000AA000","AAAA" +"000,000","000,000","a.aaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A00AA00","AAAAAAAA" +"000,000","00,000","aaaaaa__aaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A00A000A","AAAAAAAA AAA AAAAAAA" +"000,000",,"aaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AA00000A","AAAA" +"000,000","000,000","aaaaaaa@aaaaaaaaa.aa",00/00/0000 0:00:00AA,"0,000.00","0A00AA0A","AAAAAAAA" +"00,000",,"aaaaaaaa.a@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","00000000","AAAA" +"00,000",,"aaaaaa.aaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A0000A0A","AAAA" +"00,000","0,000","aaa_aaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A0000A0A","AAAAAAAA" +"000,000",,"aaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","00000A0A","AAAA" +"000,000",,"aaaaa000@aaaaaaa.aa",00/00/0000 0:00:00AA,"0,000.00","00000A0A","AAAA" +"00,000",,"aaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AA000A0A","AAAA" +"00,000","00,000","aaaaaa_aaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A0000A00","AAAAAAAA" +"000,000","000,000","aaaaa_aaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0000AA0A","AAAAAA AAAA AAAAA" +"00,000","000,000","aaaaaaaaaaaaaaaaaa@aaaaa.aa",00/00/0000 0:00:00AA,"0,000.00","0A00000A","AAAAAAAA AAA AAAAAAA" +"00,000","000,000","Aaa_aaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0A00000A","AAAAAAAA AAA AAAAAAA" +"000,000",,"aaaaaaaaaaaaaaaaaaaaaaaaaa@aaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","000A000A","AAAA" +"0,000","000,000","aaaaaa@aaaaa.aaaaaaaaa.aa",00/00/0000 00:00:00AA,"0,000.00","A000000A","AAAAAAAA AAA AAAAAAA" +"0,000",,"aaaaaaaa@aaaaa.aaaaaaaaa.aa",00/00/0000 00:00:00AA,"0,000.00","A000000A","AAAA" +"0,000","0,000","aaaaaaaaa@aaaaaaaaa.aa",00/00/0000 00:00:00AA,"0,000.00","000AAAA0","AAAAAAAA" +"0,000",,"AAAA.AAAAAA@AAAA.AAA",00/00/0000 00:00:00AA,"0,000.00","0000000A","AAAA" +"000,000",,"aaaaaaa.aaaa@aaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","A000000A","AAAA" +"00,000",,"aaaaaa00@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","00000A00","AAAA" +"000,000","00,000","aaaaaaa0@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","A0000A0A","AAAAAAAA AAA AAAAAAA" +"00,000","000,000","aaa000@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","A000AA00","AAAAAAAA" +"00,000",,"aaaaaaa_aaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","000A0A0A","AAAA" +"00,000",,"aaaaaaaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","000A0A0A","AAAA" +"00,000",,"aaaaaaaa.aaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","00000000","AAAA" +"000,000","00,000","aaaaaaaaaaaa00@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0000000A","AAAAAAAA AAA AAAAAAA" +"00,000",,"aaa000@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","000A0A0A","AAAA" +"00,000","00,000","aaaaaa.aaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0A000000","AAAAAAAA AAA AAAAAAA" +"000,000",,"aaaa.aaaaaaaaaaa@aaaaaaa.aa",00/00/0000 00:00:00AA,"0,000.00","0A00000A","AAAA" +0,,"aaaaaaaaaaaaaaa@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","00000A0A","AAAA" +"00,000",,"aaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AA000000","AAAA" +"000,000",,"aaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0000AA0A","AAAA" +"00,000","00,000","Aaaaaaaaa_Aaaaaa@AAA.aaa",00/00/0000 00:00:00AA,"0,000.00","A000AA00","AAAAAA AAAA AAAAA" +"00,000",,"aaa@aaaaaaaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","A000AA00","AAAA" +"00,000","000,000","aaaa.aaaaaaa@aaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","A000AA00","AAAAAAAA" +"00,000",,"aaaaaaa@aaaaaaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","A000AA00","AAAA" +"00,000","000,000","aaaaaaa@aaaaaaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","A000AA00","AAAAAAAA" +"000,000","00,000","aaaaaaaaaaa00@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0A00000A","AAAAAAAA" +"000,000",,"aaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A000AA0A","AAAA" +"000,000","00,000","Aaaaaa0aaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A0000000","AAAAAA AAAA AAAAA" +"000,000","000,000","aa_aaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A0000000","AAAAAAAA" +"000,000",,"aaaaaa_00@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A0000000","AAAA" +"000,000",,"aaaaaaaaa_00@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A0000000","AAAA" +"000,000",,"aaaaaa.aaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","000A000A","AAAA" +"00,000",,"aaaaaa.aaaaaaaaa@aaa.aa.aa",00/00/0000 0:00:00AA,"0,000.00","0A00000A","AAAA" +"00,000","00,000","aaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A00000A","AAAAAAAA AAA AAAAAAA" +"000,000","0,000","aaaaaaaaaaa000@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","000A0000","AAAAAAAA" +"000,000",,"aaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0000000A","AAAA" +"0,000",,"aaaaa000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A0A00A0","AAAA" +"0,000","00,000","aaaaaaaaaaaa00@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A0A00A0","AAAAAAAA" +"000,000","000,000","aaaaaaa0@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","000A00AA","AAAAAA AAAA AAAAA" +"000,000","000,000","a.aaaaaaaaa@aaaaa.aa",00/00/0000 0:00:00AA,"0,000.00","0A00000A","AAAAAAAA" +"000,000",,"aaaaaaaaaa_00@aaaaaaa.aa",00/00/0000 0:00:00AA,"0,000.00","0A00000A","AAAA" +"0,000",,"aaaaaa0000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A0000A00","AAAA" +"00,000",,"AaaaaaAaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0000AA00","AAAA" +"00,000",,"aaaaa_aaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0000A00A","AAAA" +"00,000","000,000","aaaaaaaaa@aaa.aa.aaa",00/00/0000 0:00:00AA,"0,000.00","00000A00","AAAAAA AAAA AAAAA" +"000,000",,"aaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0000000A","AAAA" +"000,000",,"aaaaaa00@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0000000A","AAAA" +"000,000","00,000","aaaaaaaaaaaa@aaaaa.aa",00/00/0000 0:00:00AA,"0,000.00","0000000A","AAAAAAAA" +"000,000","00,000","aaaaaaaaaaaaa_aaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A000A000","AAAAAAAA" +"00,000",,"aaaaaa@aaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A000000","AAAA" +"000,000",,"aaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0000000A","AAAA" +"00,000","00,000","Aaaaaa00@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","00000000","AAAAAAAA AAA AAAAAAA" +"00,000",,"aaaaaaa@aaaaaaaaa.aa",00/00/0000 0:00:00AA,"0,000.00","A0000000","AAAA" +"000,000","000,000","aaaaaaaa.aaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A0000000","AAAAAAAA" +"00,000","00,000","aaaaaaa0000@aaaaa.aa",00/00/0000 00:00:00AA,"0,000.00","A000A00A","AAAAAAAA" +"00,000","0,000","aaaaaa0000@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0A00000A","AAAAAAAA" +"00,000","00,000","aaa00@aa.aaaa.aa",00/00/0000 00:00:00AA,"0,000.00","00000000","AAAAAAAA" +"000,000","000,000","aaaaaaaaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A00A00A","AAAAAAAA AAA AAAAAAA" +"0,000",,"aaaaaaaaaA@aaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AA000000","AAAA" +"0,000","000,000","AaaaaaaaaA@aaaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AA000000","AAAAAAAA" +"000,000",,"aaaaaaa000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0000AA0A","AAAA" +"000,000",,"aaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","00000000","AAAA" +"000,000",,"aaaaaaa00@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0000000A","AAAA" +"00,000",,"Aaaaa-Aaaa.Aaaa@AAAaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0A000A00","AAAA" +"00,000","000,000","aaaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0A000A00","AAAAAAAA" +"000,000",,"aaaaaaaa@aa.aaaaaaaaa.aa",00/00/0000 00:00:00AA,"0,000.00","0A000000","AAAA" +"000,000",,"aaaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","00000A00","AAAA" +"000,000",,"aaaaaaaaaa00@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AA000A00","AAAA" +"000,000",,"aaaaaaa00@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AA000A00","AAAA" +"000,000",,"aaaaaaaaaaaaaaa@aaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AA000A00","AAAA" +"000,000",,"aaaaa.aaaaa@aaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AA000A00","AAAA" +"00,000",,"aaaaaaa@aaaaaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","A0000000","AAAA" +"00,000",,"aaaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","A0000000","AAAA" +"000,000","00,000","aaaa.aaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0000AA0A","AAAAAAAA AAA AAAAAAA" +"000,000",,"Aaa.Aaaaaaaaaa@aaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AA000A00","AAAA" +"000,000",,"aaaaaaa0@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0000AA0A","AAAA" +"000,000",,"aaaaa@aaaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0A00A00A","AAAA" +"000,000","000,000","aaaaaaaaa@aa00.aa.aa",00/00/0000 00:00:00AA,"0,000.00","0A00A00A","AAAAAAAA" +"000,000",,"aaaaaaa00@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","A0000A00","AAAA" +"000,000",,"aaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","A0000000","AAAA" +"000,000","00,000","aaaaaaa@aaaaaaaaa.aa",00/00/0000 00:00:00AA,"0,000.00","0A00A00A","AAAAAA AAAA AAAAA" +"00,000","00,000","aaaaaa@aaaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0000000A","AAAAAAAA" +"000,000","000,000","aaaaaaaaa@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","A0000000","AAAAAAAA" +"000,000","000,000","aaa.aaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AA00AA00","AAAAAAAA" +"00,000",,"aaaaaaaaaa@aaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","000A0000","AAAA" +"000,000","00,000","aaaaaaa.aaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","00000000","AAAAAAAA" +"000,000",,"aaaaa@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0A000A00","AAAA" +"00,000",,"aaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0000A00A","AAAA" +"000,000",,"aaaaaaaaa@aaaaaaaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","000A0A00","AAAA" +"000,000","00,000","aaaaaa__aaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A00A000A","AAAAAAAA AAA AAAAAAA" +"00,000",,"aaaaaa000@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","00000A0A","AAAA" +"00,000","000,000","aaaaaaaaaaaa@aaaaaa.aa",00/00/0000 0:00:00AA,"0,000.00","00000A0A","AAAAAAAA" +"000,000",,"aaaa@aaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","00000000","AAAA" +"000,000",,"aaaaaaaaaa@aaaaa.aa",00/00/0000 0:00:00AA,"0,000.00","A000000A","AAAA" +"000,000","00,000","aaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A00AA0A","AAAAAAAA" +"000,000","000,000","aaaaaaa00@aaaaa.aa",00/00/0000 0:00:00AA,"0,000.00","AA00000A","AAAAAAAA" +"000,000",,"aaaaaaaaaaaa@aaaaaaaaa.aa",00/00/0000 0:00:00AA,"0,000.00","AA00000A","AAAA" +"00,000",,"aaaaa_aaa@aaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A000AA00","AAAA" +"000,000","00,000","aaaaa_aaa00@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A000000A","AAAAAAAA AAA AAAAAAA" +"000,000","000,000","aaaaaaa00@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0000000A","AAAAAAAA" +"000,000","00,000","aaaa_aa@aa.aaa",00/00/0000 0:00:00AA,"0,000.00","0000000A","AAAAAAAA" +"000,000",,"aaaaaaaaa@aaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0000000A","AAAA" +"00,000",,"aaaaaa.aaaaaaa@aaa.aa",00/00/0000 0:00:00AA,"0,000.00","0A0A0AA0","AAAA" +"000,000",,"aaaaaaaaaaaaaaaaaaaaaaaaaa@aaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","000A000A","AAAA" +"00,000",,"aaaaaa.aaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0A000A00","AAAA" +"00,000",,"aaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0000000A","AAAA" +"000,000","00,000","aaaaaaa_0@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0A00A000","AAAAAAAA" +"0,000",,"aaaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","000A0AA0","AAAA" +"0,000",,"aaaaaa00@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","000A0AA0","AAAA" +"0,000",,"aaaaaaaa00@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","000A0AA0","AAAA" +"000,000",,"aaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","A000000A","AAAA" +"000,000","0,000","aaaaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","A0000A00","AAAAAAAA" +"000,000",,"aaaaaa0@aaaa.aa",00/00/0000 00:00:00AA,"0,000.00","0A00A000","AAAA" +"000,000",,"aaaaaaaaaaaa_@aaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","A000000A","AAAA" +"000,000",,"aaaaaaaaaaaa_@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","A000000A","AAAA" +"00,000","00,000","aaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AA000000","AAAAAAAA AAA AAAAAAA" +"00,000","000,000","Aaaa0000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0000AA00","AAAAAAAA" +"00,000",,"aaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AA00AA00","AAAA" +"00,000",,"Aaaaaaaaaaaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AA00AA00","AAAA" +"000,000","000,000","aaaaaaaa@aaa.aaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","00000A0A","AAAAAAAA AAA AAAAAAA" +"00,000",,"aaaaaaa@aaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AA00AA00","AAAA" +"000,000","00,000","aaaa.aaaaa@aaaaa.aa",00/00/0000 0:00:00AA,"0,000.00","0A00000A","AAAAAAAA" +"000,000","0,000","aaa.aaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","00000000","AAAAAAAA" +"00,000",,"aaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0A00A000","AAAA" +"00,000","00,000","aaa0000aaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0A000A0A","AAAAAA AAAA AAAAA" +"000,000","00,000","aaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0000AA0A","AAAAAAAA" +"00,000","00,000","aaaaaaa_0@aaaaaaaaa.aa",00/00/0000 00:00:00AA,"0,000.00","A000AA00","AAAAAA AAAA AAAAA" +"000,000","00,000","aaa000@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0000AA0A","AAAAAAAA" +"0,000",,"aaaaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0A000A0A","AAAA" +"00,000",,"Aaaaaa.Aaaaa@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","A000AA0A","AAAA" +"0,000",,"aaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0A000A0A","AAAA" +"000,000","00,000","aaaaaa0a@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","00000000","AAAAAAAA" +"0,000",,"aaaaaaa0000@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0A000A0A","AAAA" +"000,000","000,000","aaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","A000AA0A","AAAAAA AAAA AAAAA" +"00,000","00,000","aaaaaaa.aaaaaaa@aa.aaa",00/00/0000 00:00:00AA,"0,000.00","A00A00A0","AAAAAA AAAA AAAAA" +"000,000","000,000","aaaaa0000@aaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","00000000","AAAAAAAA AAA AAAAAAA" +"000,000",,"aaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0A000000","AAAA" +"000,000","000,000","aaaaa000@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","A0000A00","AAAAAAAA" +"000,000",,"aaaaaaaaaaa0000@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0000A00A","AAAA" +"00,000",,"aaaaa_aaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","A0000A00","AAAA" +"00,000",,"aaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","A0000A00","AAAA" +"000,000",,"aaaaa.aaaaaa@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AA00AA00","AAAA" +"000,000","000,000","aaaaaaa@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AA000A00","AAAAAA AAAA AAAAA" +"000,000","000,000","aaaaaa@aaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0000A000","AAAAAAAA AAA AAAAAAA" +"000,000","000,000","aaaaaaa00@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A000A0A","AAAAAAAA" +"00,000",,"Aaaaaaaa.Aaaaaaaa@aaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A00A000","AAAA" +"000,000","000,000","aaaaa.aaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","000AAA0A","AAAAAAAA" +"0,000",,"aaaaaaaaaa00@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","00000000","AAAA" +"00,000",,"aaaaa@aaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A000AA00","AAAA" +"000,000",,"aaaa@aaaaaaa.aa",00/00/0000 0:00:00AA,"0,000.00","00000A0A","AAAA" +"00,000",,"aaaaaa@aaaaaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0000000A","AAAA" +"00,000",,"aaaaaaaaa@aaaaaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0000000A","AAAA" +"00,000",,"aaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A000A00","AAAA" +"00,000","000,000","aaaa.aaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A000A00","AAAAAAAA AAA AAAAAAA" +"000,000",,"aaaaaaa@aaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A000AA00","AAAA" +"000,000",,"aaaaaaaaa.aaaaa@aaaaaaaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AA000A00","AAAA" +"0,000",,"aaaaaaaaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AA0A00A0","AAAA" +"0,000",,"aaaaaaaa00@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AA0A00A0","AAAA" +"00,000",,"aaaaaaa.aaaaaaaaaa@aaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0000000A","AAAA" +"00,000",,"aaaaa0000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A0000000","AAAA" +"0,000",,"aaaaaaaaaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A000A0A","AAAA" +"00,000",,"aaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A000AA00","AAAA" +"000,000","000,000","aaaaa.aaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A000000","AAAAAAAA" +"00,000",,"aa.aaaaaaaaa@aaaaaa.aa",00/00/0000 0:00:00AA,"0,000.00","A000A000","AAAA" +"000,000",,"aaaa.aa@aaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A000000","AAAA" +"00,000",,"aaaaaaaaaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0000AA00","AAAA" +0,,"aaaaaaaaaaaaaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","00000A0A","AAAA" +"00,000",,"aaaaa.aaaaaa@aaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A000000A","AAAA" +"00,000",,"aaaaaaaaaaaaaaa@aaaaa.aa",00/00/0000 0:00:00AA,"0,000.00","A000000A","AAAA" +"00,000","000,000","aaaaa.aaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A000A00A","AAAAAAAA" +"00,000","000,000","aaaa0000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A000A00A","AAAAAAAA" +"00,000",,"Aaaaaaaa.Aaaaaaa@aaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A000AA00","AAAA" +"00,000","000,000","aaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A000AA00","AAAAAA AAAA AAAAA" +"000,000","000,000","aaaaaaa00@AAA.aaa",00/00/0000 0:00:00AA,"0,000.00","0A000A00","AAAAAA AAAA AAAAA" +"000,000",,"aaa@aaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","00000A00","AAAA" +"000,000",,"aaaaaaaaaaaaaaaaaaa0.0@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","00000A00","AAAA" +"000,000",,"Aaaaaaaaaaaaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","00000A00","AAAA" +"00,000",,"aaaa@aaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A0000000","AAAA" +"000,000",,"aaaaaaa@aaaaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0000000A","AAAA" +"000,000",,"aaaaa000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","00000A0A","AAAA" +"00,000","0,000","aaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A00A000","AAAAAAAA" +"00,000",,"aaaaaaaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A000A00A","AAAA" +"0,000","00,000","aaaaaaaaaa0000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0000A000","AAAAAAAA" +"0,000","000,000","aaaaa00@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0000A000","AAAAAAAA" +"000,000","00,000","aaa@aaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A0000000","AAAAAAAA" +"00,000",,"aaaaaa@aaaaaaa.aa",00/00/0000 0:00:00AA,"0,000.00","A000AA00","AAAA" +"0,000",,"aaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0000A000","AAAA" +"000,000","00,000","aaaaaa00@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0000A00A","AAAAAA AAAA AAAAA" +"00,000",,"aaaaaaaa@aaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A000AA00","AAAA" +"00,000",,"Aaaaaa.Aaaaaa@aaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A0A00AA","AAAA" +"00,000",,"Aaaaaa.Aaaaaaaaa@aaaaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A0A00AA","AAAA" +"00,000",,"aaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A00AA00","AAAA" +"00,000",,"aaaa_0000@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A00AA00","AAAA" +"000,000",,"aaaaaaaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A0A00AA","AAAA" +"000,000",,"aaaaaaaa@aaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A0A00AA","AAAA" +"00,000","0,000","aaaaa.aaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A00A000","AAAAAAAA AAA AAAAAAA" +"00,000","00,000","aaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A00A000","AAAAAA AAAA AAAAA" +"000,000","000,000","aaaaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","00000A00","AAAAAA AAAA AAAAA" +"00,000",,"aaaaa.aaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AA000000","AAAA" +"00,000",,"aaaaaa000@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AA000000","AAAA" +"00,000",,"aaaaaaaaaaa00@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AA000000","AAAA" +"00,000",,"aaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AA000000","AAAA" +"00,000",,"aaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AA000000","AAAA" +"00,000","000,000","aaaa_000@aaaa.aa",00/00/0000 00:00:00AA,"0,000.00","AA000000","AAAAAA AAAA AAAAA" +"00,000",,"aaaaaa000@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AA000000","AAAA" +"00,000",,"aaaaa_aaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AA000000","AAAA" +"00,000",,"aaaaaaa.aaaaaaa@aa.aaa",00/00/0000 00:00:00AA,"0,000.00","AA000000","AAAA" +"00,000",,"aaaaaa.aaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AA000000","AAAA" +"00,000",,"aaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AA000000","AAAA" +"00,000",,"aaaaaaa00@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AA000000","AAAA" +"00,000",,"aaaaaaaaaaa00@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AA000000","AAAA" +"00,000",,"aaaaaaaaa000@aaaaa.aa",00/00/0000 00:00:00AA,"0,000.00","AA000000","AAAA" +"00,000",,"aaaaaa00@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AA000000","AAAA" +"00,000",,"aaaaaa.aaaaaaa@aaaa.aaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AA000000","AAAA" +"00,000",,"aaa_aaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AA000000","AAAA" +"00,000",,"aaaaaaaaaaaaaa@aa.aaa",00/00/0000 0:00:00AA,"0,000.00","AA000000","AAAA" +"00,000",,"aaaa0000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AA000000","AAAA" +"00,000",,"aaaaaa0000@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AA000000","AAAA" +"00,000",,"a_aaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AA000000","AAAA" +"00,000",,"aaaaaaaaaa@aa.aaa",00/00/0000 0:00:00AA,"0,000.00","AA000000","AAAA" +"00,000","000,000","aaaaa000@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AA000000","AAAAAAAA" +"00,000",,"aaaaaaaaa@aa.aaa",00/00/0000 0:00:00AA,"0,000.00","AA000000","AAAA" +"00,000",,"aaaaaaaaaa@aa.aaa",00/00/0000 0:00:00AA,"0,000.00","AA000000","AAAA" +"00,000",,"aaaaaa_aaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AA000000","AAAA" +"00,000",,"aaaaaaaaaaaaa00@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AA000000","AAAA" +"00,000",,"aaaaaaaaaaaa00@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AA000000","AAAA" +"00,000",,"aaaaaa0000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AA000000","AAAA" +"00,000",,"aaaaaaaaaaaaaaaaaa@aa.aaa",00/00/0000 0:00:00AA,"0,000.00","AA000000","AAAA" +"00,000",,"aa_aaa00@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AA000000","AAAA" +"00,000","00,000","aaaaaa.aaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AA000000","AAAAAA AAAA AAAAA" +"00,000",,"aaaa_00@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AA000000","AAAA" +"00,000",,"aaaaaa.aaaaaaa@aaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AA000000","AAAA" +"00,000",,"aaaaaaaa000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AA000000","AAAA" +"000,000",,"aaaaaa.aaaaaaa@aaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A0000000","AAAA" +"000,000",,"aaaa_aaaaa@aaaaaaa.aa",00/00/0000 0:00:00AA,"0,000.00","0A00A000","AAAA" +"000,000",,"aaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A00AA00","AAAA" +"000,000",,"aaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A00AA00","AAAA" +"000,000",,"aaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A00AA00","AAAA" +"0,000","00,000","aaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","000AAAA0","AAAAAAAA" +"0,000","000,000","aaaaaaaaa@aaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","000AAAA0","AAAAAAAA" +"00,000","000,000","aaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A000000","AAAAAAAA AAA AAAAAAA" +"0,000",,"aaaaaa@aaaaaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","000AAAA0","AAAA" +"00,000",,"aaa.aaa-aaaaa@aaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A0000000","AAAA" +"00,000",,"aaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","00000A00","AAAA" +"00,000",,"aaaa.aaaaaaaa@aaaaaaa.aa",00/00/0000 0:00:00AA,"0,000.00","0A00A000","AAAA" +"000,000",,"aaaaaaaaaa@aaaaaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A0000000","AAAA" +"0,000","000,000","AAaaaaaaa@AAAAAAA.AA",00/00/0000 0:00:00AA,"0,000.00","000AAAA0","AAAAAAAA" +"00,000","00,000","aaaaaaa_aaaaa00@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A000A00","AAAAAAAA" +"00,000","000,000","aaaaaaa_aaaaa@aaaaa.aa",00/00/0000 0:00:00AA,"0,000.00","0A000A00","AAAAAAAA" +"0,000",,"aaaaaaaa@aaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","000AAAA0","AAAA" +"00,000","000,000","AAAAAAA@AAAA.AAA",00/00/0000 00:00:00AA,"0,000.00","0000A00A","AAAAAAAA" +"00,000",,"aaaaaaaaaa.aaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0A00A000","AAAA" +"000,000","000,000","aaaaaa.aaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0000000A","AAAAAAAA" +"000,000","000,000","aaaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0A000000","AAAAAAAA" +"000,000",,"aaaaaa0000@aaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0A000000","AAAA" +"000,000",,"aaaaa00@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0A0AA0AA","AAAA" +"00,000","000,000","AAAAAAAA0@AAA.AAA",00/00/0000 00:00:00AA,"0,000.00","0000A00A","AAAAAAAA" +"00,000",,"AAAAAAAA.AAAAAAA@aaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0000000A","AAAA" +"000,000","000,000","aaaaaa0@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0000000A","AAAAAAAA" +"000,000",,"aaaaaaaa0000@aaaaa.aa",00/00/0000 00:00:00AA,"0,000.00","AA00A000","AAAA" +"000,000",,"aaaaa_aaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AA00A000","AAAA" +"00,000","00,000","aaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AA000000","AAAAAAAA" +"0,000","000,000","aaaa@aaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0000AA0A","AAAAAAAA" +"0,000",,"aaaaaaaaaaaaaaaa@aaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0000AA0A","AAAA" +"0,000","0,000","aaaaaa.aaaaaa@aaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0000AA0A","AAAAAAAA" +"00,000","000,000","aaaa.aaa@aaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A00000A","AAAAAAAA" +"00,000",,"aaa_aaa_aaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A00000A","AAAA" +"000,000","000,000","aaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A000A0A","AAAAAA AAAA AAAAA" +"000,000",,"aaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A000AA0A","AAAA" +"000,000",,"aaaaaaa000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A000AA0A","AAAA" +"00,000","000,000","aaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A000A00A","AAAAAAAA" +"000,000",,"aaaaa00@aaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AA000A00","AAAA" +"0,000","00,000","aaaaaaaaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A000A00A","AAAAAAAA" +"00,000",,"aaaaaa_aaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","00000A0A","AAAA" +"00,000",,"aaaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","A0000A00","AAAA" +"000,000",,"aaaaaaa_aa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0000000A","AAAA" +"000,000",,"aaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0000000A","AAAA" +"000,000",,"aaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0000000A","AAAA" +"000,000",,"aaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0000000A","AAAA" +"00,000","00,000","aaaaaaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","00000A00","AAAAAAAA" +"000,000","00,000","aaaaaaa000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","00000A00","AAAAAAAA" +"000,000",,"aaaaaa_aaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A000A000","AAAA" +"00,000",,"aaaaaaaa0@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","00000000","AAAA" +"00,000","000,000","Aaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","00000000","AAAAAAAA" +"00,000",,"aa00@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","00000A00","AAAA" +"000,000",,"aaa0000@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A000A000","AAAA" +"0,000",,"aaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AA000000","AAAA" +"000,000",,"aaaaa0000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A00000A","AAAA" +"000,000","000,000","aaaaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0000AA00","AAAAAAAA" +"000,000",,"aaaaaa000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","00000000","AAAA" +"00,000",,"aaaaaaaaa_000@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","00000000","AAAA" +"00,000",,"aaaaaaa_aaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","00000000","AAAA" +"00,000",,"a.a.aaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","00000000","AAAA" +"00,000",,"aa_aaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","00000000","AAAA" +"00,000",,"aaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","00000000","AAAA" +"00,000","00,000","aaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A000A000","AAAAAA AAAA AAAAA" +"00,000",,"aaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A00000A","AAAA" +"00,000",,"aaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A00000A","AAAA" +"000,000",,"aaaaa.aaaaaaa@aaaaaaaa.aa",00/00/0000 0:00:00AA,"0,000.00","0000AA00","AAAA" +"000,000",,"aaaaaaaa00@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0000A000","AAAA" +"00,000",,"aaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","0000000A","AAAA" +"00,000",,"aaaa00@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AA00A000","AAAA" +"00,000",,"aaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","A000AA0A","AAAA" +"000,000","00,000","aaaaaaa0000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AA00A000","AAAAAAAA" +"000,000","000,000","aaaa_aaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","0A000000","AAAAAAAA" +"00,000",,"aaaaaaaa@aaaaaa.aa",00/00/0000 0:00:00AA,"0,000.00","A0000A00","AAAA" +"00,000","000,000","aaaaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A000A00A","AAAAAA AAAA AAAAA" +"00,000",,"aaaaaaa@aaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A000A000","AAAA" +"00,000",,"aaaaaaaa@aaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000A000","AAAA" +"00,000","000,000","aaaaaaaaa000_@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000000","AAAAAAAA" +"000,000",,"aaaaaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000A0A","AAAA" +"00,000",,"aaaaa_aaaaa00@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA00","AAAA" +"00,000",,"aaaaaaa.aaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000000A","AAAA" +"00,000",,"aaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000000A","AAAA" +"00,000",,"aaaaaaa0000@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000000A","AAAA" +"00,000",,"Aaaa0000@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000000A","AAAA" +"00,000",,"aaa0000@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000000A","AAAA" +"00,000","000,000","aaa000000@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000000A","AAAAAAAA" +"00,000",,"aaaa.00@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000","00,000","aaaaa__@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000000","AAAAAAAA" +"000,000",,"aaaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA00AA00","AAAA" +"000,000",,"aaaaa_@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000000A","AAAA" +"000,000",,"aaaaaaaaaaa@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A000A00","AAAA" +"00,000","000,000","AaaaAaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA000A000A","AAAAAAAA" +"000,000",,"aaaaaa00@aaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000A00A","AAAA" +"000,000",,"Aaaaa00@aaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000A00A","AAAA" +"000,000",,"aaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000A000","AAAA" +"0,000","000,000","AAAA0000@AAAAA.AAA",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAAAAAA" +"000,000",,"aaaaa_aaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA00","AAAA" +"000,000",,"aaaaaa0000@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000A000","AAAA" +"000,000","0,000","aaaaa_aaaaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000A00A","AAAAAAAA" +"00,000","00,000","aaaa.aaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAAAAAA" +"00,000","000,000","aaaaaaa@aaaaaa.aa",00/00/0000 0:00:00AA,"0,000.00","AAAA000000A","AAAAAAAA" +"00,000",,"aaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000000A","AAAA" +"00,000",,"aaaaaaaaaaaaa@aaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000000","AAAA" +"00,000",,"aaaaaaaa.aaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000000","AAAA" +"00,000",,"aaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA0A","AAAA" +"00,000",,"AaaaaaAaaa0@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000000","AAAA" +"00,000",,"AAAAAAAAAA@AAAAAAA.AAA",00/00/0000 0:00:00AA,"0,000.00","AAA0A000000","AAAA" +"00,000",,"aaaaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000000","AAAA" +"00,000",,"aaaaaaaa00@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"00,000",,"aaaaa0aaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"00,000",,"aaaaaa.aaaaaa@aa.aaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000A00","AAAA" +"000,000",,"aaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000A00","AAAA" +"000,000","00,000","aaaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000AA00","AAAAAA AAAA AAAAA" +"00,000",,"aaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000A0A","AAAA" +"000,000",,"aaa00@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA00000A","AAAA" +"000,000",,"aaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000A0A","AAAA" +"000,000",,"aaaaaaa_aaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000AA00","AAAA" +"000,000",,"aaaaa00@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000A00","AAAA" +"000,000",,"Aa_0000@aaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"00,000",,"aaaaaa_aaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA00A0A00","AAAA" +"00,000","00,000","Aaaaaaaaaa00@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000000","AAAAAAAA" +"00,000",,"aaaaaa_aaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000AAA00","AAAA" +"00,000",,"a_aaaaaaaaaa00@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000AAA00","AAAA" +"000,000","000,000","aaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000AA0A","AAAAAAAA" +"000,000","000,000","aaaaaaaa@aaaaaaaaa.aa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000A0A","AAAAAAAA" +"000,000",,"aaaaaa_aaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000A0A","AAAA" +"000,000","00,000","aaaaaaaa00@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000A00A","AAAAAAAA" +"000,000",,"aaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000A00A","AAAA" +"000,000",,"aaaaaaaaaaa000@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000A00A","AAAA" +"000,000",,"aaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000A00A","AAAA" +"000,000",,"aaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000A00A","AAAA" +"000,000",,"aaaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000A00A","AAAA" +"000,000","000,000","aaaaa_0000@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000A0A","AAAAAAAA" +"000,000","00,000","aaaaa_aaa00@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000A0A","AAAAAAAA" +"000,000",,"aa_aaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000A0A","AAAA" +"000,000",,"aaaaa@aaaaaaaaa.aa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000A0A","AAAA" +"000,000",,"aaaaaaaaaaaa@aaaaaaaaa.aa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000A0A","AAAA" +"000,000",,"aaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000A0A","AAAA" +"000,000",,"aaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000A0A","AAAA" +"000,000","000,000","aaaaaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000A00A","AAAAAAAA AAA AAAAAAA" +"000,000",,"aaaaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000A0A","AAAA" +"00,000",,"aaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAA" +"00,000",,"aaaaaaa_aa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000A0AAA","AAAA" +"000,000",,"aaaaaaa.aaaaaaa@aaa.aaa.aa",00/00/0000 00:00:00AA,"0,000.00","AAA0000AA0A","AAAA" +"000,000",,"aaaaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000AA0A","AAAA" +"000,000",,"aaaaaa.aaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000AA0A","AAAA" +"000,000",,"aaaaaaa.aaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000AA0A","AAAA" +"000,000",,"aaaaa@aa.aa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000AA0A","AAAA" +"000,000",,"aaaaaaaaa.aaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000AA0A","AAAA" +"000,000",,"aaaa00@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000AA0A","AAAA" +"000,000",,"aaaaaaaaa@aaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000AA0A","AAAA" +"000,000",,"aaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000AA0A","AAAA" +"000,000",,"aaaaa.aaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000AA0A","AAAA" +"000,000",,"aaaaaaaa@aaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000AA0A","AAAA" +"000,000",,"aaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000AA0A","AAAA" +"000,000",,"aaaa0@aa.aa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000AA0A","AAAA" +"000,000",,"aaaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000AA0A","AAAA" +"000,000",,"aaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000AA0A","AAAA" +"000,000",,"Aaaaa_a_aaaaaa@aa.aa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000AA0A","AAAA" +"000,000",,"aaaaaaaaaa@aaaaa.aa.aa",00/00/0000 00:00:00AA,"0,000.00","AAA0000AA0A","AAAA" +"00,000","00,000","aaaaa.aaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000A000","AAAAAAAA" +"000,000","00,000","aaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000AA0A","AAAAAAAA" +"000,000",,"aaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000AA0A","AAAA" +"000,000",,"aaaaaa@aaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000AA0A","AAAA" +"000,000","0,000","aaaaaaa@aaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000AA0A","AAAAAAAA" +"000,000",,"aaaa@aaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000AA0A","AAAA" +"000,000",,"aaaaaaaaa.a.aaaaaaa@aa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000AA0A","AAAA" +"000,000",,"aaaaaaaa000@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000AA0A","AAAA" +"000,000",,"aaaaaaaa@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000AA0A","AAAA" +"000,000","00,000","aaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000AA0A","AAAAAAAA" +"000,000","000,000","aaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000AA0A","AAAAAAAA AAA AAAAAAA" +"000,000",,"aaaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000AA0A","AAAA" +"000,000",,"aaaaa@aaaaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000AA0A","AAAA" +"000,000",,"aaaaaaaa.aaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000AA0A","AAAA" +"000,000","00,000","aaaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000AA0A","AAAAAAAA" +"000,000",,"aaaaaaaaa0@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000AA0A","AAAA" +"0,000",,"aaaaaa.aaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000A00A","AAAA" +"00,000",,"aaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A0AAA00","AAAA" +"000,000","000,000","aaaaaaa000000@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A0AA000","AAAAAAAA" +"000,000","00,000","aaaaaaaaaaaa00@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAAAAAA AAA AAAAAAA" +"00,000","00,000","AAaaaaa@aaaaaaaaaa.aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA00","AAAAAAAA" +"000,000","00,000","aaaaaaaaaaa@aaaa.aa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAAAAAA" +"00,000",,"aaaaaaa000@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000AA00","AAAA" +"00,000",,"aaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000AA00","AAAA" +"00,000",,"aaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000AA00","AAAA" +"00,000","000,000","aaa-aaa@aaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000AA00","AAAAAAAA AAA AAAAAAA" +"00,000","000,000","aaaaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000AA00","AAAAAAAA" +"00,000",,"aaaa.aaaa@aa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000A000A","AAAA" +"0,000","000,000","aaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000A00A","AAAAAAAA" +"00,000",,"aaaaaaaaaaaaaaaaaaaaa00@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000AA0A0","AAAA" +"000,000",,"aaaaaaa.a.aaaaa@aaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAA" +"00,000","00,000","aaaaaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA00000A","AAAAAAAA" +"00,000","000,000","aaaaaaaaaaa00@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000A000","AAAAAAAA" +"00,000","00,000","aaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00AA0A","AAAAAAAA AAA AAAAAAA" +"00,000",,"aaa00@aaaaaaa.aaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00AA0A","AAAA" +"00,000",,"aaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00AA0A","AAAA" +"000,000",,"aaaaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00A00A","AAAA" +"000,000",,"aaaaa00@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA00000A","AAAA" +"0,000",,"aaaaaa.00@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000A00","AAAA" +"000,000","00,000","aaaaaaaaaaa00@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000A0A00","AAAAAAAA" +"000,000",,"aaaaaaaa@aaaaa.aa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAA" +"00,000","000,000","AAAAAAAA@AAAAAAAAA.AA",00/00/0000 0:00:00AA,"0,000.00","AAA0A00A000","AAAAAAAA AAA AAAAAAA" +"00,000",,"aaaaaaaaa0000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000A00","AAAA" +"00,000",,"aaaaaa@aaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000A00A0","AAAA" +"00,000",,"aaaaaaaa@aaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000A00A0","AAAA" +"00,000",,"aaaaaaaa.a.aaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000A00","AAAA" +"0,000","00,000","aaaaaa00@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000000A","AAAAAAAA" +"000,000",,"aaaaaaaaaaaaa@aaaaa.aa",00/00/0000 00:00:00AA,"0,000.00","AAA0A000A00","AAAA" +"000,000",,"aaaaa00@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A000A00","AAAA" +"00,000",,"aaaaaa@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A0A000A","AAAA" +"00,000",,"Aaaa0000@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000000","AAAA" +"00,000",,"a0aaaa_aaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000000","AAAA" +"000,000",,"aaaaaaaaa00@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000A00","AAAA" +"00,000",,"aaaaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA00AAA00","AAAA" +"00,000","000,000","aaaaaaaa00@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000A00","AAAAAAAA" +"0,000","000,000","aaaaaaa00@aaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA000AA000","AAAAAAAA" +"00,000",,"aaaaaaaa@aaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA000000","AAAA" +"00,000",,"aaaaaaaa@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA000000","AAAA" +"00,000",,"aaaaaaaa@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA000000","AAAA" +"000,000",,"aaaaaaaaa@aaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A000000","AAAA" +"00,000","000,000","aaaaaaaaa.aaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000AA00","AAAAAAAA" +"00,000",,"aaaaa.aaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000A000","AAAA" +"00,000",,"aaaaaaa.a@aaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000A00","AAAA" +"000,000",,"aaaaaaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000A00","AAAA" +"000,000",,"aaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000A00","AAAA" +"000,000","000,000","aaaaaa@aaaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00AA00","AAAAAAAA AAA AAAAAAA" +"00,000","00,000","aaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAAAAAA" +"000,000",,"aaaaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000A000","AAAA" +"000,000",,"aaaaaaaa00@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000","000,000","aaaaaaaa@aaaa.aa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000000","AAAAAAAA AAA AAAAAAA" +"000,000",,"aaaaaaaaaa@aaaa.aa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000000","AAAA" +"000,000",,"aaaaaa.aaaaaaa@aaaa.aa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000000","AAAA" +"000,000","00,000","aaaa.aaaaaa@aaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000000","AAAAAAAA" +"000,000",,"aaaaaaa@aaaa.aa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000000","AAAA" +"000,000",,"aaaaaaaa0@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000000","AAAA" +"000,000","000,000","aaaaaaa@aaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000000","AAAAAAAA" +"000,000",,"aaaaa.aaaaa@aaaaaaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000000","AAAA" +"000,000",,"aaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000000","AAAA" +"000,000","00,000","aaaaaaaa.aaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000000","AAAAAA AAAA AAAAA" +000,,"aaaaaa.aaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA0A","AAAA" +000,,"aaaaaaaaaa0@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA0A","AAAA" +000,,"aaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA0A","AAAA" +000,,"aaaaaaa000000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA0A","AAAA" +000,"00,000","aaaaaaaaaa00@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA0A","AAAAAAAA" +000,"00,000","aaaaaaa_@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA0A","AAAAAAAA" +000,,"aaaaa.aaaaa@aaaaaaaaaaaaa.aaaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA0A","AAAA" +000,,"aaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA0A","AAAA" +000,"000,000","aaaaaaaa.aa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA0A","AAAAAAAA" +000,"000,000","aaaaaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA0A","AAAAAAAA" +000,,"aaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA0A","AAAA" +000,"000,000","aaaaaaaaaaa0000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA0A","AAAAAA AAAA AAAAA" +000,,"aaaaa.aaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA0A","AAAA" +000,"00,000","aaaaaaaaaa___@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA0A","AAAAAA AAAA AAAAA" +000,"00,000","aaaaaaaaaaa@aaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA0A","AAAAAAAA" +000,,"aaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA0A","AAAA" +000,,"aaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA0A","AAAA" +000,,"aaaaaaaa000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA0A","AAAA" +000,,"aaaaaaaa00@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA0A","AAAA" +000,,"0aaaaaaaa0@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA0A","AAAA" +000,"00,000","aaaaaaaa_aaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA0A","AAAAAAAA" +000,,"aaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA0A","AAAA" +000,"000,000","aaaaaaaaaa@aaaaa.aaa.aa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA0A","AAAAAA AAAA AAAAA" +000,"00,000","aaaaa.aaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA0A","AAAAAAAA" +000,,"a0aaaa@aaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA0A","AAAA" +000,"000,000","aaaaaa000@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA0A","AAAAAAAA" +000,,"aaaaaaaaaaa_00@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA0A","AAAA" +000,"000,000","aaaa.aa.00@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA0A","AAAAAA AAAA AAAAA" +000,,"aaaaaaaaaaa000@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA0A","AAAA" +000,,"aaaaaaaa00@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA0A","AAAA" +000,,"aaaaa.aaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA0A","AAAA" +000,,"aaaaaaaa000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA0A","AAAA" +000,,"aaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA0A","AAAA" +000,"00,000","aaaaaaaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA0A","AAAAAAAA" +000,,"aaaaaaaaaaa00@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA0A","AAAA" +000,,"aaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA0A","AAAA" +000,,"aaaaa_aaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA0A","AAAA" +000,,"Aaaaaaaaa0@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA0A","AAAA" +000,,"aaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA0A","AAAA" +000,,"Aaaaaaaaa000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA0A","AAAA" +000,,"aaaaaaaaaaaaaaaaa_aa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA0A","AAAA" +000,"00,000","aaaaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA0A","AAAAAAAA" +000,,"aaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA0A","AAAA" +000,,"aaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA0A","AAAA" +000,,"aaaaaaaaaaaaa00@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA0A","AAAA" +000,,"aaaaa_aa0aaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA0A","AAAA" +000,"000,000","aaaa00@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA0A","AAAAAAAA AAA AAAAAAA" +000,,"aaaaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA0A","AAAA" +000,,"aaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA0A","AAAA" +000,,"a00aaaaaa0@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA0A","AAAA" +000,,"aaaaa_00000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA0A","AAAA" +000,,"aaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA0A","AAAA" +000,"00,000","aaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA0A","AAAAAAAA" +"000,000",,"aaaaaaaa00@aaaaa.aaa.aa",00/00/0000 0:00:00AA,"0,000.00","AAA0000AA00","AAAA" +"000,000","0,000","Aaaa.aaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000A000","AAAAAAAA" +"000,000","000,000","aaaaaaaa@aaaaaaaaa.aa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00AA00","AAAAAA AAAA AAAAA" +"00,000","000,000","aaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA00000A","AAAAAAAA" +"00,000",,"aaa_aaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA00000A","AAAA" +"00,000",,"aaaaa.aaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA00000A","AAAA" +"000,000","00,000","aaaaaa@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00AA00","AAAAAAAA" +"000,000",,"aaaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000A00","AAAA" +"00,000",,"aaaa.aaaaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000AA0A","AAAA" +"00,000",,"aaaaaaa.aaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000A00","AAAA" +"00,000",,"aaaaaa@aaaaaaaaaa.aa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000000","AAAA" +"00,000",,"Aaaa.Aaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000A000","AAAA" +"00,000",,"aaaaaa@aaaaaaaaaa.aa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"00,000",,"aaaa@a0.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00A000","AAAA" +"00,000","000,000","aaaaa@aaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00A000","AAAAAAAA" +"00,000",,"aaa.aaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000A0A","AAAA" +"00,000",,"aaaaaa@aaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00A000","AAAA" +"00,000",,"aaaaaaaa@aaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00A000","AAAA" +"000,000","000,000","aaaaaaaaa@aaaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00000A","AAAAAA AAAA AAAAA" +"00,000",,"aaaaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000AA00","AAAA" +"00,000","000,000","aaaaaa@aaaaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000000A","AAAAAAAA AAA AAAAAAA" +"00,000","00,000","aaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00A000","AAAAAAAA" +"000,000","000,000","aaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000000","AAAAAAAA AAA AAAAAAA" +"00,000",,"aaaaaaaaaaaaa@aaaaaaaaa.aa",00/00/0000 0:00:00AA,"0,000.00","AAA0000A000","AAAA" +"00,000",,"aaaaaa@a-aaaaa.aa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00A000","AAAA" +"000,000","000,000","aaaaaaaaaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA00A0A0A","AAAAAAAA" +"000,000","0,000","aaaaaaaa.000@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA00A0A0A","AAAAAAAA" +"00,000",,"aaaaaaaa@aaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000A0A","AAAA" +"000,000",,"aaaaaa000@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaa000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000A000","AAAA" +"000,000","00,000","aaaaaa.aaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000A0A","AAAAAAAA AAA AAAAAAA" +"000,000",,"aaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000A00","AAAA" +"00,000","00,000","aaaaaaa@aaaaaaaaa.aa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA00","AAAAAAAA" +"00,000","00,000","aaaaaaaa@aaaaaaaaa.aa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA00","AAAAAAAA" +"000,000","0,000","aaaaaa.aa.aaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000000","AAAAAAAA" +"00,000","00,000","aaa.aaaaaaa@aaa.aaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA00","AAAAAA AAAA AAAAA" +"00,000","00,000","aaaaaaa000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000AA00","AAAAAAAA" +"000,000",,"aaa0000@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000A0A","AAAA" +"000,000",,"aaaa_aaaaaaaa@aa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000A00","AAAA" +"000,000","000,000","aaaaaaaa_aaaaaa@aa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000A00","AAAAAAAA" +"000,000","00,000","a_aaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000A00","AAAAAAAA" +"00,000",,"aaaaaa.aaaaa@aaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA00A000A","AAAA" +"000,000","000,000","aaaaaa_aaaaaaaa@aa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000A00","AAAAAAAA" +"000,000",,"aaaaaaa_aaaaaaaa@aa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000A00","AAAA" +"000,000",,"aaaaa.aaaaaa@aa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000A00","AAAA" +"000,000",,"aaaa_aaaa@aa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000A00","AAAA" +"00,000",,"aaaaaaaaa@aaaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA00","AAAA" +"00,000","00,000","aaaaaaaaa@aaaaaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA00","AAAAAAAA" +"00,000",,"aaaaaaaaaa@aaaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA00","AAAA" +"00,000",,"aaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000000","AAAA" +"00,000","000,000","aaaaaaaaa@aaaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA00","AAAAAA AAAA AAAAA" +"00,000",,"aaaaaa@aaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"00,000",,"aaaaa000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000000","AAAA" +"00,000",,"aaaaaaaaa0000@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000000","AAAA" +"00,000",,"aaaa000@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000000","AAAA" +"000,000",,"aaaaaaa00@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA00000A","AAAA" +"000,000","000,000","aaaaaaa00@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000A00A","AAAAAA AAAA AAAAA" +"000,000",,"aaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000A00A","AAAA" +"000,000",,"aaaaa0@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000A00A","AAAA" +"000,000","00,000","aaaaa0@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A0A0AA0","AAAAAAAA" +"00,000","000,000","aaaaaaa@aaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00A000","AAAAAAAA" +"000,000","000,000","aaa@aaaaaaaaaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA00A00A","AAAAAAAA" +"00,000",,"AAAAAAAAAAAAAA@AAAAA.AAA",00/00/0000 0:00:00AA,"0,000.00","AAA0A000000","AAAA" +"000,000",,"aaaaaaaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA00A00A","AAAA" +"000,000","00,000","aaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA00A000A","AAAAAAAA" +"00,000","00,000","aaaaa000@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000000","AAAAAAAA AAA AAAAAAA" +"00,000","00,000","aaaaaaaa@aaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000AA00","AAAAAAAA AAA AAAAAAA" +"00,000","00,000","aaaaaaaa.aaaaaaaaaa@aaaaaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA0AA0A0","AAAAAAAA" +"00,000","000,000","aaaa.aaaaaa@aaaaaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA0AA0A0","AAAAAAAA" +"000,000","00,000","aaaaaaaa.aaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA00A000A","AAAAAAAA" +"000,000","000,000","aaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA00A000A","AAAAAA AAAA AAAAA" +"00,000","000,000","aaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A0A0A00","AAAAAAAA" +"00,000","00,000","Aaaa00000@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA000AA0A0","AAAAAAAA" +"00,000",,"aaaa.aaaaaa@aa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000A000","AAAA" +"00,000","000,000","aaaaaa.aaaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000000","AAAAAAAA AAA AAAAAAA" +"00,000",,"aaaaa.aaaaaaa@aaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000000","AAAA" +"00,000","000,000","aaaaaaa.aaaaaaaaaa@aa.aa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000A00","AAAAAAAA AAA AAAAAAA" +"00,000",,"aaaaaaa.aaaaaaaaa@aaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000000","AAAA" +"000,000","000,000","aaaaaaaa.aaaaa@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA000A0A00","AAAAAAAA" +"00,000",,"aa_aaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000000A","AAAA" +"000,000",,"Aaaaaa.Aaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000A0A","AAAA" +"00,000",,"aaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA000AA000","AAAA" +"00,000",,"aaaaaaa.a.aaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA000AA000","AAAA" +"0,000",,"aaaaaaaa@aaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000A000","AAAA" +"0,000",,"aaaaaaaa@aaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000A000","AAAA" +"0,000",,"aaaaaa@aaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000A000","AAAA" +"000,000",,"AAAAAA@AAAAAAAAAA.AAA",00/00/0000 00:00:00AA,"0,000.00","AAA0000AA00","AAAA" +"00,000","000,000","aaaaaa0000@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA000AA000","AAAAAAAA" +"00,000",,"aaaaaa00@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000000A","AAAA" +"00,000",,"aaaaa0000@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000000A","AAAA" +"00,000",,"aaaaaaaaaaaaa@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000000A","AAAA" +"00,000",,"aaaaaaaaaaa@aaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000000A","AAAA" +"00,000",,"aaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000000A","AAAA" +"00,000",,"aaaaaa_aaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000000A","AAAA" +"00,000","00,000","aaaaaaaa@aaaaaaaaaaaaaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000000A","AAAAAAAA" +"00,000",,"aaaaa.a.aaaaaaa@aa.aaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000000A","AAAA" +"00,000",,"aaaaaaaaaaaa0@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000000A","AAAA" +"00,000",,"aaaaaaa000@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000000A","AAAA" +"00,000",,"aaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000000A","AAAA" +"00,000","000,000","aaaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000000A","AAAAAAAA" +"00,000","000,000","aaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000000A","AAAAAAAA" +"00,000",,"aaaaaaaaaa00@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000000A","AAAA" +"00,000",,"aaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000000A","AAAA" +"00,000",,"a_aaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000000A","AAAA" +"00,000",,"aaaaaaa@aaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000000A","AAAA" +"00,000",,"aaaa_aaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000000A","AAAA" +"000,000","00,000","aaaaa.aa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A000A00","AAAAAA AAAA AAAAA" +"000,000","000,000","aaaaaaa.aaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A000A00","AAAAAAAA" +"000,000",,"aaaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A000A00","AAAA" +"000,000",,"aaaaa.aaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A000A00","AAAA" +"000,000",,"aaa.aaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A000A00","AAAA" +"00,000",,"Aaaaa.AAAAAA@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A000000","AAAA" +"00,000",,"aaaaaaaaaaa@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A0A0000","AAAA" +"00,000",,"aaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A0A0000","AAAA" +"00,000",,"aaaaaaaa@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000A000","AAAA" +"00,000",,"Aaaaa.aaaaa0@aaaaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000000A","AAAA" +"000,000","000,000","aaaaa000@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A000A00","AAAAAAAA" +"00,000",,"aaaaaa00@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA00A00A0","AAAA" +"000,000","00,000","aaaaaa000@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000A00A","AAAAAAAA AAA AAAAAAA" +"00,000","000,000","aaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000000","AAAAAAAA" +"000,000","0,000","aaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000000A","AAAAAAAA AAA AAAAAAA" +"000,000","00,000","aaaaa.aa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000A00A","AAAAAA AAAA AAAAA" +"00,000",,"aaaaa00@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000A00","AAAA" +"00,000",,"aaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000A00","AAAA" +"00,000","00,000","aaaaaa.a.aaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000A00","AAAAAAAA" +"00,000",,"aaaaaa.aaaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000A00","AAAA" +"00,000",,"aaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000A00","AAAA" +"00,000","00,000","aaaaa000@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000AA00","AAAAAAAA" +"000,000",,"aaa.aaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000A00A","AAAA" +"00,000","00,000","aaaaaaaaaaaa@aaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000A00A","AAAAAAAA" +"00,000",,"aaaaaaa@aaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000A00A","AAAA" +"000,000",,"aaaaaa.aaaaaaaaa@aaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00A00A","AAAA" +"000,000","00,000","aaaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000A000","AAAAAAAA" +"000,000","00,000","aaaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000A00","AAAAAAAA" +"00,000",,"aaaa_aaaaaaaaa@aaaaaaaa-aaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A000A00","AAAA" +"000,000","0,000","aaaaaa.aaaaaaaa@aaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000000","AAAAAAAA" +"00,000",,"aaa.aaaaa@aaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaaaaaaa.aaaaaaaa@aaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000000","AAAA" +"00,000",,"AAAAA.AAAAAAAA@AAAAA.AAA",00/00/0000 00:00:00AA,"0,000.00","AAA0A000000","AAAA" +"000,000",,"aaaaaaaaaaaaa@aaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A000000","AAAA" +"000,000",,"aaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A000000","AAAA" +"000,000",,"aaaaaaaaa00@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A000000","AAAA" +"000,000",,"aaaa@aaaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A000000","AAAA" +"000,000",,"aaa.aaaaaa@aaaaaaaaaaaaaaa.aa",00/00/0000 00:00:00AA,"0,000.00","AAA00000A0A","AAAA" +"000,000",,"aaaaaaa.aaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00000A","AAAA" +"000,000",,"aaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00AA0A","AAAA" +"000,000","00,000","aaaaaaaa@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00AA0A","AAAAAAAA" +"000,000","000,000","aa_aaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00AA0A","AAAAAAAA" +"00,000","00,000","aaaaaaa00@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000AA00","AAAAAAAA" +"000,000","000,000","aaaaaaaaaaa0000@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000000","AAAAAAAA" +"000,000","00,000","aaaaa.aaaa@aaaaaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA000AAA00","AAAAAAAA" +"000,000","00,000","aaaaaaa_0000@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000000A","AAAAAAAA" +"00,000",,"aaaa0aaaaa@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A000000","AAAA" +"000,000","000,000","aaaaaa@aa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000000A","AAAAAAAA" +"00,000","000,000","aaaaaaa.a.aaaaaaaaa@aaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA000AA0AA","AAAAAAAA" +"00,000","000,000","aaaaaa.a.aaaaaaa@aaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA000AA0AA","AAAAAAAA" +"000,000","000,000","aaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000000","AAAAAAAA AAA AAAAAAA" +"00,000",,"Aaaaa00@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000A000","AAAA" +"00,000",,"Aaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000A000","AAAA" +"000,000",,"AaaaAAaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00A000","AAAA" +"0,000",,"aaaaaaaaa@aaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A000A00","AAAA" +"000,000",,"aaaaaaaa.aaaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00A000","AAAA" +"00,000",,"aaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000000","AAAA" +"000,000",,"aaaaaaa@aaaaaaaa.aa",00/00/0000 00:00:00AA,"0,000.00","AAAAA00000A","AAAA" +"000,000","000,000","aaaaa.aaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A000A00","AAAAAA AAAA AAAAA" +"00,000","00,000","aaaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000000A","AAAAAAAA" +"00,000","000,000","aaaaaaaaaa0@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000000A","AAAAAAAA" +"00,000","000,000","aaaaa@aaaaaaaaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000A00A","AAAAAAAA" +"00,000",,"a_aaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A000000","AAAA" +"00,000","00,000","aaaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000A00A","AAAAAA AAAA AAAAA" +"00,000","000,000","aaaa.aaaaa@aaaaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA0A00A0","AAAAAAAA AAA AAAAAAA" +"0,000","000,000","aaaaaaaaa0@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000A00","AAAAAAAA" +"0,000",,"aaaaaaa_aaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000A00","AAAA" +"0,000",,"aaaaaa00@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000A00","AAAA" +"0,000",,"aaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000A00","AAAA" +"0,000",,"aaaa00aaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000A00","AAAA" +"0,000",,"aaaa00@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000A00","AAAA" +"0,000",,"aaaaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000A00","AAAA" +"0,000",,"aaaa_aaa@aaaaa.aaa.aa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000A00","AAAA" +"0,000",,"aaaaa000@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000A00","AAAA" +"0,000",,"aaaa_aaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000A00","AAAA" +"0,000",,"Aaaaaaaaa00@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000A00","AAAA" +"0,000",,"aaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000A00","AAAA" +"0,000",,"aaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000A00","AAAA" +"0,000",,"aaaa00@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000A00","AAAA" +"0,000",,"aaa00@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000A00","AAAA" +"0,000",,"aaa0000@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000A00","AAAA" +"0,000",,"aaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000A00","AAAA" +"000,000","000,000","aaaaaa000@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000000","AAAAAA AAAA AAAAA" +"000,000","000,000","aaaaaaa0@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA000000","AAAAAAAA" +"00,000",,"aaaa.aaaaaa@aaaaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA0A00A0","AAAA" +"000,000","00,000","aaaaaa0aaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000000","AAAAAAAA" +"00,000",,"aaaaaaaaa_00@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000000","AAAA" +"00,000",,"aaaaaaa.aaaaaa@aaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000000","AAAA" +"00,000",,"aaaaaaa0@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000A0A","AAAA" +"00,000",,"aaaaaaa00@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000A0A","AAAA" +"00,000",,"aaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000A0A","AAAA" +"00,000",,"aaaa_0000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000A0A","AAAA" +"00,000",,"aaaaaa00@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000A0A","AAAA" +"00,000",,"aaaaa0@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000A0A","AAAA" +"00,000","0,000","aaaaaaaaaaa_aaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000A0A","AAAAAA AAAA AAAAA" +"00,000",,"aaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000A0A","AAAA" +"00,000",,"aaaa_aa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000A0A","AAAA" +"00,000",,"aaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000A0A","AAAA" +"00,000",,"aaaaaaa@aaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000A0A","AAAA" +"00,000",,"aaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000A0A","AAAA" +"00,000",,"aaaaaaaa00@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000A0A","AAAA" +"00,000","00,000","aaaaaaa_aaaaa00@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000A000","AAAAAAAA" +"00,000","00,000","aaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000000","AAAAAAAA" +"00,000",,"aaaaaaa@aaa.aa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA00","AAAA" +"00,000","000,000","aaa.aaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA00","AAAAAAAA" +"00,000",,"aaaaa.aaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA00","AAAA" +"0,000",,"aaaaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000000","AAAA" +"00,000","000,000","aaaaa.aaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000A000","AAAAAAAA" +"0,000",,"aaaa.aaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000000","AAAA" +"0,000",,"aaaaaaa.aaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000000","AAAA" +"0,000","00,000","aaaaaaa.aaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000000","AAAAAAAA" +"0,000",,"aaaaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000000","AAAA" +"0,000","00,000","aaaaa.aaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000000","AAAAAAAA" +"0,000",,"aaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000000","AAAA" +"0,000",,"aaaaaaaaaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000000","AAAA" +"0,000",,"aaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000000","AAAA" +"00,000","00,000","aaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA00AA00","AAAAAAAA" +"00,000","000,000","aaaaaaaaaaaaa0aaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00A000","AAAAAAAA" +"00,000",,"aaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00A000","AAAA" +"00,000",,"aaaaa.a.aa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00A000","AAAA" +"00,000",,"aaaaa_a00@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00A000","AAAA" +"00,000",,"aaaaa.aaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"00,000",,"aaaaaaaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000AA0A","AAAA" +"00,000",,"aaaaaa@aaaa.aa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00A000","AAAA" +"00,000",,"aaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000000","AAAA" +"000,000","000,000","aaaaaaaaa@aaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000A000","AAAAAAAA" +"00,000",,"aaaaa@aaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000A000","AAAA" +"000,000","00,000","aaaaaa.aaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000A00A","AAAAAAAA AAA AAAAAAA" +"000,000",,"aaaaa@aaaa.aa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000A0A","AAAA" +"000,000",,"aaaaa.aaaa@aaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000A0A","AAAA" +"000,000",,"aaaaa.aaaaa@aaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000A0A","AAAA" +"00,000","000,000","aaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA00","AAAAAAAA" +"00,000",,"aaaaaaa.aaaaaaaa@aaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaa@aa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000A0A","AAAA" +"00,000",,"aaaa.aaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000A00","AAAA" +"000,000","00,000","aaaaa000@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000A0A","AAAAAAAA AAA AAAAAAA" +"000,000",,"aaaaaaa_a@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000A0A","AAAA" +"00,000","00,000","aaaaaaaa@aaaaaaa.aa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000A00","AAAAAAAA" +"00,000",,"aaaaaaa_aaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000A000","AAAA" +"00,000","00,000","aaaaaaaaaaa00@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00A00A","AAAAAAAA" +"00,000",,"aaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000A000","AAAA" +"00,000",,"aaaa.aaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000A000","AAAA" +"00,000",,"aaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000A000","AAAA" +"000,000","000,000","aa_aaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA00000A","AAAAAAAA" +"00,000","00,000","aaaaa0@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000A000","AAAAAAAA" +"00,000","000,000","aaaaaa00000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAAAAAA" +"000,000",,"aaaaaaa@aaaa.aa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00000A","AAAA" +"000,000",,"aaaaaaa_aaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00000A","AAAA" +"000,000",,"aaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000000A","AAAA" +"000,000","000,000","aaa.aaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000000A","AAAAAAAA" +"00,000","000,000","aaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA00000A","AAAAAAAA AAA AAAAAAA" +"00,000","00,000","aaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA00000A","AAAAAAAA" +"00,000",,"aaaaaaa000@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA00000A","AAAA" +"00,000","00,000","aaaaaaa000@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA00000A","AAAAAAAA" +"00,000",,"aaaaa.aaaaaa@aa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA00000A","AAAA" +"000,000",,"aaaaaaaaaaaa0000@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaaaaaa@aaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000","00,000","aaaaaaa00000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAAAAAA" +"000,000",,"aaaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"00,000",,"aaaaaaaaaaaa@aaaa.aa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000000","AAAA" +"000,000",,"aaaaaa00000@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000A000A","AAAA" +"00,000","0,000","aaaaaa0000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000A00","AAAAAAAA" +"0,000",,"aaaa.aaaaaaaa@aaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000AAAA0","AAAA" +"0,000","00,000","aaaa.aaaaaaa@aaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000AAAA0","AAAAAAAA" +"0,000",,"aaa@aaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000AAAA0","AAAA" +"000,000","000,000","aaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA000AAAA0","AAAAAAAA" +"000,000","00,000","aaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000000A","AAAAAAAA AAA AAAAAAA" +"000,000","000,000","aaaa_a00@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA000AA000","AAAAAAAA" +"0,000",,"aaaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000A00A","AAAA" +"000,000","0,000","aaaaa@aaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000A0A","AAAAAAAA" +"000,000","00,000","aaaaaaaa@aaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000A0A","AAAAAA AAAA AAAAA" +"000,000",,"aaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000A0A","AAAA" +"000,000",,"aaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000A0A","AAAA" +"000,000",,"aaaaaa.aaaaaaaa@aaaaaaa.aa",00/00/0000 0:00:00AA,"0,000.00","AAA00000A0A","AAAA" +"00,000",,"aaaaaaaaaaaa@AAAaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAA" +"00,000",,"aaaaaaaaaa@aaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000000","AAAA" +"00,000","00,000","a0aaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000000","AAAAAAAA" +"00,000",,"a-aaaaaa@aaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000000","AAAA" +"00,000",,"aaaaa_aaaa@aa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00A000","AAAA" +"00,000",,"aaaaa_aaaaaa@aa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00A000","AAAA" +"000,000","00,000","aaaaa_aaaaaaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00A00A","AAAAAAAA" +"000,000",,"aaaaa.aaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000A00","AAAA" +"000,000","00,000","aa0000@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000A0A","AAAAAAAA" +"000,000","000,000","aaaaaa.aaaaaaaa@aaaaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA000000","AAAAAAAA" +"00,000",,"aaa.aaaa@a-aaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000000","AAAA" +"00,000","000,000","aa.aa@aaaa.aa.aa",00/00/0000 00:00:00AA,"0,000.00","AAA00000000","AAAAAAAA" +"000,000","000,000","aaaaaa000@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA00A000","AAAAAAAA" +"000,000",,"a.aaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000A00","AAAA" +"000,000",,"aaaa_aaaaaaaaaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00A00A","AAAA" +"000,000","000,000","aaa.aaa@aaaaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000A00","AAAAAAAA AAA AAAAAAA" +"00,000",,"aaaa.aaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA00000A","AAAA" +"00,000","000,000","aaaaaaaa.aaaaaa@aaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000000","AAAAAAAA" +"00,000",,"aaaaaaaaaa0@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00A00A","AAAA" +"00,000","00,000","aa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000000","AAAAAAAA AAA AAAAAAA" +"000,000",,"aaaaaaa0@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAA" +"00,000","00,000","aaaa_aaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAAAAAA AAA AAAAAAA" +"000,000","000,000","aaaaaaaaaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000000","AAAAAAAA" +"000,000",,"aaaaaaaaaa@aaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000AAAA0","AAAA" +"00,000",,"aaaa.aaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000000","AAAA" +"0,000","00,000","aaaaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000000","AAAAAAAA" +"00,000","0,000","aaaaaa_aaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA00A000","AAAAAAAA" +"000,000",,"aaaaa@aaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000A00A","AAAA" +"00,000",,"aaaaaaaa@aaaa.aa",00/00/0000 0:00:00AA,"0,000.00","AAA0000AA0A","AAAA" +"00,000",,"aaaaaaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000AA0A","AAAA" +"000,000",,"aaaaaaaaaaaaa@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00000A","AAAA" +"00,000",,"aaaa000@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000000A","AAAA" +"00,000","000,000","aaaaaaa00@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000A000","AAAAAAAA" +"000,000","000,000","aaaaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA00A00A","AAAAAAAA" +"000,000",,"Aaaaa0000@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA00A0A00","AAAA" +"000,000",,"aaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000AA00","AAAA" +"00,000","000,000","aaaaaaaaaaaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000A0A","AAAAAAAA" +"00,000",,"aaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA00","AAAA" +"000,000","000,000","aaaaaaaa@aaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000A00A","AAAAAAAA" +"000,000",,"aaaaaaa0@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000A000","AAAA" +"000,000",,"aaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000A000","AAAA" +"000,000",,"aaaaaaaaaa0000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000A000","AAAA" +"00,000","00,000","aaaa.aaaaaaa@aaaaaaaaa.aa",00/00/0000 0:00:00AA,"0,000.00","AAAA000A000","AAAAAAAA" +"00,000",,"aaaaaaaaa@aaaaaaa.aa",00/00/0000 0:00:00AA,"0,000.00","AAAA000A000","AAAA" +"00,000",,"aaaaa00@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00A000","AAAA" +"000,000","00,000","aaaaaa000@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAAAAAA" +"000,000",,"aaaaaaa0000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAA" +"000,000","000,000","aaaaaaaaaaaa@aaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000AA0A","AAAAAAAA" +"00,000","00,000","aaaaaaaaaaaaaa000@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA00","AAAAAAAA" +"00,000",,"aaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000A00","AAAA" +"00,000",,"aaaaaaaaaa@aaaaaaa-aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA00A00A","AAAA" +"00,000","000,000","aaaaaaaaa@aaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000000","AAAAAAAA AAA AAAAAAA" +"00,000",,"aaaaaaaa0@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000000","AAAA" +"000,000","000,000","aaaaa@aaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000A00","AAAAAAAA" +"00,000",,"aaaaaaaaa.aa@aaaaaa.aaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA00","AAAA" +"00,000","00,000","aaaaaaaaaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA00","AAAAAAAA" +"00,000",,"aaaaaaaaaaaaaa@aaaaaaaaa.aa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA00","AAAA" +"000,000","000,000","Aaaa000@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00A00A","AAAAAAAA" +"00,000",,"aaaaaaa@aaaaaa.aa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00A000","AAAA" +"000,000","00,000","aaa@aaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A000000","AAAAAAAA" +"00,000",,"aaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA00000A","AAAA" +"00,000","000,000","aaa@aaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00A000","AAAAAAAA" +"000,000",,"aaaaaaaaa@aa.aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00000A","AAAA" +"00,000",,"aaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000AA000","AAAA" +"0,000","000,000","aaaaaa_00@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A0A00A0","AAAAAAAA AAA AAAAAAA" +"000,000",,"aaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000AA00","AAAA" +"00,000",,"aaaaaaaa00@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000A000","AAAA" +"00,000",,"aaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000AA0A0","AAAA" +"000,000","00,000","aaaaaa@aaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA00000A","AAAAAAAA" +"000,000","00,000","aaaaaaaaaaa@aaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000A0A","AAAAAAAA" +"00,000",,"aaaaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA00","AAAA" +"00,000","00,000","aaaaaaa_0@aaaaaaaaa.aa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA00","AAAAAAAA" +"00,000","000,000","aaaaaaaaa@aaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00A000","AAAAAAAA" +"00,000","000,000","aaaaaaaaaa0@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A000A0A","AAAAAAAA" +"000,000","000,000","aaaaaaa@aaaaa.aa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000A00","AAAAAAAA" +"000,000",,"aaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000A00","AAAA" +"000,000",,"aaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000A00","AAAA" +"000,000","00,000","aaaaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000A00","AAAAAA AAAA AAAAA" +"000,000","00,000","aaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000A00","AAAAAA AAAA AAAAA" +"000,000",,"AaaaaAaa@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A000A0A","AAAA" +"00,000",,"aaaaaaaaa@aaaaaaaaa.aa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000A00","AAAA" +"00,000","00,000","aaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000A00","AAAAAAAA AAA AAAAAAA" +"000,000",,"aaaaa@aaaaaaa.aa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000A0A","AAAA" +"00,000",,"aa@aaaaaaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA00","AAAA" +"000,000",,"aaaaaaaaa@aaaaaaa.aa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00000A","AAAA" +"000,000",,"aaaaa@aaaaaaa.aa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00000A","AAAA" +"000,000",,"aaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"00,000",,"aaaaa@aaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00A000","AAAA" +"00,000","00,000","aaa.aaaaaaa@aaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00A000","AAAAAAAA" +"000,000","000,000","aaaaaaaa@aaaaaaa.aa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00000A","AAAAAA AAAA AAAAA" +"00,000",,"Aaaaaaaa.aaaa@aaaa.aaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000AA00","AAAA" +"000,000","000,000","aaaaaaaa@aaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A000000","AAAAAAAA" +"000,000",,"aaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A0AA000","AAAA" +"00,000",,"Aaaa.aaaaaa@aaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA000A0AA0","AAAA" +"00,000","000,000","aaaaaaa@aaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00A000","AAAAAAAA" +"00,000",,"aaaa.aaaaaaa@aaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000000","AAAA" +"000,000",,"aaaa_aaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000A00A","AAAA" +"00,000",,"aa_aaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000000","AAAA" +"000,000",,"aaaaaaaa00@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA000000","AAAA" +"000,000",,"aaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A000A0A","AAAA" +"000,000",,"aaaaaaaaa000@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000000A","AAAA" +"00,000","000,000","aaaa_aaa_@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000000","AAAAAAAA" +"000,000","00,000","aaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA000AAAA0","AAAAAAAA AAA AAAAAAA" +"00,000","0,000","aaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000A00","AAAAAAAA" +"000,000",,"aaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000A000","AAAA" +"000,000",,"aaaaaa@aaaaaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000A000","AAAA" +"000,000","000,000","aaaaaa.aaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000000","AAAAAAAA" +"000,000","000,000","aaaaaaaa@aaaaaaaa.aa",00/00/0000 0:00:00AA,"0,000.00","AAA0000A00A","AAAAAAAA AAA AAAAAAA" +"000,000",,"aaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000000","AAAA" +"0,000",,"aaaa@aaaaa-aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA00","AAAA" +"0,000","000,000","aaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000A00","AAAAAAAA" +"0,000",,"aaaaaa_aaaa0000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000A00","AAAA" +"00,000","000,000","aaaa_aaaaaaaaa@aa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000A0A","AAAAAAAA" +"00,000",,"aaa.aaaaaaa@aa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000A00","AAAA" +"000,000",,"aaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00000A","AAAA" +"00,000","000,000","aaaaaa.aaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAAAAAA AAA AAAAAAA" +"000,000","000,000","aaaaaaaaaaaaa@aaaaaaaaa.aa",00/00/0000 0:00:00AA,"0,000.00","AAA000AA00A","AAAAAA AAAA AAAAA" +"000,000",,"Aaaaa.Aaaaaaaa-Aaaaaaa@aaaaaaaa-aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA00A0000","AAAA" +"00,000",,"aaaa@aaaaaa.aa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000A00","AAAA" +"00,000","000,000","aaaaaaaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00A000","AAAAAAAA" +"00,000",,"aaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000000A","AAAA" +"00,000",,"aaaaa@aaaaaaaaa.aa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000A00","AAAA" +"00,000",,"aaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000A00","AAAA" +"000,000",,"aaaaa0000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000000","AAAA" +"00,000","000,000","aaaaaa00@aaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000000","AAAAAAAA" +"000,000",,"aaaa_00_aaa_a00@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA00","AAAA" +"00,000","00,000","aaaaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000A000","AAAAAAAA" +"000,000","00,000","aa.aaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00AA0A","AAAAAAAA" +"0,000","000,000","aaaaaaa_aaaaaaaa@aa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000A00A","AAAAAAAA AAA AAAAAAA" +"0,000","000,000","aaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000A00A","AAAAAAAA AAA AAAAAAA" +"0,000","000,000","aaaaaaa00@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000A00A","AAAAAAAA" +"000,000","0,000","aaa_aaaaaa@aa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00A000","AAAAAAAA" +"00,000",,"Aaaaaaaaa_Aaaaaaaaaaaa@aa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000000","AAAA" +"00,000",,"aaaaaaaa.aaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000000","AAAA" +"0,000","00,000","aaaaaaa_aaaaaaa@aa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000A00A","AAAAAAAA" +"0,000",,"aaaaaaaaaa@a0aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000A00A","AAAA" +"000,000","000,000","aa00@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA000AA0A0","AAAAAAAA AAA AAAAAAA" +"000,000",,"aaaaaa.aaaaaaaa@aaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000A000","AAAA" +"00,000","00,000","aaaaaaaaaaaaaaaaa@aaaaa.aa",00/00/0000 00:00:00AA,"0,000.00","AAAAA000000","AAAAAAAA" +"000,000",,"aaaaaaaaaaaaa000@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000000","AAAA" +"0,000",,"aaaaaaaaaa@a0aaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000A00A","AAAA" +"0,000",,"aaaa_aaaaa@aa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000A00A","AAAA" +"000,000",,"aaaaaa.aaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA00AA00","AAAA" +"000,000","00,000","aaaaaaaaaaaa00@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA00A00A0","AAAAAAAA" +"000,000","0,000","AAAAAA.AAAAAAAAA@aaaaaaaaa.aa",00/00/0000 00:00:00AA,"0,000.00","AAAA00A00A0","AAAAAAAA" +"000,000",,"aaa00000@AAA.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA00A00A0","AAAA" +"000,000",,"aaaaaaaa000@aaaaaaaaa.aa",00/00/0000 00:00:00AA,"0,000.00","AAAA00A00A0","AAAA" +"000,000","000,000","aaaaaaa00@aaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA00A00A0","AAAAAAAA AAA AAAAAAA" +"000,000",,"aaaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA00A00A0","AAAA" +"000,000",,"Aaaa.Aaaaaaa@aaaaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA00A00A0","AAAA" +"0,000",,"aaaaaaaaaaaaaaa_0@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00AA00","AAAA" +"00,000",,"aaaaa_000@aaaaaaa.aaaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA00000A","AAAA" +"00,000",,"aaaaaa_000@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA00000A","AAAA" +"00,000","00,000","aaaaaaaa.aaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A000000","AAAAAAAA" +"000,000",,"AaaaAAaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00A000","AAAA" +"00,000","000,000","aaaaa@aaaaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00A000","AAAAAAAA" +"000,000","00,000","aaaaaaaaa@aaaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAAAAAA" +"000,000",,"aaaaa.aaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA00A000","AAAA" +"000,000",,"aaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000A0A","AAAA" +"000,000","0,000","aaaaaaaaaaa@aaaaaaa.aa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000A0A","AAAAAAAA" +"000,000","000,000","aaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAAAAAA AAA AAAAAAA" +"000,000","000,000","aaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000A0A","AAAAAA AAAA AAAAA" +"000,000","00,000","aaaaaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAAAA AAAA AAAAA" +"000,000","00,000","aaaaaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000A0A","AAAAAA AAAA AAAAA" +"000,000","00,000","aaaa@aaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAAAA AAAA AAAAA" +"00,000",,"aaaa.aaaaaaa@aaaaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAA" +"000,000","00,000","aaaa@aaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000000","AAAAAA AAAA AAAAA" +"00,000","00,000","aaaaaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA00A00A","AAAAAAAA" +"000,000","000,000","aaaaaaaaa@aaa.aa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000000","AAAAAAAA" +"000,000","000,000","aaaaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000000","AAAAAA AAAA AAAAA" +"0,000","000,000","aaaaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAAAA AAAA AAAAA" +"000,000","000,000","aaaaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000A0A","AAAAAA AAAA AAAAA" +"000,000","000,000","aaaaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAAAAAA AAA AAAAAAA" +"00,000",,"aaaaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA00A00A","AAAA" +"000,000",,"aaaa000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAA" +"000,000",,"aaaaaaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAA" +"000,000",,"aaaaaa@aaaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000","000,000","aaaaaa@aaaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAAAAAA" +"000,000",,"Aaaaa.aaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000A00A0","AAAA" +"000,000",,"aaaaaaaa.aaaaa@aaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000A000","AAAA" +"00,000",,"aaaaa@aaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA00","AAAA" +"000,000",,"aaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA00AA00","AAAA" +"000,000","000,000","aaaaaa00@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000A00","AAAAAAAA" +"00,000",,"aaaaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A0A00AA","AAAA" +"00,000","00,000","AAAAAAAAAA000@AAAAAAA.AAA",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAAAAAA" +"000,000","000,000","aaaaaa_aaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000A00","AAAAAAAA AAA AAAAAAA" +"00,000","000,000","aaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000A00","AAAAAAAA" +"00,000","00,000","aaaaaaaa00@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00A00A","AAAAAAAA" +"00,000","00,000","aaaaaaa@aaaaa.aa",00/00/0000 00:00:00AA,"0,000.00","AAA0A000000","AAAAAAAA" +"000,000",,"aaaaaa@aaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00A00A","AAAA" +"000,000",,"aaaaa.aaaaaaaaa@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00A00A","AAAA" +"000,000",,"aaaaa.aaaaaaaa@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00A00A","AAAA" +"000,000",,"aaaaa00@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00A00A","AAAA" +"00,000","000,000","aaaa.aaaa.aaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000000","AAAAAA AAAA AAAAA" +"00,000",,"Aaaaaaaa0@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A000000","AAAA" +"000,000","000,000","a_aaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA000A0A00","AAAAAAAA" +"00,000",,"aaaaaaaaaaa000@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000000","AAAA" +"00,000",,"aaaaaa_a0@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000000","AAAA" +"00,000",,"aaaaaaa_00@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000000","AAAA" +"00,000","000,000","aaaaa_aa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A0A0A0A","AAAAAA AAAA AAAAA" +"000,000","00,000","aaaaa_aaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000A00","AAAAAAAA" +"000,000",,"aaaaa.aaaaaaaa@aaaaa-aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000A00","AAAA" +"000,000",,"aaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000A00","AAAA" +"00,000","00,000","aaaaa_aaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A0A0A0A","AAAAAAAA AAA AAAAAAA" +"000,000","000,000","aaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000A000","AAAAAAAA" +"00,000",,"aa0aaaa@aaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000A000","AAAA" +"00,000",,"aaa.a.aaaaaa@aaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000A000","AAAA" +"00,000",,"aaaaa@aaaaaaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000A000","AAAA" +"00,000",,"aaaaaaa@aaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000A000","AAAA" +"00,000",,"aaaaaa_aaaaaaaa@aa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA00A000","AAAA" +"000,000",,"aaaaaa.a.aaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00000A","AAAA" +"000,000",,"Aaaaa0@aaaaaaa.aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000A000","AAAA" +"000,000","00,000","aaaaaaaaa000@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000A000","AAAAAAAA" +"00,000","00,000","aaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000000","AAAAAAAA" +"000,000","00,000","aaaaaaa0@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000A000","AAAAAAAA" +"000,000",,"aaaaaaaa0@aaaaaaa.aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000A000","AAAA" +"000,000",,"aaaaaaa00@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000A000","AAAA" +"00,000","000,000","aaa@aaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A000000","AAAAAAAA" +"000,000",,"aaaaaaaa@aa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAA" +"00,000","0,000","aaaaaa.aaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000000","AAAAAAAA" +"00,000","000,000","aaaaaaa@aaaaaa.aa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000000","AAAAAAAA" +"000,000","000,000","aa.aa.aaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA00AA00","AAAAAAAA AAA AAAAAAA" +"000,000",,"aaa@aaaaaa.aa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"00,000",,"a_aaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00A000","AAAA" +"00,000",,"aaaaaaa@aaaa.aa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00A000","AAAA" +"00,000",,"aaa@aaaa.aa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00A000","AAAA" +"00,000",,"aa@aaa.aaaaa.aa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000000","AAAA" +"00,000","000,000","aaa@aaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00A000","AAAAAAAA" +"000,000","00,000","aaaaaaaaaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000A00","AAAAAAAA" +"000,000","000,000","aaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAAAAAA" +"000,000","00,000","aaaaaaaaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAAAAAA" +"000,000","000,000","aaaaaaaaaaa00@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAAAAAA" +"0,000","000,000","aaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAAAA AAAA AAAAA" +"000,000","000,000","aaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000000","AAAAAAAA" +"000,000",,"aaaaaaa000@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000000","AAAA" +"000,000","000,000","aaaa@aaaaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAAAAAA" +"000,000",,"aaaaaa_a@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000000","AAAA" +"00,000",,"aaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00AA00","AAAA" +"000,000","000,000","aaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000AAA00","AAAAAAAA" +"000,000",,"aaaaaaaaaa0@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A000000","AAAA" +"0,000","000,000","aaaaa.aaaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000A00A","AAAAAAAA" +"0,000","000,000","aaaaaaaaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000A00A","AAAAAA AAAA AAAAA" +"000,000","000,000","aaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000000A","AAAAAAAA" +"00,000",,"Aaaaaa0000@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000A000","AAAA" +"0,000","000,000","aaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A0A00A0","AAAAAAAA" +"00,000","00,000","aaaaaaaaaaaaa00@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAAAAAA" +"000,000",,"aaaaaa0000@aaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000000","AAAA" +"000,000","0,000","aaaaaaa.aaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA00","AAAAAAAA" +"00,000",,"aaaaa@aaaaaaaaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00A000","AAAA" +"000,000",,"aaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00AA00","AAAA" +"000,000",,"aaaaaaaa0@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00AA00","AAAA" +"000,000","000,000","aaaaaaa.a@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00AA00","AAAAAAAA" +"00,000",,"aaaaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000A00","AAAA" +"00,000",,"aaaaa_aaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000A00","AAAA" +"00,000",,"aaa.aaa@aaaa.aa",00/00/0000 00:00:00AA,"0,000.00","AAAAA000A00","AAAA" +"00,000","0,000","aaaaaa0000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAAAAAA" +"00,000",,"aaaaa@aaaaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA00","AAAA" +"00,000","00,000","aaaaaa@aaaaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA00","AAAAAAAA" +"00,000",,"aaaa00000@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000000","AAAA" +"000,000","000,000","aaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000A00A","AAAAAAAA" +"00,000",,"aaaa_aaaaaaa@aaaaaaaa-aaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000A00","AAAA" +"00,000","00,000","aaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000A00","AAAAAAAA AAA AAAAAAA" +"00,000","00,000","aaaaaaaa@aaaaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA00","AAAAAA AAAA AAAAA" +"000,000",,"a_aaa000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000A00","AAAA" +"000,000",,"aaaaaaaa@aaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000A0A","AAAA" +"00,000","000,000","aaaa_aaaaaaa@aa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000A0A0A","AAAAAAAA" +"00,000",,"aaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000A0A0A","AAAA" +"000,000",,"aaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAA" +"00,000",,"aaaaaaaa00@aaaaaaaaa.aa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000000","AAAA" +"00,000","00,000","a.aaaaaaa@aaaaaaaaa.aa",00/00/0000 0:00:00AA,"0,000.00","AAA0000AA0A","AAAAAAAA" +"000,000",,"aaaaaaaaaa_aa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA000A00","AAAA" +"000,000","00,000","aaaaaaaaa00@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA000A00","AAAAAAAA" +"00,000",,"aaaaaaaaa.aaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000000","AAAA" +"00,000","00,000","aaa00@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000000","AAAAAAAA" +"000,000","000,000","aaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA00","AAAAAAAA" +"00,000","00,000","aaaaaaa00@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000A0A00","AAAAAAAA" +"000,000","00,000","Aaaaaa0000@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA000000","AAAAAAAA" +"00,000",,"Aaaaaaaa.aaaa@aaaa.aaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000AA00","AAAA" +"000,000","00,000","aaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000AA0A","AAAAAAAA" +"000,000",,"Aa.Aaaaaa@aaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000000","AAAA" +"000,000",,"Aaaaaaa.Aaaa@aaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000000","AAAA" +"00,000","000,000","aaaaaaaa00@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000A00","AAAAAAAA AAA AAAAAAA" +"00,000","000,000","aaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA00000A","AAAAAAAA" +"00,000","00,000","aaaa@aaaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA00","AAAAAA AAAA AAAAA" +"00,000",,"aaaaaaaa@aaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA00","AAAA" +"00,000","000,000","aaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA00","AAAAAA AAAA AAAAA" +"000,000",,"Aaaaaaaa.Aaaaaaa@aaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000A000","AAAA" +"00,000",,"aaaaaaaa_00@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA000A00","AAAA" +"000,000","000,000","aaaaaaa00@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA00000A","AAAAAAAA" +"000,000",,"aaaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA00000A","AAAA" +"000,000",,"aaaaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA00000A","AAAA" +"000,000",,"Aaaaa.Aaaaaaaaa@aaaaaaaaaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000000","AAAA" +"00,000",,"Aaaaaa.Aaaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA0A","AAAA" +"000,000",,"aaaaaaaa@aaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000000","AAAA" +"00,000","00,000","aaaaaaa@aaaaaaaaaaaaaa.aa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00A000","AAAAAAAA" +"00,000","00,000","aaaaaaaa.aaaaaa-aaa@aaaa.aa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000000","AAAAAAAA" +"00,000",,"aaaa@aaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000A00AA","AAAA" +"00,000",,"aaaa.aa.aaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000A00AA","AAAA" +"000,000","000,000","aaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000A0A","AAAAAAAA" +"000,000","000,000","aaaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000A0A","AAAAAA AAAA AAAAA" +"000,000",,"aaaaaaaaa00@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000A0A","AAAA" +"000,000",,"aaa000@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000A0A","AAAA" +"000,000","000,000","aaaaa@a0aaaaaa.aa",00/00/0000 0:00:00AA,"0,000.00","AAA00000A0A","AAAAAA AAAA AAAAA" +"000,000","000,000","aaaa_aaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000A0A","AAAAAAAA" +"000,000","00,000","aaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000AA0A","AAAAAAAA" +"00,000",,"aaaa.aaaaaa@aaaaa.aa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00A000","AAAA" +"00,000",,"aaaa.aaaaaa@aaaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00A000","AAAA" +"00,000",,"aaaaaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A0A0000","AAAA" +"000,000","00,000","aaaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000AA00","AAAAAAAA AAA AAAAAAA" +"00,000",,"aaaaaa.aaaa@aaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000AA00","AAAA" +"00,000","000,000","aaaa.aaaaaa@aaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000AA00","AAAAAAAA" +"00,000",,"aaaaaaaaa@aaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000AA00","AAAA" +"00,000",,"aaaaaaa000@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000AA00","AAAA" +"000,000",,"aaaa@aaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000AA0A","AAAA" +"000,000",,"aaaaaa_aaaaaa@aa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000A000","AAAA" +"000,000",,"aaaaa_aaa@aa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000A000","AAAA" +"000,000",,"aaaaaaaaaa@aaaaa.aa",00/00/0000 00:00:00AA,"0,000.00","AAA0000AA0A","AAAA" +"00,000",,"aaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000000","AAAA" +"000,000",,"aaaaaa_aaaaaaaa@aaaaa-aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000A00A","AAAA" +"00,000","00,000","AaaaAaaaaAaaaa@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00AA00","AAAAAAAA" +"00,000","00,000","aaa@aaaaaaaaaaa.aa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00A000","AAAAAAAA" +"000,000","00,000","aaaaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000A0A","AAAAAAAA AAA AAAAAAA" +"00,000",,"aaaaa.aaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA000A0000","AAAA" +"00,000","00,000","aaaaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA000A0000","AAAAAAAA" +"00,000",,"aaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA000A0000","AAAA" +"00,000",,"aaaaaa_aaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA000A0000","AAAA" +"00,000",,"aaaaaaa_@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA000A0000","AAAA" +"00,000",,"aaaa@aaaaaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000AA00","AAAA" +"00,000",,"aaaaaaaa_0000@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA000A0000","AAAA" +"00,000",,"aaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA000A0000","AAAA" +"0,000","000,000","aaaaaaaaa00@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA000AA000","AAAAAAAA" +"00,000",,"aaaa_aaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA000A0000","AAAA" +"000,000",,"aaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000A0A","AAAA" +"00,000","00,000","Aaa.Aaa@aaa.aaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000AA00","AAAAAAAA" +"000,000","00,000","aaa.aaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000A00","AAAAAAAA" +"000,000",,"aaaaaaa.a@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00AA00","AAAA" +"000,000","00,000","aaa.aaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00AA00","AAAAAAAA" +"000,000",,"aaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00AA00","AAAA" +"000,000","000,000","aaaaa0000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00AA00","AAAAAAAA" +"000,000",,"aaaaa.aaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00AA00","AAAA" +"000,000",,"aaa.aaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00AA00","AAAA" +"000,000","000,000","aaaaa.aaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00AA00","AAAAAAAA AAA AAAAAAA" +"00,000","000,000","aaaaaaaaaa0000@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00A000","AAAAAAAA" +"00,000","00,000","aaaaaa00@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000000A","AAAAAAAA" +"00,000",,"aaaaaaaaa00@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000000A","AAAA" +"00,000",,"aaaaaaaaa0@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000000A","AAAA" +"00,000","000,000","aa_aaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000000A","AAAAAAAA" +"00,000",,"aaaaaaaaaaa00@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000000A","AAAA" +"00,000",,"aaaaa.aaaaaaa@aaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000000A","AAAA" +"00,000","000,000","aaaaa000@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000000A","AAAAAA AAAA AAAAA" +"00,000","000,000","aaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000000A","AAAAAAAA" +"00,000",,"aaaaa.aaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000000A","AAAA" +"00,000",,"aaaaa00@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000000A","AAAA" +"00,000",,"aaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000000A","AAAA" +"00,000",,"aaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000000A","AAAA" +"00,000",,"aaa0aaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000000A","AAAA" +"00,000",,"aaaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000000A","AAAA" +"00,000",,"a_aaaaaa00@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000000A","AAAA" +"00,000","000,000","aaaaaaa0000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000000A","AAAAAAAA" +"00,000",,"aaaaa000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000000A","AAAA" +"000,000",,"aaaa_aaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA00000A","AAAA" +"00,000",,"aaaaa.aaaaa@aaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA00","AAAA" +"000,000",,"aaaaaa@aaaaaaaaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA00000A","AAAA" +"00,000","00,000","aaaaa_aaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00000A","AAAAAAAA AAA AAAAAAA" +"00,000",,"aaaa_aaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00000A","AAAA" +"00,000",,"aaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00000A","AAAA" +"00,000",,"aaaaaaa@aaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00A000","AAAA" +"00,000",,"aaaaaaaaaaaaa@aaaaaaaaa.aa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00A000","AAAA" +"0,000","000,000","aaaaaaaaaaaaa@aaaaaaaaa.aa",00/00/0000 0:00:00AA,"0,000.00","AAA000AAAA0","AAAAAAAA" +"00,000",,"aaaaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000000","AAAA" +"00,000",,"aaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000000","AAAA" +"0,000","000,000","aaaaaa_aaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000000","AAAAAAAA" +"0,000","000,000","aaaaa00@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000000","AAAAAAAA" +"0,000","000,000","aaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000000","AAAAAAAA" +"0,000",,"aaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000000","AAAA" +"0,000","000,000","aaaaaaaaaaaaa00@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000000","AAAAAAAA" +"000,000",,"aaaa@aaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000A000","AAAA" +"00,000",,"aaaaaa@aaaaaaa.aa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000000","AAAA" +"000,000",,"aaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000","000,000","aaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000A0A","AAAAAAAA" +"000,000",,"aaaaaaaaaaa@aaaa.aa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaa00@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"00,000",,"aaaaaaaaaa000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00A00A","AAAA" +"00,000",,"aaaaaaaa@aa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00A00A","AAAA" +"00,000",,"aaaaaa@aaaaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00A000","AAAA" +"00,000",,"aaaaaa@aaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00A000","AAAA" +"00,000","0,000","aaaaaa.aaaaaaa@aaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00A000","AAAAAAAA" +"00,000",,"aaaa@aaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA00","AAAA" +"000,000",,"aaaaaaaaa@aaaa.aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA000A0AA0","AAAA" +"000,000",,"aaaaaaa.aaaaaa@aaaaaaaaaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000A000","AAAA" +"0,000","000,000","aaaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA000000","AAAAAA AAAA AAAAA" +"000,000",,"aaaaaaaa.aaaaaa@aa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA0A00A0","AAAA" +"000,000","00,000","aaaaaa@aaaaaaaa.aa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000A000","AAAAAAAA" +"000,000",,"aaaaa@aaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000A000","AAAA" +"00,000",,"aaaaaaa.aaaaaaaaaaaa@aaaaaa.aa.aa",00/00/0000 00:00:00AA,"0,000.00","AAAA00A000A","AAAA" +"00,000","000,000","aaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000000A","AAAAAAAA" +"000,000",,"aaaaaaaa@aaaaa.aa",00/00/0000 00:00:00AA,"0,000.00","AAA00000A0A","AAAA" +"000,000",,"aaaaaaaaaaaa@aaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000A0A","AAAA" +"00,000","000,000","aaaaaaaa@aaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA000A0A","AAAAAAAA" +"00,000",,"aaaaaaaaaaaaa@aaaaaaa.aaaaa.aa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAA" +"000,000",,"'aaaaaaaa_aaaaaa@aaaaaaaa-aaaaaaaa.aaa'",00/00/0000 0:00:00AA,"0,000.00","AAA0A00000A","AAAA" +"000,000",,"aaaa_aaaaaaaaaa@aaaaaaaa-aaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00000A","AAAA" +"000,000",,"aaaaaa_aaaaa@aaaaaaaa-aaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00000A","AAAA" +"000,000","00,000","aaaaaaaa_aaaaaa@aaaaaaaa-aaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00000A","AAAAAAAA" +"00,000",,"aaaa.aaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000A00","AAAA" +"000,000","00,000","aaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000A00","AAAAAAAA" +"000,000",,"aaaaaaaaaaa@aaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000000","AAAA" +"000,000","00,000","aaaaaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000A0A00","AAAAAAAA" +"000,000",,"aaaaaaa@aaaaaaa.aa",00/00/0000 0:00:00AA,"0,000.00","AAA000A0A00","AAAA" +"000,000",,"aaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000A0A00","AAAA" +"000,000","00,000","aaaaaa.aaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000A0A00","AAAAAA AAAA AAAAA" +"000,000","00,000","aaaaaaaaaa0@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000A0A00","AAAAAAAA AAA AAAAAAA" +"000,000",,"aaaaaaa.aaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000A0A00","AAAA" +"000,000",,"aaaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000A0A00","AAAA" +"000,000","00,000","aaaaaaa_aaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000A0A00","AAAAAAAA" +"000,000",,"aaaaaaaa@aaaaaa.aaa.aa",00/00/0000 0:00:00AA,"0,000.00","AAA000A0A00","AAAA" +"000,000","00,000","aaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000A0A00","AAAAAAAA" +"000,000",,"aaaaaaaa.aaaaaaa@aaaa.aa",00/00/0000 0:00:00AA,"0,000.00","AAA000A0A00","AAAA" +"000,000",,"aaaaa@aaaaaaaaaaaaaaa.aa",00/00/0000 0:00:00AA,"0,000.00","AAA000A0A00","AAAA" +"000,000",,"aaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000A0A00","AAAA" +"000,000","000,000","aaaaa.aaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000A0A00","AAAAAAAA" +"000,000",,"aaaaaaaaaa@aaaa.aa",00/00/0000 0:00:00AA,"0,000.00","AAA000A0A00","AAAA" +"000,000",,"aaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000A0A00","AAAA" +"0,000","0,000","aaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAAAAAA AAA AAAAAAA" +"00,000",,"aaaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00A000","AAAA" +"00,000","000,000","aaaaa00@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000000A","AAAAAAAA" +"000,000",,"aaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000A000","AAAA" +"000,000",,"aaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000A000","AAAA" +"000,000","0,000","aaaaa00@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00A00A","AAAAAAAA" +"000,000",,"aaaaaaaaa00@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00A00A","AAAA" +"000,000",,"AaaaaaAaaa@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00A00A","AAAA" +"000,000",,"aaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00A00A","AAAA" +"000,000",,"aaaaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00A00A","AAAA" +"000,000",,"Aaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00A00A","AAAA" +"000,000",,"aaaaaa.aaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00A00A","AAAA" +"000,000",,"aaaaaa00@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00A00A","AAAA" +"000,000",,"aaaaaaaaaaaa0@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00A00A","AAAA" +"000,000",,"aaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00A00A","AAAA" +"000,000",,"aaaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00A00A","AAAA" +"000,000",,"aaaaa_aaaaaa@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00A00A","AAAA" +"000,000",,"aaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00A00A","AAAA" +"000,000",,"aaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00A00A","AAAA" +"000,000",,"aaaaaa@aaaaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00A00A","AAAA" +"000,000","000,000","aaaaa_a_aaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00A00A","AAAAAA AAAA AAAAA" +"000,000",,"aaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00A00A","AAAA" +"000,000",,"aaaaaaaaaa0@aa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00A00A","AAAA" +"000,000","0,000","aaaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA00A000","AAAAAAAA" +"000,000",,"aaaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA00000A","AAAA" +"00,000",,"aaaaaaaaaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000A00A","AAAA" +"00,000",,"aaaaaaa@aaa.aa.aa",00/00/0000 0:00:00AA,"0,000.00","AAAA000A00A","AAAA" +"000,000",,"aaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000A00","AAAA" +"000,000","00,000","aaaaaa0_aaaaaa@aaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA0A0AA0","AAAAAAAA" +"000,000",,"aaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA000A00","AAAA" +"000,000","0,000","aaaaaaa@aaa.aa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000A00","AAAAAAAA" +"000,000",,"aaaa_aaaaaaaa@aa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000A000","AAAA" +"000,000","000,000","aaaaaaa@aa.aaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA0A0A0A","AAAAAAAA" +"00,000",,"aaaaaaaaa@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00A000","AAAA" +"000,000","00,000","aaaaaaa00@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000A0A","AAAAAAAA" +"000,000",,"Aaaa00@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000A0A","AAAA" +"000,000",,"Aaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000A0A","AAAA" +"000,000",,"aaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000A0A","AAAA" +"000,000",,"aaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000A00","AAAA" +"00,000","000,000","aaaaa00@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A0AA000","AAAAAAAA" +"00,000",,"aaaaaaaaaa@aaaaaaaaaaaaa.aa",00/00/0000 00:00:00AA,"0,000.00","AAAA000A00A","AAAA" +"000,000",,"aaaa_aaaaaaaaa@aa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00A00A","AAAA" +"00,000",,"aaaaa@aa00aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00A000","AAAA" +"00,000",,"aaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA000AA00A","AAAA" +"0,000",,"aaaaa@aaaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000000","AAAA" +"000,000",,"aaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA0A0A0A","AAAA" +"0,000",,"aaaa_aaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000A00A","AAAA" +"00,000",,"aaaaaaa@aaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A0A0000","AAAA" +"0,000","000,000","aaaa.aaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000A00A","AAAAAAAA" +"0,000",,"Aaaaa_Aaaaaaaaa@aa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000AA00","AAAA" +"00,000",,"aaaaaaaa.aaaaaaa@aaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000A00A","AAAA" +"00,000","000,000","aaaaa.aaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000A00A","AAAAAA AAAA AAAAA" +"00,000",,"aaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000A00A","AAAA" +"00,000","00,000","aaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000A00A","AAAAAAAA" +"00,000","000,000","aaaaaaaa@aaaaaaaaa.aa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000A00","AAAAAAAA AAA AAAAAAA" +"00,000",,"aaaaa@aaaaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00A000","AAAA" +"000,000",,"aaaaa.aaaaaaaaaa@aa.aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000A0A00","AAAA" +"00,000",,"aaaaaaaaa@aaaaaaaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000A00A","AAAA" +"00,000",,"aaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000A00A","AAAA" +"00,000",,"aaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000A00A","AAAA" +"00,000",,"aaaaaaaa00@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000A00A","AAAA" +"000,000","00,000","aaaaaa00@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000A00A","AAAAAAAA" +"00,000","00,000","aaaa_aaa00@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000A00","AAAAAAAA AAA AAAAAAA" +"000,000",,"aaaaaaaaaaaaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00AA00","AAAA" +"000,000","000,000","Aaaaa.Aaaaaa@Aaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A0A00AA","AAAAAAAA" +"000,000",,"Aaaaa.Aaaaaa@Aaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A0A00AA","AAAA" +"000,000",,"Aaaaaaaaaaaaaa.Aaaaaaaaa@aaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A0A00AA","AAAA" +"00,000","00,000","aaaaaa.aaaaaaa@aa.aa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000A00","AAAAAAAA AAA AAAAAAA" +"000,000","000,000","aaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000000","AAAAAAAA" +"0,000","000,000","aaaaaa_a00@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000A00","AAAAAAAA" +"000,000","000,000","aaaaaaa.aaaaa@aaaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAAAAAA" +"000,000",,"aaaa@aaaaaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000A00","AAAA" +"00,000","00,000","aaaaaa_aaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000A00","AAAAAAAA" +"00,000","000,000","aaaaaaa.aaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00A00A","AAAAAAAA" +"00,000",,"aaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00A00A","AAAA" +"00,000",,"aaaaaa0@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000000","AAAA" +"00,000","000,000","aaaa.aaaaa0@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000000","AAAAAAAA" +"00,000",,"Aaaaa_Aaaaa@aaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000000","AAAA" +"000,000",,"aaaaa@aaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"00,000",,"aaaaaaaa000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A0A0A0A","AAAA" +"000,000",,"aaaa@aaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA00AA0A","AAAA" +"0,000","00,000","aaaaaa.aaaaa@aaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAAAA AAAA AAAAA" +"0,000",,"aaaaaa_aaaaa@aaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"0,000",,"aaaaaaa00@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000","00,000","aaaaaaaa00@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000000","AAAAAAAA AAA AAAAAAA" +"000,000","000,000","aaaa@aaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000A0A","AAAAAAAA AAA AAAAAAA" +"000,000",,"aaaaaaa.aaaaaaaa00@a-aaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000000","AAAA" +"00,000","000,000","a_aaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA00A00A","AAAAAAAA" +"00,000","00,000","aaaaaaaaaa0000@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA0AAA0A","AAAAAAAA AAA AAAAAAA" +"000,000",,"aaaaaaaaaaa00@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA00A000","AAAA" +"00,000",,"aaaaaaaaaaa@aa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaaaa00@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000","00,000","aaaaa_aaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA000A0A00","AAAAAAAA" +"00,000","00,000","Aaaa_Aaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000000A","AAAAAA AAAA AAAAA" +"00,000",,"aaaaaaa_aaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000000A","AAAA" +"00,000",,"aa_aaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000000","AAAA" +"000,000",,"aaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000A00A","AAAA" +"00,000",,"aaaaaaa@aaaaa.aa.aa",00/00/0000 0:00:00AA,"0,000.00","AAA0000A000","AAAA" +"00,000",,"aaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000A000","AAAA" +"00,000",,"Aaa.a.aaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000AA00","AAAA" +"00,000",,"Aaaaaaa00@aaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA00A00A","AAAA" +"000,000","0,000","Aaaaaaa@aaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000A00","AAAAAAAA" +"000,000","000,000","aaaaaaa0@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000A00","AAAAAAAA" +"000,000","0,000","aaaaaaa00@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000A00","AAAAAAAA" +"000,000","00,000","aaaaaaaaaaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA00A0A00","AAAAAAAA AAA AAAAAAA" +"00,000","000,000","aaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000000A","AAAAAAAA" +"00,000",,"aa_aaa00@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000A00A","AAAA" +"00,000",,"aaaa-aaaaaa-aaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000A00A","AAAA" +"00,000",,"aaaaaaa.aaaaa@aaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00A000","AAAA" +"000,000","0,000","aaaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000A0A00","AAAAAAAA" +"000,000","0,000","aaaaaaaa@aaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000A00","AAAAAAAA" +"00,000","00,000","aaaa.aaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAAAAAA" +"00,000","00,000","aaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAAAAAA" +"00,000",,"aaaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"00,000",,"aaaa.a.aaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"00,000","00,000","aaaaaaaaaaaaa0@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAAAAAA" +"00,000",,"aaaaaaaa@aaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"00,000","00,000","aaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAAAAAA" +"00,000",,"aaaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA000A00","AAAA" +"00,000","00,000","aaaaaaa0@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA000A00","AAAAAA AAAA AAAAA" +"00,000","000,000","aaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA000A00","AAAAAAAA AAA AAAAAAA" +0,"00,000","aaaaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000A0A","AAAAAAAA" +"000,000",,"aaaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000000A","AAAA" +"00,000",,"aaaaaa.aaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000A00A","AAAA" +"00,000",,"aaaaaa.aaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000A00A","AAAA" +"00,000",,"aaaa_aaaaaaaaa@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000A00A","AAAA" +"00,000",,"aaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000A00A","AAAA" +"00,000",,"a0aaaaaaa00@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000A00A","AAAA" +"00,000",,"aaaaaaa.aaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000A00A","AAAA" +"00,000",,"aaaa00@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000A00A","AAAA" +"00,000",,"aaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000A00A","AAAA" +"00,000",,"aaaaaaaaaa00@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000A00A","AAAA" +"00,000",,"aaaa.aaaaaa@aaaaaa.aaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000A00A","AAAA" +"00,000","000,000","aaaa0000@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000A00A","AAAAAAAA" +"00,000",,"aaaa.a.aaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000A00A","AAAA" +"00,000","000,000","aaaaaaa@aaaaaaaaa.aa",00/00/0000 00:00:00AA,"0,000.00","AAA0A000000","AAAAAAAA" +"00,000",,"aaaa@aaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000","000,000","aaaaaa_aaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000000","AAAAAAAA" +"00,000","000,000","Aaaaaaaa.Aaaaaa@aaaaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000000","AAAAAA AAAA AAAAA" +"000,000",,"aaaaa.aaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000A00A","AAAA" +"00,000","000,000","aaaaaaaa000@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAAAAAA" +"00,000",,"aaaaaaaaa@aaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAA" +"0,000",,"aaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000A00A","AAAA" +"000,000",,"aaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00A00A","AAAA" +"000,000","00,000","aaaaaaa@aaaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAAAAAA" +"00,000","000,000","aaaaa.aaaaaaaaa@aaaaaa.aaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA00","AAAAAAAA AAA AAAAAAA" +"00,000","00,000","aaaaaaa0a@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000000","AAAAAAAA" +"00,000",,"Aaaaa.Aaaaaaaa@aaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA00","AAAA" +"000,000",,"aaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000A0A","AAAA" +"000,000",,"aaaaaaaa.aaaaaaa@aaaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000000","AAAA" +"000,000","00,000","aaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAAAAAA" +"0,000",,"aaaaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00AA0A","AAAA" +"00,000",,"aaaaa0000@aaaaaaa.aaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA00AA0A0","AAAA" +"00,000",,"Aaaaaaaa_Aaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA00AA0A0","AAAA" +"00,000",,"aaaa0000@aaaaaaa.aaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA00AA0A0","AAAA" +"00,000",,"aaaaaaaaaaa0@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000AA00","AAAA" +"00,000",,"aaaaa0a@aaa.aa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000AA00","AAAA" +"00,000","000,000","aaaaa0a@aaa.aa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000AA00","AAAAAAAA" +"00,000","00,000","aaaaaaa.aaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA00A000","AAAAAAAA" +"00,000",,"aaaaa00@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000A00A0","AAAA" +"00,000","00,000","aaaaaa00@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000000","AAAAAAAA AAA AAAAAAA" +"00,000",,"aaaaaa00@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000000","AAAA" +"00,000",,"aaaaaa@aaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000000","AAAA" +"000,000","000,000","aaaaa@aaaaaaaaa.aa.aa",00/00/0000 0:00:00AA,"0,000.00","AAAAA0A00AA","AAAAAAAA AAA AAAAAAA" +"000,000","000,000","aaaa.aaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000A00A","AAAAAAAA" +"00,000","00,000","aaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000A00","AAAAAAAA" +"000,000",,"aaaa000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000A00","AAAA" +"0,000","00,000","aaaaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000000","AAAAAAAA AAA AAAAAAA" +"0,000",,"aaaaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000000","AAAA" +"00,000","00,000","aaaaaaaaaaaaa00@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000000A","AAAAAAAA" +"0,000",,"AAAAA_AAAAAAAA@AAAAA.AAA",00/00/0000 00:00:00AA,"0,000.00","AAA0000000A","AAAA" +"00,000",,"aaa000@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00AA0A","AAAA" +"00,000",,"aaaaaaa@aaaa.aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A000000","AAAA" +"000,000","000,000","aaaa.aaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA000AAAA0","AAAAAAAA" +"000,000","00,000","aaaaa.aaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000000","AAAAAAAA" +"000,000",,"aaaaaaaaa.a.aaaaa@aaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A0AA000","AAAA" +"00,000",,"aaaa.aaaa@aaaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A0A000A","AAAA" +"00,000","00,000","aaaaaaa00@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000A000","AAAAAAAA" +"000,000",,"aaaaaaaaaa00@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A000000","AAAA" +"000,000",,"aaaaaaaaaa@aaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA000A0A","AAAA" +"00,000","000,000","a.aaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000000","AAAAAAAA" +"000,000","00,000","aaaaa.aaaaaaaaa@aaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA000A0A","AAAAAAAA" +"000,000",,"Aaaaaa.Aaaaaa@aaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A000000","AAAA" +"000,000",,"aaaaaaa0@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA000000","AAAA" +"000,000","00,000","aaaaaaaaaa@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A000000","AAAAAAAA" +"000,000","000,000","aaaaaaaaaaa@aaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A000000","AAAAAA AAAA AAAAA" +"000,000",,"aaaaaaaaa_aaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A000000","AAAA" +"000,000",,"AAaaaaaaaaa@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A000000","AAAA" +"00,000","000,000","aaaaaaaaaa00@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000A000","AAAAAAAA" +"00,000",,"aaaaaaaa.aaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000A000","AAAA" +"00,000","000,000","aaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA00000A","AAAAAAAA" +"000,000",,"aaaaaaaaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000A000","AAAA" +"000,000","00,000","aaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A000A00","AAAAAAAA" +"000,000",,"aaaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A000A00","AAAA" +"00,000",,"aaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000A00A","AAAA" +"000,000",,"aaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A000A00","AAAA" +"000,000","00,000","aaaaaaa0000@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A000A00","AAAAAA AAAA AAAAA" +"000,000","000,000","aaaaaaa000@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00A000","AAAAAAAA" +"00,000","000,000","aaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA000A0000","AAAAAAAA" +"00,000","0,000","aaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA000A0000","AAAAAAAA" +"000,000",,"aaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000000","AAAA" +"00,000","000,000","aaaaa0000@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000000","AAAAAA AAAA AAAAA" +"00,000",,"aaaaaaa@aaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000000","AAAA" +"000,000",,"aaaaaaaaaaaa00@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA00A00A0","AAAA" +"000,000",,"aaaaaaa.aaaaa@aaaaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA00A00A0","AAAA" +"000,000",,"aaaa.aaaaaaa@aaaaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA00A00A0","AAAA" +"000,000",,"aaaaa.aaaaa@aaaaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA00A00A0","AAAA" +"000,000",,"aaaaa.aaaaaaaa@aaaaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA00A00A0","AAAA" +"000,000","0,000","AAAAAA.AAAAAAAAA@aaaaaaaaa.aa",00/00/0000 00:00:00AA,"0,000.00","AAAA00A00A0","AAAAAAAA" +"000,000",,"aaa00000@AAA.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA00A00A0","AAAA" +"000,000",,"aaaaaaaa000@aaaaaaaaa.aa",00/00/0000 00:00:00AA,"0,000.00","AAAA00A00A0","AAAA" +"000,000",,"aaaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA00A00A0","AAAA" +"00,000",,"0aaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000A00","AAAA" +"00,000","00,000","aaaaa000000@aaaaa.aaa.aa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000000","AAAAAAAA" +"00,000","00,000","aaaa00@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000A00A","AAAAAAAA AAA AAAAAAA" +"00,000",,"aaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA00AAA00","AAAA" +"00,000",,"aaaaaa.aaaaaaaaa@aaaaaa.aa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00A00A","AAAA" +"00,000",,"aaaaaaa.aaaaaaa@aaaaaa.aa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00A00A","AAAA" +"000,000","000,000","aaaa.aaaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000000A","AAAAAAAA" +"000,000","00,000","aaaaa0@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A0A0AA0","AAAAAAAA" +"000,000","00,000","aaaaa.aaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000A0A","AAAAAAAA" +"000,000",,"AaaaAAaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00A000","AAAA" +"000,000","000,000","aaaaaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000A00","AAAAAA AAAA AAAAA" +"00,000",,"Aaaaa.Aaaaaaaa@aaa.aaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA00","AAAA" +"00,000","000,000","aaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000A0AAA","AAAAAAAA AAA AAAAAAA" +"000,000",,"aaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000A0A","AAAA" +"00,000",,"aaaaa000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000000A","AAAA" +"00,000",,"aaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA00","AAAA" +"00,000",,"aaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA00","AAAA" +"00,000",,"aaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA00","AAAA" +"00,000",,"aaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA00","AAAA" +"00,000",,"aaaaaa.aa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA00","AAAA" +"00,000",,"aaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA00","AAAA" +"00,000",,"aaaaaaaa.a@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA00","AAAA" +"00,000",,"aaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA00","AAAA" +"00,000",,"aaaaaaaa00@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA00","AAAA" +"00,000","00,000","aaaaaaaaaa000@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA00","AAAAAAAA" +"00,000","00,000","aaaaaaaaa00@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA00","AAAAAAAA" +"00,000",,"aaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA00","AAAA" +"00,000",,"aaaaaaa_000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA00","AAAA" +"00,000",,"aaaaaaaaaa0000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA00","AAAA" +"00,000",,"aaaaa_0a@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA00","AAAA" +"00,000",,"aaaaaaaaaa00@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA00","AAAA" +"00,000",,"aaaaa00@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA00","AAAA" +"00,000",,"aaaaaaaa000@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA00","AAAA" +"00,000",,"aaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA00","AAAA" +"00,000",,"aaaa000@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA00","AAAA" +"00,000",,"aaaaa000@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA00","AAAA" +"00,000",,"aaaaa_aaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA00","AAAA" +"00,000",,"aaaaaa.aaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA00","AAAA" +"00,000",,"aaaaa.aaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA00","AAAA" +"00,000",,"aaaaaaaaa000@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA00","AAAA" +"000,000",,"aaaa000@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00A000","AAAA" +"000,000",,"aaaaa000@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00A000","AAAA" +"000,000","000,000","aaaaaa.aaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00A000","AAAAAAAA" +"000,000",,"aaaaaaa000@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00A000","AAAA" +"000,000",,"aaaaaaa.aaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000000A","AAAA" +"000,000",,"aaaa00@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000000A","AAAA" +"000,000",,"aaaaaaaa.aaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000000A","AAAA" +"000,000","000,000","aaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000AAA00","AAAAAAAA" +"000,000","000,000","aaaaa__0000@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000000A","AAAAAAAA" +"000,000","000,000","aaaaa.aaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000A0A00","AAAAAAAA" +"000,000",,"aaaa.aaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000A0A00","AAAA" +"00,000",,"aaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAA" +"00,000",,"aaaaa00000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAA" +"00,000",,"aaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAA" +"00,000",,"aaaaaaaaaaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAA" +"000,000","000,000","Aaaaaa.Aaaaaaa@aaaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00000A","AAAAAAAA" +"00,000","00,000","aaaaa.a.aaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000000","AAAAAAAA" +"000,000","00,000","aaaaaaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00AA0A","AAAAAAAA" +"00,000",,"aaaaaa00@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000A00","AAAA" +"00,000",,"aaaaaaaaaaaaa@Aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAA" +"00,000","000,000","aaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAAAA AAAA AAAAA" +"00,000",,"aaaaa0000@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000000","AAAA" +"00,000","000,000","aaaaaaa.aaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000AA00","AAAAAAAA AAA AAAAAAA" +"00,000",,"aaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000A0A","AAAA" +"00,000","00,000","aaaa00@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000A000","AAAAAAAA" +"00,000","000,000","aaaaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA000A00","AAAAAAAA AAA AAAAAAA" +"000,000",,"aaaaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00A00A","AAAA" +"000,000",,"aaaaaaaa_000@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA000A0000","AAAA" +"000,000",,"aaaaaa0000@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA000A0000","AAAA" +"000,000",,"aaaaaaaa@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA000A0000","AAAA" +"000,000",,"aaaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA000A0000","AAAA" +"000,000",,"aaaaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA000A0000","AAAA" +"000,000","000,000","aaaaa@aaa.aa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000000","AAAAAAAA" +"00,000","00,000","aaaa.aaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000A0A","AAAAAAAA AAA AAAAAAA" +"00,000","000,000","aaaaaaaa0000@aaaaa.aaa.aa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000A0A","AAAAAAAA AAA AAAAAAA" +"00,000",,"aaaaaa.aaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000A0A","AAAA" +"00,000","00,000","aaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000A00A","AAAAAAAA" +"000,000","000,000","Aaaa.Aaaaaaaaa@aaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000AA0A0","AAAAAAAA" +"000,000","000,000","aaaaaaa@aaaa.aa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00A00A","AAAAAAAA" +"00,000","000,000","aaaaaaaa_aaaaaaaa@aaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000A00A","AAAAAA AAAA AAAAA" +"000,000","00,000","Aaaaaaaa.A.Aaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000A00","AAAAAAAA" +"0,000","000,000","aaaa.aaaaaaaaaa@aaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000A00A","AAAAAAAA" +"000,000","000,000","aaaa@aaaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000A0A","AAAAAAAA AAA AAAAAAA" +"000,000","0,000","aaaaaa@aaaaaaaaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA000000","AAAAAAAA" +"000,000",,"aaaaaaaa@aaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA000000","AAAA" +"000,000",,"aaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000A00A","AAAA" +"000,000",,"aaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000A00A","AAAA" +"000,000",,"aaaaaaaa@aaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000A00A","AAAA" +"000,000",,"aaaaaaaaaaaaa00@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000A00A","AAAA" +"000,000",,"aaaaaa00@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000A00A","AAAA" +"000,000",,"aaaaaaaaaa0a@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000A00A","AAAA" +"000,000",,"aaaaaaaaaa@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000A00A","AAAA" +"000,000",,"aaaaaaaa0@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000A00A","AAAA" +"000,000",,"aaaaaaa@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000A00A","AAAA" +"000,000",,"aaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000A00A","AAAA" +"000,000",,"aaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000A00A","AAAA" +"000,000","00,000","aaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000A00A","AAAAAAAA" +"000,000",,"aaaaaa0000@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000A00A","AAAA" +"000,000",,"aaaaa0000@aaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000A00A","AAAA" +"000,000",,"aaaaaaaaaaaa00@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000A00A","AAAA" +"000,000",,"aaaaaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000A00A","AAAA" +"000,000",,"aaaaa@aaaaaaaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000A00A","AAAA" +"000,000",,"aaaaa.aaaaaaa@aaaa-aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000A00A","AAAA" +"000,000",,"aaaa00@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000A00A","AAAA" +"000,000",,"aaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000A00A","AAAA" +"000,000",,"aaaa@aaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000A00A","AAAA" +"000,000",,"aaaaaaaa00000@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000A00A","AAAA" +"000,000",,"aaaaaaaaa@aaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000A00A","AAAA" +"000,000",,"aaa_aaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000A00A","AAAA" +"000,000",,"aaaaaaaa00000@aaaaa.aa",00/00/0000 00:00:00AA,"0,000.00","AAA0000A00A","AAAA" +"000,000",,"aaaaaaaa0aaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000A00A","AAAA" +"000,000",,"aaaaaaaa0@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000A00A","AAAA" +"000,000",,"aaaaaaaaaa@aaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000A00A","AAAA" +"000,000",,"aaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000A00A","AAAA" +"000,000",,"aaaaaaaaaaaaaaa0000@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000A00A","AAAA" +"000,000",,"aaaaa@aaaaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000A00A","AAAA" +"000,000",,"aaaaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000A00A","AAAA" +"000,000",,"aaaa_aaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000A00A","AAAA" +"000,000",,"aaaaaaaaaaaaaaa@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000A00A","AAAA" +"000,000",,"aaaaaaaaaaa@aaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000A00A","AAAA" +"000,000",,"aaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000A00A","AAAA" +"000,000","00,000","aaaa.aa@aaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00AA00","AAAAAAAA AAA AAAAAAA" +"000,000",,"aaaaa.aaa@aaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00AA00","AAAA" +"000,000",,"aaa-0@aaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00AA00","AAAA" +"000,000",,"aaaaaaaaaa_00@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA0A00AA","AAAA" +"00,000",,"aaa0@aaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00A00A","AAAA" +"00,000",,"aaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000000","AAAA" +"000,000","000,000","aaaaaaa.a.aaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA000A0A","AAAAAAAA" +"000,000",,"aaaaaa@aaaaaa-aaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000A00A","AAAA" +"00,000","000,000","Aaaa.Aaaaaaa@Aaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000A000","AAAAAAAA" +"000,000",,"aaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000A00A","AAAA" +"000,000",,"aaaaa.aaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000A00A","AAAA" +"00,000",,"aaaaaaa.aaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A0AA00A","AAAA" +"000,000","00,000","Aaaaaaa_aaaaaa@aaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA000A000A","AAAAAAAA AAA AAAAAAA" +"000,000","00,000","aaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000000A","AAAAAAAA" +"00,000","000,000","aaaaaaaaa@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A000A00","AAAAAAAA" +"00,000","00,000","aaaaaaa00@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA00A00AA","AAAAAAAA" +"0,000",,"A.Aaaaaa@aaaa.aa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA00A00A0","AAAA" +"000,000",,"aaa.aaaaaaaaa@aaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000000","AAAA" +"000,000",,"aaaa.aaaaa_aaaaa@aaaa.aa",00/00/0000 00:00:00AA,"0,000.00","AAA0000AA00","AAAA" +"000,000","00,000","aaaa-aaaaa.aaaaaaaa@aaaa.aa",00/00/0000 00:00:00AA,"0,000.00","AAA0000AA00","AAAAAAAA" +"000,000",,"aaaaaaa.aaaaaa@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000AA00","AAAA" +"000,000","000,000","aaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00A000","AAAAAAAA AAA AAAAAAA" +"000,000","000,000","aaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00A000","AAAAAAAA" +"0,000",,"AAAAAAA.AAAA@AAAAAAA.AAA",00/00/0000 00:00:00AA,"0,000.00","AAAA000000A","AAAA" +"00,000",,"aaaaaa.aaaaaa@aaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA00A000A","AAAA" +"000,000",,"AAAAAAA_AAAAA@AAAAAAAAAAA.AAA",00/00/0000 00:00:00AA,"0,000.00","AAA0A0A00AA","AAAA" +"000,000","000,000","aaaaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000000A","AAAAAAAA" +"000,000",,"aaaaaaaaaaaa@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000000","AAAA" +"000,000",,"AAAA_AAAAAAA@AAAAAAAAAAA.AAA",00/00/0000 00:00:00AA,"0,000.00","AAA0A0A00AA","AAAA" +"000,000",,"AAAAAAAA@AAAAAAA.AAA",00/00/0000 00:00:00AA,"0,000.00","AAA0A0A00AA","AAAA" +"000,000",,"AAAAAA_AAAA@AAAAAAAAAAA.AAA",00/00/0000 00:00:00AA,"0,000.00","AAA0A0A00AA","AAAA" +"000,000","000,000","AAAAAAA@AAAAAAA.AAA",00/00/0000 00:00:00AA,"0,000.00","AAA0A0A00AA","AAAAAAAA" +"000,000",,"AAAAA_AAAAAAAA@AAAAAAAAAAA.AAA",00/00/0000 00:00:00AA,"0,000.00","AAA0A0A00AA","AAAA" +"000,000",,"AAA_AAAA@AAAAAAAAAAA.AAA",00/00/0000 00:00:00AA,"0,000.00","AAA0A0A00AA","AAAA" +"000,000",,"AAAAA_AAAAAA@AAAAAAAAAAA.AAA",00/00/0000 00:00:00AA,"0,000.00","AAA0A0A00AA","AAAA" +"0,000","00,000","aaaaa0000@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A000A00","AAAAAAAA" +"000,000",,"AAAAAA_AAAAAAA@AAAAAAAAAAA.AAA",00/00/0000 00:00:00AA,"0,000.00","AAA0A0A00AA","AAAA" +"00,000",,"aaaaaaaaaaaa00@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000A000","AAAA" +"0,000",,"aaaaaaa0@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA000A00AA","AAAA" +"000,000","00,000","aaaaaa@aaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00A000","AAAAAAAA" +"000,000",,"aaaaaaaa@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00A000","AAAA" +"000,000","00,000","aaaaa000@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00A000","AAAAAAAA" +"00,000",,"aaaaaaaaaaaa@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA00A00A","AAAA" +"00,000","000,000","aaaaaaaaaaaaaaaaaa@aaaaa.aa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00000A","AAAAAAAA AAA AAAAAAA" +"00,000",,"a00aaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA00A00A","AAAA" +"000,000",,"aaaa0_aaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000AA0A","AAAA" +"000,000",,"aaaaaaa@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000A000","AAAA" +"000,000",,"aaaaaa0000@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000A0A","AAAA" +"00,000",,"aaaaaaaa@aaaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA00AAAA0","AAAA" +"000,000",,"aaaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000AA00","AAAA" +"00,000",,"aaaaaaa.aaaaaaa@aaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000000A","AAAA" +"00,000","000,000","Aaaaaa.aaaaaaa@aaaa.aa",00/00/0000 00:00:00AA,"0,000.00","AAAA00AAAA0","AAAAAAAA" +"000,000","000,000","aaaaa00@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000000A","AAAAAAAA" +"00,000",,"aaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA00","AAAA" +"00,000","000,000","aaaaaaaaaaaaaaa@aaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA00","AAAAAAAA" +"00,000","0,000","aaaaaaaaa@aaaaaaaa.aa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA00","AAAAAAAA" +"000,000","00,000","aaaaaaaaa.aaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000A000","AAAAAAAA AAA AAAAAAA" +"000,000","00,000","aaaaa.aaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000A000","AAAAAAAA" +"000,000",000,"aaaaaaaaaa00@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00A000","AAAAAAAA" +"00,000",,"aaaaaaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000A00","AAAA" +"000,000",,"Aaa.aaaaaaaaa@aaa.aa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"00,000",,"Aaaaa.aaaaa@aaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAA" +"00,000",,"aaaaaaaa.aaaaaa@aaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAA" +"00,000",,"aaaaaaaaa@aaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00A000","AAAA" +"000,000",,"aaaaaaaa@aaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAA" +"000,000",,"aaaaaa@aaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAA" +"000,000",,"aaaaaaaa@aaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAA" +"00,000",,"aaaaa@aaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA00","AAAA" +"000,000",,"aaaaaaa00000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000A000A","AAAA" +"00,000",,"aaaaaaa-aaaaa@aaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000AA00A","AAAA" +"0,000","000,000","aaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000AA0A","AAAAAAAA" +"00,000",,"aaaaaa@aaaa.aa",00/00/0000 0:00:00AA,"0,000.00","AAA0000AA00","AAAA" +"000,000",,"aaaaa@a0aaaaaa.aa",00/00/0000 0:00:00AA,"0,000.00","AAA00000A0A","AAAA" +000,,"aaaaaaaaaaa00@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000A00","AAAA" +"00,000","00,000","aaaaaaaaaaaa@aaaaaaaaa.aa",00/00/0000 0:00:00AA,"0,000.00","AAA00000A0A","AAAAAAAA AAA AAAAAAA" +"000,000",,"aaaaa@aaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000A00","AAAA" +"00,000","000,000","aaaaaaaaa00@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA00","AAAAAAAA" +"00,000",,"aaaaaaaaa00@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA00","AAAA" +"000,000",,"aaa00@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000000","AAAA" +"00,000",,"aaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA00","AAAA" +"00,000",,"aaaa@aaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAA" +"00,000","0,000","aaaaaa0000@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAAAA AAAA AAAAA" +"0,000","00,000","aaaaaaaaa_aaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000A00AA","AAAAAAAA AAA AAAAAAA" +"00,000",,"aaaaaaaa_aaaa00@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA00","AAAA" +"000,000","0,000","aaaaa00@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000A00A","AAAAAAAA AAA AAAAAAA" +"00,000",,"aaaaaaaaaaaaaaa@aaaaaaaaa.aa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000","000,000","aaaaaa0000@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000A00A","AAAAAAAA" +"000,000",,"aaaa_00@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000A00A","AAAA" +"000,000",,"aaaaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000A00A","AAAA" +"00,000",,"aaaaaaaaa_aaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000A00A","AAAA" +"00,000",,"aaaaaaaaaaaaaa000@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000A00A","AAAA" +"00,000",,"aaaaa_aaaaaa00@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000A00A","AAAA" +"00,000",,"aaaaaaaaaaa00@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000A00A","AAAA" +"00,000",,"aaaaaaa00@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000A00A","AAAA" +"00,000",,"aaaa_000@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000A00A","AAAA" +"00,000",,"aa_aa@aaaaaaa.aa",00/00/0000 0:00:00AA,"0,000.00","AAAA000A00A","AAAA" +"000,000","0,000","aaaaaa0a0@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000A00A","AAAAAAAA" +"00,000",,"aaaaa000000@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000000","AAAA" +"00,000",,"Aaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000000","AAAA" +"00,000",,"aaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000000","AAAA" +"00,000",,"aaaaa.aaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000000","AAAA" +"00,000","000,000","aaaaaaaa00@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000A000","AAAAAAAA" +"00,000",,"aaaaaaaaaaa@aaaaa.aa",00/00/0000 00:00:00AA,"0,000.00","AAAA000A000","AAAA" +"000,000",,"aaaaaa0000@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000000","AAAA" +"000,000",,"aaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000000A","AAAA" +"00,000","000,000","aaaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000000A","AAAAAAAA" +"00,000","000,000","aaaa__a@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000A00","AAAAAAAA" +"000,000","000,000","aaa000@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A000000","AAAAAA AAAA AAAAA" +"000,000",,"aaaaaaaaa@aaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000A0A","AAAA" +"00,000","000,000","Aaaaaa000@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000AA0A","AAAAAAAA" +"000,000",,"aaaaa_0000@aaaaa.aa",00/00/0000 00:00:00AA,"0,000.00","AAA00000A00","AAAA" +"00,000",,"aaaaa0-0@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000A00A","AAAA" +"000,000","000,000","aaaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A000000","AAAAAAAA AAA AAAAAAA" +"00,000",,"aaaaaaaaa0000@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA00A0A00","AAAA" +"000,000","000,000","aaaaaa0000@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000A000","AAAAAA AAAA AAAAA" +"000,000","000,000","aaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000A00","AAAAAAAA" +"000,000",,"aaaaaaa000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00AA0A","AAAA" +"00,000",,"0000000000@aa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA00000A","AAAA" +"00,000","00,000","aaaaaaaaa000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000000","AAAAAAAA" +"000,000","000,000","aaaaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA00000A","AAAAAAAA" +"00,000",,"aaaaaaa@aaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000000","AAAA" +000,000,"00aaaaaaa@aaaaa.aaa.aa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000A00","AAAAAAAA" +"000,000","000,000","aaaaaaaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAAAAAA" +"00,000","00,000","aaaaaa0@aa.aa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000A00","AAAAAAAA" +"00,000",,"aaa.aaaaa@aaaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000A000","AAAA" +"00,000",,"aaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000A000","AAAA" +"00,000",,"aaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000A000","AAAA" +"00,000",,"aaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000A000","AAAA" +"00,000",,"aaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000A000","AAAA" +"000,000",,"Aaaaaaaa.Aaaaaa@aaa-aaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000A000","AAAA" +"000,000",,"aaaa.aaaaaaaa@aaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000A000","AAAA" +"000,000",,"Aaaa.Aaaaaaa@aaaaaaaaaaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000AA00","AAAA" +"00,000","00,000","aaaaaaaaaa000@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000A0A","AAAAAAAA" +"000,000","00,000","aaa.aaaaaa@aaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000A000","AAAAAAAA" +"00,000",,"aaaaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000A0A","AAAA" +"00,000",,"aaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000A0A","AAAA" +"00,000","00,000","aaaaa00@aaaaa.aa",00/00/0000 0:00:00AA,"0,000.00","AAAA000A00A","AAAAAAAA" +"000,000","00,000","aaaaaaaa@aaaaaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000A00","AAAAAAAA" +"0,000","000,000","aaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000A00","AAAAAAAA" +"00,000","000,000","aaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000A000","AAAAAAAA AAA AAAAAAA" +"00,000",,"aaaaaaa0@aaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00A000","AAAA" +"000,000",,"aaa_a@aaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000A000","AAAA" +"000,000",,"aaaaaaaa000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000A000","AAAA" +"00,000","00,000","aaaa0@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000A0A","AAAAAA AAAA AAAAA" +"000,000",,"aaa@aaaaaaaa.aa",00/00/0000 0:00:00AA,"0,000.00","AAA0000A00A","AAAA" +"000,000",,"aaaaaaa.aaaaa@aaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000A000","AAAA" +"000,000","000,000","aaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000A0A","AAAAAAAA" +"00,000","00,000","AAAAAAAAAA@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000AA00","AAAAAAAA AAA AAAAAAA" +"0,000",,"aaaaaaaaa0000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000A00","AAAA" +"00,000","000,000","aaaaaaa@aaaaaaa-aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA00A00A","AAAAAAAA" +"000,000","0,000","aaaaaaaa@aaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00A000","AAAAAAAA AAA AAAAAAA" +"000,000","00,000","a.aaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000A0A","AAAAAAAA" +"000,000","00,000","aaaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA00A000A","AAAAAAAA" +"000,000","00,000","aaaaaa__aaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA00A000A","AAAAAAAA AAA AAAAAAA" +"000,000","00,000","aaaaa.aaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA000A0AA0","AAAAAAAA" +"000,000",,"aaaaa@aaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000A000","AAAA" +"000,000","000,000","aaaaaa@aaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000A000","AAAAAAAA AAA AAAAAAA" +"00,000","00,000","aaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA000A00","AAAAAAAA" +"00,000",,"aaaaaaa_aaaaaaa@aa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000A00","AAAA" +"000,000","00,000","aaaaa@aaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00000A","AAAAAAAA AAA AAAAAAA" +"00,000","000,000","aaaaaaa.aaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA000AAA00","AAAAAAAA" +"0,000",,"aaa_a_aaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000A0A","AAAA" +"00,000",,"aaaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000A000","AAAA" +"00,000",,"aaaaaa.aaaaaaaaa0000@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A000A00","AAAA" +"00,000",,"aaaaaaaa@aaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA0A00AA","AAAA" +"00,000",,"Aaaaaa_aaaaaaa@aaaaaaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA000AA0AA","AAAA" +"00,000",,"aaaaa@aaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA0A00AA","AAAA" +"000,000",,"Aaaaaa.Aaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00A000","AAAA" +"000,000","00,000","aaaaa_aaaaaa@aa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000000","AAAAAA AAAA AAAAA" +"00,000",,"aaaaa.aaaaaa@aa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000A000","AAAA" +"00,000","00,000","aaaaaaa00@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A000A00","AAAAAAAA" +"00,000",,"aaaaaaa@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A000A00","AAAA" +"00,000",,"aaaaaaa00@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA000A0AA0","AAAA" +"00,000","000,000","aaaaaaaaaaa00@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA000A0AA0","AAAAAAAA AAA AAAAAAA" +"00,000",,"aaaaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000000","AAAA" +"000,000",,"aaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000A0A","AAAA" +"00,000","000,000","aaaa.aaaaa@aaaaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA000A0AA0","AAAAAAAA" +"00,000","000,000","AaaaaAaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00A00A","AAAAAAAA" +"000,000",,"aaaa00@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA00AA00","AAAA" +"000,000",,"aaaaaaa@aaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA00AA00","AAAA" +"00,000",,"Aaaa.Aaaaaaa@aaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA000A0AA0","AAAA" +"00,000","00,000","aaaaa_aaaaaa@aaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000A00","AAAAAAAA" +"00,000","00,000","aaaaaaaaa0000@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000000A","AAAAAAAA" +"00,000",,"Aaaaaaaaa.aaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00A000","AAAA" +"00,000","000,000","aaaaaaaa@aaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000000","AAAAAAAA" +"00,000",000,"aaaa.aaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000000","AAAAAAAA AAA AAAAAAA" +"00,000",,"aaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000000","AAAA" +"00,000",,"aaaaaaaa.aaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000000","AAAA" +"00,000",,"aaaaaa.aaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000000","AAAA" +"00,000",,"aaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000000","AAAA" +"00,000",,"aaaaaaaa.aaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000000","AAAA" +"00,000",,"a_aaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000000","AAAA" +"00,000","000,000","aaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000000","AAAAAAAA" +"00,000",,"aaaaaaaa.aaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000000","AAAA" +"00,000",,"aaaaaaaa000@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000000","AAAA" +"00,000",,"aaaaaaaaaaa.aaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000000","AAAA" +"00,000",,"aaaaaaaa@aaaaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA000AA0AA","AAAA" +"00,000",,"000000@aaaaaaaaa.aaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000000","AAAA" +"00,000",,"aaaaaa.aaaaaaa.aaaa@aaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA000AA0AA","AAAA" +"000,000","00,000","aaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000AA00","AAAAAAAA" +"000,000","000,000","aaaaaaaa00@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00A000","AAAAAAAA" +"000,000",,"aaaaaaa.aaaaaaa@aaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00A000","AAAA" +"000,000",,"aaaaaaaaaa000@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00A000","AAAA" +"00,000",,"aaa@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000A000","AAAA" +"0,000",,"aaaaa.aaaaaaaaa@aaaaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000AA00","AAAA" +"00,000","00,000","aaaaaaaaaaaa00@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000000A","AAAAAAAA" +"00,000",,"aaaaaaaa0000@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000000A","AAAA" +"00,000",,"aaaaaaa@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000000","AAAA" +"00,000",,"aa@aaaa-aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000000","AAAA" +"00,000",,"aaaaaaaa@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000000","AAAA" +"00,000",,"aaaaa.aaaaaaa@aaaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000A0A","AAAA" +"000,000",,"aaaaaa@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000000","AAAA" +"000,000",,"aaaaaaaaa@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000000","AAAA" +"000,000","000,000","AAaaaaa@aaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000000","AAAAAAAA" +"000,000",,"aaaaaaaa00@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000000","AAAA" +"000,000","000,000","aaaaaa@aaaaaaaaa.aa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00A000","AAAAAAAA" +"000,000",,"aaaaaaaaa@aaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA000A0A00","AAAA" +"000,000","00,000","aaaaaaaa@aaa.aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000A00","AAAAAA AAAA AAAAA" +"000,000",,"aaaaaaa.a.aaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00A000","AAAA" +"000,000","00,000","aaaa.aaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A000000","AAAAAAAA" +"000,000",,"aaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A000000","AAAA" +"000,000",,"aaaaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000A0A","AAAA" +"000,000",,"aaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000A0A","AAAA" +"000,000",,"aaaaa.aaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000A0A","AAAA" +"00,000",,"aaaaaa.aaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000000","AAAA" +"00,000",,"aaaaaaaaaaaaa@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000000","AAAA" +"00,000",,"aaaa_aaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000000","AAAA" +"00,000","000,000","aaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA000AAA00","AAAAAAAA AAA AAAAAAA" +"00,000","00,000","aaaaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA000A0000","AAAAAAAA AAA AAAAAAA" +"00,000",,"aaaaa.aaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA000A0000","AAAA" +"000,000","00,000","aaaaaaaa@aaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000A00A","AAAAAAAA" +"00,000","00,000","aaaaa_00@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA000A0000","AAAAAAAA" +"000,000",,"aaaaaa00@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000A00A","AAAA" +"00,000",,"aaaaaaaaaa@aaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA000A0000","AAAA" +"00,000","00,000","aaaaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA00AA000","AAAAAAAA" +"00,000",,"aaaa.000@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00A00A","AAAA" +"000,000","00,000","aaaaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA000000","AAAAAA AAAA AAAAA" +"000,000","000,000","aaaaaa@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000A00","AAAAAAAA" +"00,000","00,000","aaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA000A00","AAAAAAAA" +"00,000",,"aaaaaaaaaaaa@aaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000A00","AAAA" +"000,000","000,000","aaaaaa0000@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA00A00A0","AAAAAAAA" +"00,000",,"aaaaa@aaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000A000","AAAA" +"00,000",,"aaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000AA0A","AAAA" +"00,000",,"aaaaaa_00@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000AA0A","AAAA" +"000,000","00,000","aaaaa00@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A000000","AAAAAAAA" +"000,000",,"aaaaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A000000","AAAA" +"000,000",,"aaaaaa@aaaaaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A000000","AAAA" +"000,000",,"aaaaaaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A000000","AAAA" +"00,000",,"aaaaaaaaa@aaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000000","AAAA" +"000,000",,"aaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A000000","AAAA" +"00,000",,"aaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000AA0A","AAAA" +"00,000",,"aaaaaaa_aaaaa00@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000AA0A","AAAA" +"00,000",,"aaaa_aa0@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000AA0A","AAAA" +"00,000",,"aaaa_0000@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000AA0A","AAAA" +"00,000",,"aaaaaa_aaaaaaaaa000@aaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000AA0A","AAAA" +"00,000",,"aaaaaa_aaaaaaaaa000@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000AA0A","AAAA" +"000,000","000,000","Aaaaaaaaa0@aaa.aaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A000000","AAAAAAAA" +"00,000",,"aaaa_aaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000AA0A","AAAA" +"00,000",,"aaaaaaa_aaaaaa@aaaaaa.aa",00/00/0000 00:00:00AA,"0,000.00","AAA0000AA0A","AAAA" +"00,000",,"aaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000AA0A","AAAA" +"00,000",,"aaaaaa_00@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000AA0A","AAAA" +"00,000",,"aaaaaaaa_aaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000AA0A","AAAA" +"000,000",,"Aaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000000","AAAA" +000,,"aaaaaaaa@aaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000000","AAAA" +"000,000","00,000","A.aaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000000","AAAAAAAA" +"00,000",,"aaaaaaaaaa@aaaaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000A00","AAAA" +"000,000",,"aaaaa00@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000000","AAAA" +"00,000",,"aaaaaa@aaaaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000A00","AAAA" +"00,000",,"aaaaaa@aaaaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000A00","AAAA" +"00,000",,"aaaaaaaaa_aaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000A00","AAAA" +"00,000",,"aaaaaaaa@aaaaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000A00","AAAA" +"00,000","00,000","aaa_0000@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000A00","AAAAAAAA" +"00,000",,"aaaaa@aaaaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000A00","AAAA" +"00,000",,"aaaaaa.aaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000AA000","AAAA" +"000,000","00,000","aaaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAAAAAA AAA AAAAAAA" +"000,000",,"aaaaaaaa.aaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A0A000A","AAAA" +"00,000","00,000","aaaaaaaaaaaaaa00@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA0A","AAAAAAAA" +"00,000","00,000","aaaaaaa00@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAAAAAA" +"000,000","000,000","aaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAAAA AAAA AAAAA" +"000,000","000,000","aaaaaaaaaaa_0@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000AA00","AAAAAAAA" +"00,000","00,000","aaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000A00","AAAAAAAA" +"000,000",,"aaaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000000","AAAA" +"0,000","0,000","aaaaaa00@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAAAAAA" +"00,000",,"aaaaaaa0@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA00A000A","AAAA" +"000,000","000,000","aaaa.aaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000A000","AAAAAA AAAA AAAAA" +"000,000","00,000","aaaaaaaaaaaa000@aaa.aaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000A0A00","AAAAAAAA" +"000,000",,"aaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA00AA00","AAAA" +"00,000",,"aaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000AA00","AAAA" +"00,000","00,000","aaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000AA00","AAAAAAAA" +"00,000",,"aaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000AA00","AAAA" +"00,000",,"aaaaaa00@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000AA00","AAAA" +"00,000",,"aaa_aaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000AA00","AAAA" +"00,000",,"aaaaa0000@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000AA00","AAAA" +"00,000",,"aaa0000@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000AA00","AAAA" +"00,000",,"aaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000AA00","AAAA" +"00,000",,"aaaaaa.aaaa@aaa.aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000AA00","AAAA" +"00,000",,"aaaaaa00@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000AA00","AAAA" +"00,000","00,000","aaaa0000@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000AA00","AAAAAAAA" +"00,000",,"aaaa00@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000AA00","AAAA" +"00,000",,"aaaaaaa00@aaaaa.aaa.aa",00/00/0000 0:00:00AA,"0,000.00","AAA0000AA00","AAAA" +"000,000","000,000","aaaaaa_aaaa_0@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000A00","AAAAAAAA" +"0,000","000,000","aaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA00000A","AAAAAAAA" +"0,000","000,000","aaaaaaaaaaa00@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA00000A","AAAAAAAA AAA AAAAAAA" +"000,000",,"aaaaaa@aaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00000A","AAAA" +"00,000",,"aaaaa0@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000A00A","AAAA" +"000,000",,"aaaaa@aaaaaaa.aa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000A0A","AAAA" +"000,000","00,000","aaaaaa0@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000AA00","AAAAAAAA AAA AAAAAAA" +"000,000","000,000","aaaaa00@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA00A000","AAAAAAAA" +"00,000","00,000","aaaa_0000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000000","AAAAAAAA AAA AAAAAAA" +"00,000",,"aaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000A0000","AAAA" +"00,000","00,000","aaaaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000A0000","AAAAAAAA" +"000,000",,"aaaaaaaa0aaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000AA0A","AAAA" +"000,000",,"aaaaa00@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000AA0A","AAAA" +"00,000",,"aaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000A00","AAAA" +"00,000","00,000","aaa0000@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000A00","AAAAAAAA" +"00,000","000,000","aaaa000aaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000A00","AAAAAAAA" +"000,000","000,000","aaaaaa@aaaaa-aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000000","AAAAAAAA" +"000,000",,"aaaaa.aaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000A0A00","AAAA" +"000,000",,"aaaaaa0000@aaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00000A","AAAA" +"000,000",,"aaaaaaa.aaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000A0A00","AAAA" +"00,000","000,000","aaaaaaa00000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAAAAAA" +"00,000",,"aaaaaaaaaa@aaaa.aa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"0,000",,"aaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00A000","AAAA" +"000,000",,"aaaaa_aa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAA" +"000,000",,"aaa00a@aaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAA" +"000,000","00,000","aaaaa.a.aaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000A00","AAAAAAAA" +"000,000",,"aaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000A00","AAAA" +"000,000",,"aaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA0A","AAAA" +"00,000","00,000","aaaaaaaaa@aa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000000A","AAAAAAAA" +"000,000",,"aaaaaaaaaa0000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA00000A","AAAA" +"000,000",,"aaaaaaaa@aaaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00AA00","AAAA" +"000,000",,"aaaa_aaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000AA0A","AAAA" +"000,000",,"aaaaa.aaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000AA0A","AAAA" +"000,000",,"aaaaaaaa@aaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00000A","AAAA" +"000,000","000,000","aaaa.aaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000AA0A","AAAAAA AAAA AAAAA" +"000,000","00,000","aaaaaaaaaa@aaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000A00","AAAAAAAA" +"00,000",,"aaaaaaa_aaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000AA0A","AAAA" +"00,000",,"aaaaa_aaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000AA0A","AAAA" +"000,000",,"aaaaa00@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000AA0A","AAAA" +"00,000","00,000","aaaaaaa0000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000A000","AAAAAA AAAA AAAAA" +"000,000",,"aaaaaaaa@aaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA000A00","AAAA" +"00,000","00,000","aaaaa000@aaaaa.aaa.aa",00/00/0000 00:00:00AA,"0,000.00","AAA0A000000","AAAAAAAA" +"00,000",,"Aaaaaaa0@aaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000A00","AAAA" +"000,000","00,000","aaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00A00A","AAAAAAAA" +"000,000","000,000","aaaaaaaaaaaaaaaaaa@aaaaa.aaa.aa",00/00/0000 00:00:00AA,"0,000.00","AAAAA00AA00","AAAAAA AAAA AAAAA" +"00,000",,"aaaaaaa@aaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000A000","AAAA" +"000,000",,"aa.aaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAA" +"00,000","000,000","aaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000A00","AAAAAAAA" +"00,000",,"aaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000A00","AAAA" +"00,000",,"Aaaaa0000000000@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000A00","AAAA" +"00,000",,"aa_0000@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000A00","AAAA" +"00,000",,"aaaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000A00","AAAA" +"00,000",,"aaaaaa-0000@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000A00","AAAA" +"00,000",,"aaaaaaaa0000@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000A00","AAAA" +"00,000",,"aaaaaaaaaaa_aa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000A00","AAAA" +"000,000",,"AAAAA@AAAAAAA.AAA",00/00/0000 0:00:00AA,"0,000.00","AAAAA00A00A","AAAA" +"000,000","000,000","AAAAA0000@AAAAAAA.AAA",00/00/0000 0:00:00AA,"0,000.00","AAAAA00A00A","AAAAAAAA" +"00,000","000,000","aaaa000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA00AA00","AAAAAAAA" +"00,000",,"aaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA00AA00","AAAA" +"00,000",,"aaaaa000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA00AA00","AAAA" +"000,000",,"aaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000A0A","AAAA" +"00,000","00,000","aaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000A00","AAAAAAAA" +"00,000","000,000","aaaaaaa.aaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00A00A","AAAAAAAA" +"000,000",,"AaaaaA@aaa.a00.aa.aa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000000","AAAA" +"00,000","000,000","aaaaa00000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00A00A","AAAAAAAA" +"000,000",,"aaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA00","AAAA" +"000,000","0,000","aaaaa.aaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA00","AAAAAAAA" +"000,000","00,000","aaaaaaa0000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA00","AAAAAAAA" +"000,000","000,000","aaaaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA00","AAAAAAAA" +"000,000",,"aaaaaaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA00","AAAA" +"000,000","000,000","aaaaaaaa00@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA00","AAAAAAAA" +"000,000",,"aaaaaaaaa000@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA00","AAAA" +"000,000","000,000","aaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA00","AAAAAAAA" +"000,000",,"aaaaaa0@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA00","AAAA" +"000,000",,"aaaaaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA00","AAAA" +"000,000","00,000","aaaaa0000@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA00","AAAAAAAA" +"000,000","000,000","aaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA00","AAAAAAAA" +"000,000",000,"aaaa000aaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA00","AAAAAAAA AAA AAAAAAA" +"000,000",,"aaaaaa0aaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA00","AAAA" +"00,000","000,000","Aaaaa_Aaaa000@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000AA000","AAAAAAAA AAA AAAAAAA" +"00,000","00,000","aaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000AA000","AAAAAA AAAA AAAAA" +"000,000",,"aaaaa_aaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA00","AAAA" +"000,000","000,000","aaaa0000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA00","AAAAAA AAAA AAAAA" +"000,000","0,000","aaaa0000@aaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA00","AAAAAAAA" +"000,000",,"aaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA00","AAAA" +"000,000","000,000","aaaaaaaa0@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA00","AAAAAA AAAA AAAAA" +"000,000",,"aaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA00","AAAA" +"000,000",,"Aaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA00","AAAA" +"000,000",,"aaaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA00","AAAA" +"000,000",,"aaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA00","AAAA" +"000,000","000,000","aaaaaaaaa@aaaaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA00","AAAAAA AAAA AAAAA" +"000,000","000,000","aaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA00","AAAAAAAA" +"000,000",,"aaaaa.aaaaaaaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA00","AAAA" +"000,000","000,000","aaaaa.aaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA00","AAAAAAAA" +"000,000","00,000","aaaaaaaaaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA00","AAAAAAAA" +"000,000","000,000","aaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA00","AAAAAAAA" +"000,000","00,000","aaaaaaaaa_0@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA00","AAAAAA AAAA AAAAA" +"00,000",,"aaaaaaaa@aaaaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A0AAA00","AAAA" +"00,000","000,000","aaaa@aaaaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A0AAA00","AAAAAAAA" +"00,000","000,000","aaaaaaa000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000A0A","AAAAAAAA" +"000,000",,"aaaaaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA00","AAAA" +"000,000",,"aaaaa@aaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA00","AAAA" +"000,000",,"aaaaaaaaaaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA00","AAAA" +"000,000",,"aaaaa_a_aaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA00","AAAA" +"000,000",,"aaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA00","AAAA" +"000,000",,"aaaa.aaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA00","AAAA" +"000,000",,"aaaaaaaaa0@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA00","AAAA" +"000,000",,"aaa@aaaaaaaa.aa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA00","AAAA" +"000,000",,"aaaaaa.aaaaa.aaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA00","AAAA" +"000,000",,"aaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA00","AAAA" +"000,000",,"aaaaaaaa@aaaa.aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA00","AAAA" +"000,000",,"aaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA00","AAAA" +"000,000","000,000","aaaaaaaaaa@aaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA00","AAAAAAAA" +"000,000","000,000","aaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA00","AAAAAAAA" +"000,000","000,000","a0_aaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA00","AAAAAAAA" +"000,000",,"Aaa@aaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA00","AAAA" +"000,000",,"aaaaaaaaaaaaaa0@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA00","AAAA" +"000,000",,"aaaaaaaa00000000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA00","AAAA" +"000,000",,"aaaaaaaaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA00","AAAA" +"000,000",,"aaaaaaaaa.aaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA00","AAAA" +"000,000",,"aaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA00","AAAA" +"000,000",,"aaaaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA00","AAAA" +"000,000",,"aaaaaaa000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA00","AAAA" +"000,000",,"aaaa_aaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA00","AAAA" +"000,000","000,000","aaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA00","AAAAAAAA AAA AAAAAAA" +"000,000",,"a0aaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA00","AAAA" +"000,000",,"aaaa.a.aaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA00","AAAA" +"000,000",,"aaaaaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA00","AAAA" +"000,000","0,000","aaaaaa.aaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA00","AAAAAAAA" +"000,000",,"aaaaaaa0@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA00","AAAA" +"000,000",,"aaa00@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA00","AAAA" +"000,000",,"aaa@a.aaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA00","AAAA" +"000,000",,"aaaaaaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA00","AAAA" +"000,000",,"aaaaa0000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA00","AAAA" +"000,000",,"aaaaaaaa.aaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA00","AAAA" +"000,000",,"aaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA00","AAAA" +"00,000",,"aaaa.a.aaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAA" +"00,000","000,000","aaaaaaa0@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000AA00","AAAAAAAA AAA AAAAAAA" +"00,000","00,000","aaaaaaa00000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000AA00","AAAAAAAA" +"0,000",,"aaaaaaaa@aaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000A00A","AAAA" +"00,000",,"aaaaa@aaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA0A00AA","AAAA" +"00,000","000,000","aaaaaaa.aaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA000AAA00","AAAAAAAA" +"000,000",,"aaaaaa.aaaaa@aaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000AA0A","AAAA" +"000,000",,"aaaaaa000@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000000","AAAA" +"000,000",,"aaaaaaaa@000.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000000","AAAA" +"00,000",,"aaaa000@aaaaa.aaa.aa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00A00A","AAAA" +"00,000","00,000","aaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000A00A","AAAAAAAA" +"00,000","0,000","aaaaaa.aaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000A00","AAAAAAAA" +"00,000",,"aaaaaa@aaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000A000","AAAA" +"000,000","00,000","aaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000000","AAAAAAAA" +"00,000",,"aaaaaaa@aaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A000000","AAAA" +"000,000","00,000","aaa.aa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000A000","AAAAAAAA" +"00,000","0,000","aaaaaaa@aaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000A000","AAAAAAAA" +"00,000",,"aaaaaaaa@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000A000","AAAA" +"00,000",,"aaaaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000A000","AAAA" +"000,000",,"aaaaaaa.a.aaaaaaaa@aaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000AA0A","AAAA" +"000,000",,"aaaaaaa.aaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A0A0AAA","AAAA" +"000,000","000,000","aaaaaaaaaaa@aaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A000000","AAAAAAAA" +"0,000","00,000","aaaaa0000@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00A000","AAAAAAAA" +"000,000",,"aaaa_aaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA000AA000","AAAA" +"000,000",,"aaaaaa.aaaaaa@aaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA000AA000","AAAA" +"000,000",,"aaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA000AA000","AAAA" +"000,000",,"aaaaaaaa@aaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA000AA000","AAAA" +"000,000",,"aaaaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA000AA000","AAAA" +"000,000",,"aaaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA000AA000","AAAA" +"000,000",,"aaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA000AA000","AAAA" +"000,000",,"aaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA000AA000","AAAA" +"000,000",,"aaaaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA000AA000","AAAA" +"000,000",,"aaaa00000@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA000AA000","AAAA" +"000,000",,"aaaaa@aa.aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA000AA000","AAAA" +"000,000",,"aaaaaa@aaaaaa.aa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA000AA000","AAAA" +"000,000",,"aaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA000AA000","AAAA" +"000,000",,"aaaaaaaaa00@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA000AA000","AAAA" +"000,000",,"aaaaa0000@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA000AA000","AAAA" +"000,000","000,000","aaaaa0000@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA000AA000","AAAAAAAA" +"000,000",,"aaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA000AA000","AAAA" +"000,000",,"aaaaa_aaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA000AA000","AAAA" +"000,000",,"aaaa.aaaaa@aa.aa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA000AA000","AAAA" +"000,000",,"aaaaaaaa@aa.aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA000AA000","AAAA" +"000,000",,"aaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA000AA000","AAAA" +"000,000",,"aaaaaaaa.0000@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA000AA000","AAAA" +"000,000",,"aaaaaaa@aaaa-aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA00A00A","AAAA" +"00,000",,"aaaaa@aaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000000","AAAA" +"00,000","000,000","aaaaaaaa@aaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00A000","AAAAAA AAAA AAAAA" +"00,000","000,000","aaaaaaaaaaaaaaaa@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000A000","AAAAAAAA" +"000,000","00,000","aaaaaaaaaaa@aaa-aaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA00A00A","AAAAAAAA" +"000,000",,"aaaaa@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA00A00A","AAAA" +"000,000",,"aaaaaaaaaaaa000@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA00AA00","AAAA" +"000,000","000,000","aaaaaaaa.aaaaaaaa@aaaaaaaaa.aa",00/00/0000 00:00:00AA,"0,000.00","AAAA00AAAA0","AAAAAAAA" +"000,000","00,000","aaaaaaaa_00@aaaaa.aa",00/00/0000 00:00:00AA,"0,000.00","AAAAA00000A","AAAAAAAA" +"00,000",,"aaaaa.aaaaa@aaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA000A0A","AAAA" +"00,000",,"aaaaa@aaaaaa.aaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA000A0A","AAAA" +"00,000",,"a.aaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00A000","AAAA" +"00,000",,"aaaaa000@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00A000","AAAA" +"000,000",,"aaaaaaaaa.a.aaaaa@aaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000","000,000","aaaaaaa@aaaaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000000A","AAAAAAAA" +"000,000",,"Aaa.Aaaaa@aaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000","000,000","aaa@aaaaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000000A","AAAAAAAA" +"000,000",,"aaaaa.aaaaaa@aaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000000A","AAAA" +"00,000","000,000","aaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000A00","AAAAAAAA" +"00,000","000,000","aaaaaaaaaaa@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000000A","AAAAAAAA" +"000,000",,"aaaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000AA00","AAAA" +"000,000","000,000","aaa0@aaa.aa",00/00/0000 00:00:00AA,"0,000.00","AAA000AA000","AAAAAA AAAA AAAAA" +"000,000",,"aaaaaa_aa_aaaa@aaaa.aa",00/00/0000 00:00:00AA,"0,000.00","AAA000AA000","AAAA" +"000,000",,"aaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000A00","AAAA" +"000,000",,"aaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000000","AAAA" +"000,000",,"aaaaaaa.aaaaaaaa@aaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000000","AAAA" +"000,000",,"aaaaaaa.aaaaaaaa@aaa.aa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000000","AAAA" +"000,000",,"aaaaa.aaaaaaaaa@aaaaa.aa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000000","AAAA" +"000,000",,"aaaaaa0@aaaaaaa.aa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000000","AAAA" +"000,000","00,000","aaaaaaaa@aaaaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000000","AAAAAAAA" +"000,000","000,000","aaaa@aaaaaaaaaaaaaaaaaa.aa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000000","AAAAAAAA" +"000,000","00,000","aaaaaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000000","AAAAAAAA" +"000,000","00,000","aaaaaa@aaaaaaaaaa.aa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000000","AAAAAAAA" +"000,000",,"aaaaaaaa.aaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000000","AAAA" +"000,000","000,000","aaaaa@aaaaaaaaaaaaaaaaaa.aa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000000","AAAAAAAA" +"000,000",,"aaaaaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000000","AAAA" +"000,000",,"aaaaaaaaaaa@aaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000000","AAAA" +"000,000",,"aaaaaa.aaaaaa@aaaaaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000000","AAAA" +"000,000","000,000","aaaa@aaaaaaaaaaaaaaaaaa.aa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000000","AAAAAAAA" +"000,000",,"aaaaaa.aaaaaaa@aaa.aa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000000","AAAA" +"000,000",,"aaaaa@aaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000000","AAAA" +"000,000",,"aaaaa.aaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000000","AAAA" +"000,000",,"aaaaaaaa@aaaaaaa.aa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000000","AAAA" +"000,000",,"aaaaaaaa@aaaaaaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000000","AAAA" +"000,000",,"aaaaaaa@aaaaaaaaa.aa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000000","AAAA" +"000,000",,"aaaaaaaaa@aaaaaaaaaaaaaaa.aa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000000","AAAA" +"000,000",,"aaaaaa@aaaaaaaaaaaaaaaaaa.aa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000000","AAAA" +"000,000",,"aaaaaaaa@aaaaaaaa-aaa.aa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000000","AAAA" +"00,000",,"aaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000A00","AAAA" +"0,000",,"aaaaaaaa000@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000A00","AAAA" +"000,000",,"aaaaaaaaaaaa_@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA000A0A00","AAAA" +"000,000",,"aaaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA000A0A00","AAAA" +"000,000",,"aaaaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000000","AAAA" +"00,000",,"aaaa.aaaaaaaaaa@aaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA000000","AAAA" +"00,000",,"aaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000AA00","AAAA" +"00,000",,"aaaaaa_a_aaaaaaaaaa00@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000AA00","AAAA" +"00,000",,"aaaaaaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000A00","AAAA" +"000,000",,"aaaaaa000000@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00A00A","AAAA" +"000,000","00,000","aaaaa0000@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000A000","AAAAAAAA AAA AAAAAAA" +"000,000",,"aaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000000","AAAA" +"000,000",,"aaaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA000000","AAAA" +"00,000",,"AaaaaaAaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA000000","AAAA" +"000,000",,"aaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA000000","AAAA" +"000,000",,"aaaaa0000@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000000","AAAA" +"000,000",,"aaa@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000000","AAAA" +"000,000","000,000","aaaaaa_aa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA00A000","AAAAAAAA" +"00,000","000,000","aaaaaaaa000@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000A000","AAAAAAAA" +"000,000",,"aaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000A00","AAAA" +"000,000","0,000","aaaaaaaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000000","AAAAAA AAAA AAAAA" +"000,000",,"aa000@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000000","AAAA" +"000,000",,"aaaaaa0@aaaaaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000000","AAAA" +"000,000","00,000","aaaaa@aaaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000000","AAAAAAAA" +"000,000","00,000","aaaaaa0000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000000","AAAAAAAA AAA AAAAAAA" +"000,000","00,000","a_aaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000000","AAAAAAAA" +"000,000","000,000","aaaaa0aaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000000","AAAAAAAA AAA AAAAAAA" +"000,000","00,000","aaaaaa00@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000000","AAAAAA AAAA AAAAA" +"000,000",,"aaaa.aaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000000","AAAA" +"000,000",,"aaaaa00000@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000000","AAAA" +"000,000","00,000","aaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000000","AAAAAAAA" +"000,000","00,000","aaaa000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000000","AAAAAAAA" +"000,000",,"aaaa_aaaaaaaa_aa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000000","AAAA" +"000,000","000,000","aaaaaa.aaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000000","AAAAAAAA" +"000,000",,"a0aaaaa0000@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000000","AAAA" +"000,000",,"aaaaaaaaa00@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000000","AAAA" +"000,000","000,000","aaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000000","AAAAAAAA" +"000,000",,"aaaaaaa0@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000000","AAAA" +"000,000",,"aaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000000","AAAA" +"000,000","000,000","aaaaaa0000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000000","AAAAAAAA" +"000,000",,"aaaaaaaa0000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000000","AAAA" +"000,000","000,000","aaa000@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000A0A","AAAAAAAA" +"00,000",,"aaaa0000@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000A00","AAAA" +"00,000","000,000","aaaaa0000@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAAAAAA" +"000,000","00,000","aaaa00@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000A0A","AAAAAAAA" +"00,000",,"aaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA00A00A","AAAA" +"000,000",,"aaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000AA000","AAAA" +"00,000",,"aaaa00@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA00","AAAA" +"0,000",,"aaaaaaaaaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000A0A","AAAA" +"00,000","00,000","aaaaaaaa.aa@aaaaa.aaa.aa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000A00","AAAAAAAA AAA AAAAAAA" +"00,000",,"aaaaa@aaaaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00A000","AAAA" +"00,000",,"aaaaa_aa00@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000000","AAAA" +"00,000","00,000","aaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAAAAAA" +000,,"aaaaaa0000@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000000","AAAA" +000,,"aaaaaaaaaaaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000000","AAAA" +000,,"aaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA00000A","AAAA" +000,,"aaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000000","AAAA" +"00,000",,"aaaaaaaaaa000@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000000","AAAA" +"000,000","000,000","aaaaaaa0aaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A0AAA00","AAAAAAAA" +"000,000","000,000","aaaaaaaaaa@aaaaaaaaa.aa",00/00/0000 0:00:00AA,"0,000.00","AAA0A0AAA00","AAAAAA AAAA AAAAA" +000,,"aaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000000","AAAA" +000,,"aaaaa.aaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA00000A","AAAA" +000,"000,000","aaaaa.aaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA00000A","AAAAAAAA" +"00,000","000,000","aaaaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000000","AAAAAAAA" +"00,000",,"aaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000000","AAAA" +"00,000",,"aaaaaaa@aaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000000","AAAA" +"000,000","00,000","aaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000A00","AAAAAAAA" +"00,000",,"aaaaaaa@aaaaaa-aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA00","AAAA" +"000,000","00,000","aaaaaaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAAAAAA" +"000,000","00,000","Aaaaa.Aaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000000","AAAAAAAA" +"000,000","000,000","aaaaaaa.a.aaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000000","AAAAAAAA AAA AAAAAAA" +"000,000","00,000","aaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000000","AAAAAAAA AAA AAAAAAA" +"000,000",,"aaaaaaaa.a.aaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000A00A","AAAA" +"000,000",,"aaaaaa.a.aaaa@aaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A0AA000","AAAA" +"000,000","000,000","aaaaaaa.aaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000A0A00","AAAAAAAA" +"000,000",,"aaaaaaaaaaaa00@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00000A","AAAA" +"00,000",,"a00aaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000000","AAAA" +"000,000","00,000","aaaa.aaaaaa-aaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000A0A00","AAAAAAAA" +"000,000","00,000","aaaaaaaaa_aa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000A0A00","AAAAAAAA" +"00,000","000,000","aaaaa0000@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000A0A","AAAAAAAA" +"000,000",,"aaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000A00","AAAA" +"000,000","000,000","aaaaaaa@aaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000A00","AAAAAAAA" +"000,000",,"aaaaaaaaa.aaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000A00","AAAA" +"000,000","000,000","aaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00000A","AAAAAAAA" +"00,000",,"aaaa000@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000000","AAAA" +"00,000",,"aaaaaaaaa@aaaaaaaaaaa.aa",00/00/0000 0:00:00AA,"0,000.00","AAAA000000A","AAAA" +"00,000","0,000","aaa0000aa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00A00A","AAAAAAAA AAA AAAAAAA" +"00,000",,"aaaaaaa@aaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000A00A","AAAA" +"000,000",,"aaaaaaaaa0000@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000A00A","AAAA" +"000,000",,"aaaaaa.aaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000A00A","AAAA" +"000,000",,"aaaaaaaa.a@aaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000A00A","AAAA" +"000,000",,"aaaa_aaaaaaaa_aa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000A00A","AAAA" +"000,000",,"aaaaaaaaa@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000A00A","AAAA" +"000,000",,"aaaa000000@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000A00A","AAAA" +"000,000",,"aaaaaaa00@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000A00A","AAAA" +"000,000",,"aa000@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000A00A","AAAA" +"000,000",,"aaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000A00A","AAAA" +"000,000",,"aaaaaaaaaa000@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000A00A","AAAA" +"000,000","000,000","aaaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000A00A","AAAAAAAA" +"000,000",,"aaaaaa@aaaaaaaaaaaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000A00A","AAAA" +"000,000",,"aaaaaa.aaaa@aaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000A00A","AAAA" +"000,000",,"aaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000A00A","AAAA" +"000,000",,"a.aaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000A00A","AAAA" +"000,000",,"aaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000A00A","AAAA" +"000,000",,"aaaaaa00@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000A00A","AAAA" +"000,000",,"aaaaa000000@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000A00A","AAAA" +"000,000",,"aaaa.aa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000A00A","AAAA" +"000,000","000,000","aaaaaaaaaaa@aaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000A00A","AAAAAA AAAA AAAAA" +"000,000",,"aaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000A00A","AAAA" +"000,000",,"aaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000A00A","AAAA" +"000,000","0,000","aaaaaaaaa.aaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000A00A","AAAAAAAA" +"000,000",,"aaaaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000A00A","AAAA" +"000,000",,"aaaaaaaaa.aaaaa@aaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000A00A","AAAA" +"000,000",,"aaaaaa000@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000A00A","AAAA" +"000,000",,"aaaaaaaaaaaa0000@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000A00A","AAAA" +"000,000",,"aaaaaaaa00@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000A00A","AAAA" +"000,000",,"aaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000A00A","AAAA" +"000,000",,"aaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000A00A","AAAA" +"000,000",,"aaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000A00A","AAAA" +"000,000",,"aaaaa00000@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000A00A","AAAA" +"000,000","000,000","aaaaaaaaaaaa0@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000000A","AAAAAAAA" +"00,000",,"aaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A000A0A","AAAA" +"000,000",,"aaaaaa000@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA000A0A0A","AAAA" +"000,000","000,000","aaaaa_aaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000A00","AAAAAA AAAA AAAAA" +"000,000","000,000","aaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000A00","AAAAAAAA" +"000,000","000,000","aaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000A00","AAAAAAAA" +"000,000",,"aaaaaaa_aaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000A00","AAAA" +"000,000",,"Aaa_aaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000A00","AAAA" +"00,000",,"aaaaaaaaaaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00A000","AAAA" +"000,000",,"aaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAA" +"000,000",,"aaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAA" +"000,000","000,000","aaaaaaa00@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000000A","AAAAAAAA" +"00,000","000,000","aa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000000","AAAAAAAA" +"00,000","00,000","aaaaaaaa@aaaaaaaaa.aa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAAAAAA" +"000,000",,"aaaaaaaaaaaaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000A000","AAAA" +"000,000",,"Aaaaaaa0@aaaa.aaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000A000","AAAA" +"000,000",,"aaaaaaaaa0000@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000A000","AAAA" +000,,"aaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA00000A","AAAA" +"000,000",,"aaa00@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000A000","AAAA" +"000,000","000,000","Aaaaaa00@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00AA00","AAAAAAAA" +"00,000",,"aa0000@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00000A","AAAA" +"00,000","00,000","aaaaaaa00@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00000A","AAAAAAAA" +"00,000","00,000","aaaaaaaa_00@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000000","AAAAAAAA AAA AAAAAAA" +"00,000",,"aaaaaaa000@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000000","AAAA" +"000,000",,"aaaaa_Aaaaa@aaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A000000","AAAA" +"00,000",,"aaaa0000@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000000","AAAA" +"00,000",,"aaaaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000000","AAAA" +"00,000",,"aaaaa.aaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000000","AAAA" +"00,000","0,000","aaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000A00A","AAAAAAAA" +"00,000",,"aaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000000","AAAA" +"000,000","00,000","aaaaa0000@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00A00A","AAAAAAAA" +"000,000",,"aaaa0000@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00A00A","AAAA" +"00,000",,"aaaa0000@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000A00","AAAA" +"000,000","000,000","aaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00A00A","AAAAAAAA AAA AAAAAAA" +"00,000",,"aaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAA" +"000,000",,"aaaa_aa0@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA00","AAAA" +"00,000",,"aaaaaaaaaa000@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000A0A","AAAA" +"00,000","000,000","aaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA00000A","AAAAAAAA" +"000,000","0,000","aaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAAAAAA" +"000,000",,"aaaa00@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000A0000","AAAA" +"00,000","00,000","aaaaaaaaa0@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000AA00","AAAAAAAA" +"000,000",,"aaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A000000","AAAA" +"00,000",,"aaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000000A","AAAA" +"00,000","000,000","aaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000000A","AAAAAAAA" +"00,000",,"aaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000","00,000","Aa000000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAAAAAA AAA AAAAAAA" +"000,000",,"aaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00AA00","AAAA" +"00,000","000,000","aaaaa000@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000A000","AAAAAAAA" +"000,000","00,000","Aaa000@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00000A","AAAAAAAA" +"000,000","000,000","aaaaaaaaaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000A00","AAAAAAAA" +"000,000",,"aaaaaaaaaaa@aaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000A00A","AAAA" +"00,000",,"Aaa.Aaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000AA00","AAAA" +"00,000",,"aaaaaaa.aaaaa00@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000A00","AAAA" +"000,000",,"aaaaaaaa00.00@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA00","AAAA" +"000,000",,"aaaaaaaa00@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA00","AAAA" +"000,000",,"aaaaa_aaaa@aaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA00","AAAA" +"000,000","000,000","aaaaaa00@aaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000000","AAAAAAAA AAA AAAAAAA" +"000,000","000,000","aaaaaaa000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA00A000","AAAAAAAA" +"00,000","0,000","aaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAAAAAA" +"000,000","000,000","aaaaaaaaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAAAAAA" +"000,000",,"Aaaa000@aaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00000A","AAAA" +"000,000",,"aaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00000A","AAAA" +"000,000",,"Aaaaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00000A","AAAA" +"000,000",,"Aaaaaaaa00@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00000A","AAAA" +"000,000",,"aaaaaaaaa00@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00000A","AAAA" +"000,000",,"aaaaaaaaa00@aaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00000A","AAAA" +"00,000","000,000","aaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000A00A","AAAAAAAA AAA AAAAAAA" +"000,000",,"aaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAA" +"000,000",,"aaaaaaaa0@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA00A0A0A","AAAA" +"000,000","000,000","aaaaaaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000AA0A","AAAAAA AAAA AAAAA" +"00,000","000,000","aaaaaaa@aaaaa.aaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000A00A","AAAAAAAA" +"00,000","0,000","aaaaaa0@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA00","AAAAAAAA" +"000,000",,"aaaaa@aaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA0A","AAAA" +"000,000",,"Aaaaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000A00","AAAA" +"00,000","00,000","aaaa0000@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00A000","AAAAAAAA" +"00,000",,"aaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A000000","AAAA" +"000,000","0,000","aaaaaa_aaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA000A0A00","AAAAAAAA" +"00,000",,"aaaaa000@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000000A","AAAA" +"00,000","000,000","aaaa_aaa000@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000000","AAAAAAAA" +"00,000",,"aaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000A00A","AAAA" +"000,000","000,000","aaaaaaaaaa0@aaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A0AA0A0","AAAAAAAA AAA AAAAAAA" +"000,000",,"aaaaaaaaa_aaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAA" +"000,000","000,000","AAAAAAAAAAA@aaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000A000","AAAAAAAA" +"00,000",,"aaaaaa00@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000A00","AAAA" +"00,000","00,000","Aaaaa.Aaaaaaa@aaaaaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000A000","AAAAAAAA" +"00,000","00,000","aaaaa.aaaaa@aaaaaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000A000","AAAAAAAA" +"00,000","0,000","aaa@aaaaaaaaaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00A000","AAAAAAAA" +"000,000","000,000","aaaaaaaaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000A00A","AAAAAAAA" +"000,000",,"aaaaaaa@aaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000A000","AAAA" +"00,000","000,000","aaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00000A","AAAAAAAA" +"00,000","000,000","Aaaa.aaaaaaa@aaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00000A","AAAAAAAA" +"00,000","000,000","aaaaaaaaaaa@aaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00000A","AAAAAAAA" +"00,000",,"aaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00000A","AAAA" +"00,000",,"Aaaaa.Aaaaa@aaaaaaaaaaaaa.aa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00000A","AAAA" +"000,000","00,000","Aaaa.Aaaaaaaaa@aaaaaaa.aa",00/00/0000 00:00:00AA,"0,000.00","AAAA00A00A0","AAAAAAAA" +"00,000",,"aaaaaaaaa00@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA00A0000","AAAA" +"000,000",,"aaaaa@aaa0000.aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000000","AAAA" +"000,000",,"aaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA000000","AAAA" +"000,000",,"aaaaaaa00@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA000000","AAAA" +"000,000",,"aaaaaaaaaaa000@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA000000","AAAA" +"000,000",,"aaaaaaaaa0@aaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA000000","AAAA" +"000,000",,"aaaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA000000","AAAA" +"000,000",,"aaaaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA000000","AAAA" +"000,000",,"aaaaa_aa000@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA000000","AAAA" +"000,000",,"aaaaaa_0@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA000000","AAAA" +"000,000",,"aa_aaaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA000000","AAAA" +"000,000",,"aaaaa.aaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA000000","AAAA" +"000,000",,"aaaaaaa00@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA000000","AAAA" +"000,000",,"aaaaaaaaaaaaaa@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA000000","AAAA" +"000,000",,"aaa00aa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA000000","AAAA" +"000,000",,"aaaaaaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA000000","AAAA" +"000,000",,"aaaaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA000000","AAAA" +"000,000",,"aaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA000000","AAAA" +"000,000",,"aaaaaaa_aaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA000000","AAAA" +"000,000",,"aaaaa@aaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA000000","AAAA" +"000,000",,"aaaaa_aaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA000000","AAAA" +"000,000",,"aaaaaaaa000@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA000000","AAAA" +"000,000",,"aaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA000000","AAAA" +"000,000",,"aaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA000000","AAAA" +"000,000",,"aaa_aa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA000000","AAAA" +"000,000",,"aaaaa_a@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA000000","AAAA" +"000,000",,"aaa000@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA000A000A","AAAA" +"000,000","00,000","aaaaaa00@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00A000","AAAAAAAA" +"000,000",,"aaaaaaaa.aaaaaa@aaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA000A000A","AAAA" +"0,000",,"aaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000000","AAAA" +"000,000",,"aaaa.a.aaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA000A0A00","AAAA" +"00,000",,"aaaa.aaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000","000,000","aaaaaa.aaaaaaaaaaa000@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000000","AAAAAAAA" +"000,000","000,000","aaaaaaa.aaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA000A0A00","AAAAAAAA" +"000,000",,"aaaaa_aaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000A000","AAAA" +"00,000","000,000","aaaaa.aaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000AA00","AAAAAAAA AAA AAAAAAA" +"000,000",,"aaaaaa.aaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA00AA0A","AAAA" +"000,000","00,000","aaaaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000000A","AAAAAAAA" +"000,000",,"aaaaaa.aaaa@aa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000000A","AAAA" +"00,000",,"aaaaaaaaaaa@aaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A000A00","AAAA" +"000,000","000,000","aaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA0A000A","AAAAAAAA" +"000,000",,"aaaaaa.aaaaaaa0@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA000000","AAAA" +"00,000",,"aaaaa@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00AA0A","AAAA" +"00,000",,"aaa000@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000A00","AAAA" +"000,000",,"aaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000AA00","AAAA" +"00,000","00,000","aaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00AA00","AAAAAAAA" +"000,000",,"aaaaaaa@aaaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00AA00","AAAA" +"00,000",,"aaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000000","AAAA" +"00,000","000,000","aaaaaaaaaa00@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000000","AAAAAAAA" +"00,000",,"aaa.aaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000000","AAAA" +"00,000",,"aaa.aaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000000","AAAA" +"00,000",,"aaaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000000","AAAA" +"00,000",,"aaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA0A00A0","AAAA" +"000,000",,"aaaaaaaaaaa00@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00AA00","AAAA" +"000,000","000,000","aaaaaaa0000@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00AA00","AAAAAAAA" +"000,000",,"aaaaaaa@aaaaaaaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00AA00","AAAA" +"000,000",,"aaaaaaaa_0000@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000A000","AAAA" +"000,000",,"aaaaaa00@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000A000","AAAA" +"000,000",,"Aaaaaa_Aaaa@aaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000A000","AAAA" +"000,000",,"aaaaaaaaaaaaaa00@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000A000","AAAA" +"000,000",,"AAAaaaAaaa@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00AA00","AAAA" +"00,000","000,000","aaaaaaaa.aaaaa@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA0AAA00","AAAAAAAA" +"00,000",,"aaaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000000","AAAA" +"0,000","000,000","aaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000A000","AAAAAAAA" +"0,000","000,000","aaaaaaaaaaa00@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000A000","AAAAAAAA" +"000,000","000,000","aaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000000A","AAAAAAAA" +"00,000",,"aaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA00","AAAA" +"00,000",,"aaaaaaaaaaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaaaa00@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA00AA00","AAAA" +"000,000",,"aaaa.aaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA00AA00","AAAA" +"00,000","000,000","aaaaaaaa.aaaaa@aaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000A0AAA","AAAAAAAA" +"000,000",,"aaaaaaaaaaaaa0@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA00AA00","AAAA" +"000,000",,"aaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA00AA00","AAAA" +"00,000","00,000","aaaa.aaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000A0AAA","AAAAAAAA" +"00,000","000,000","aaaa_0000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000A0AAA","AAAAAAAA" +"00,000",,"aaaaaa@aaaaaaaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000A0AAA","AAAA" +"000,000","00,000","aaaaaaaa00@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000A00","AAAAAA AAAA AAAAA" +"000,000",,"aaaaaaaaa.aaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000000","AAAA" +"000,000",,"aaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000AA00","AAAA" +"00,000",,"aaaaaaaa@aaaaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAA" +"00,000",,"aaaaaa000@000.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000000","AAAA" +"00,000",,"aaaaaaa0000@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000000","AAAA" +"000,000",,"aaaaaaa0000@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000000","AAAA" +"00,000","000,000","aaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000000","AAAAAAAA" +"00,000",,"aaaaaa0@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000A00","AAAA" +"00,000",,"aaaaaa000@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000A00","AAAA" +"000,000","000,000","aaaaaaaaa0@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA00000A","AAAAAA AAAA AAAAA" +"00,000",,"aaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000A00A","AAAA" +"000,000",,"aaaaaaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00A000","AAAA" +"000,000",,"aaaaaaa@aaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA00","AAAA" +"00,000","000,000","aaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000A000","AAAAAAAA" +"00,000",,"aaaaaa.aaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000A000","AAAA" +"000,000",,"aaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A0AA0A0","AAAA" +"000,000",,"aaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A0AA0A0","AAAA" +"000,000",,"aaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A0AA0A0","AAAA" +"000,000",,"aaaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000A00A0","AAAA" +"000,000",,"Aaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A0AA0A0","AAAA" +"00,000",,"aaaaaaa.aaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000A000","AAAA" +"00,000","000,000","aaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA00","AAAAAAAA" +"00,000",,"aaaaa@aaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA00","AAAA" +"000,000",,"a_aaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA00AA0A0","AAAA" +"00,000",,"aaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A0A0000","AAAA" +"00,000",,"aaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000A00","AAAA" +"00,000","00,000","aaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000000","AAAAAAAA" +"000,000",,"aaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA00A000","AAAA" +"00,000",,"aaaaaaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAA" +"000,000","000,000","aaaaaa0000@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA0A0A00","AAAAAAAA" +"000,000",,"aaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000000","AAAA" +"00,000",,"aaaaaaa@aaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000A000","AAAA" +"000,000",,"aaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000A0A","AAAA" +"00,000","000,000","aaaaaaaaaa@000.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000000","AAAAAAAA" +"00,000",,"aaaa_aaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAA" +"00,000",,"Aaaaaaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00AA00","AAAA" +"00,000",,"Aaaaaa00@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00AA00","AAAA" +"00,000",,"aaaaaa0@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000000","AAAA" +"00,000",,"aaaaaaaa.aaaaaaa@aaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000000","AAAA" +"00,000","000,000","aaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000A000","AAAAAAAA" +"000,000",,"aaaaaaaaaaa0@aaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA00000A","AAAA" +"000,000",,"aaaaaaaaaaaa0000@aaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA00000A","AAAA" +"000,000",,"aa_aaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000A00","AAAA" +"000,000",,"aaaaaaaaa0@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000A00","AAAA" +"00,000",,"Aaaaa.aaaaaaaa@aaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA00AA0A0","AAAA" +"000,000",,"aaaaa.aaaa@aaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000A000","AAAA" +"000,000","00,000","aaaaaa@aaaaaaaaaa.aa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000000","AAAAAAAA AAA AAAAAAA" +"00,000",,"aaaaaa.aaaa@aaaaaaaaaaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA00A0AAA","AAAA" +"00,000",,"aa_aaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA00A0AAA","AAAA" +"00,000","000,000","aaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA00A0AAA","AAAAAAAA" +"00,000","00,000","aaa_aaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA00A0AAA","AAAAAAAA" +"00,000",,"aa_aaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA00A0AAA","AAAA" +"00,000",,"aaaaaaaa.aaaaaaa@aaaaaaaaaaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA00A0AAA","AAAA" +"00,000",,"aaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000A0A","AAAA" +"00,000","000,000","aa.aaa@aaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000000A","AAAAAAAA" +"000,000",,"aaaaaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000AAAA0","AAAA" +"000,000","000,000","aaaaaaaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAAAAAA AAA AAAAAAA" +"00,000",,"aaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000000","AAAA" +"00,000",,"aaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000AA0A","AAAA" +"000,000","00,000","aaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000A00","AAAAAAAA AAA AAAAAAA" +"000,000","000,000","aaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000000","AAAAAAAA" +"00,000",,"aaaaaa.aaa@aaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA0AAAA0","AAAA" +"000,000","00,000","aaaaaaaaa@aaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA00AAA0A","AAAAAAAA" +"000,000",,"aaaaaaaa@aaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA00AAA0A","AAAA" +"000,000",,"a.a.aaaaaa@aaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA00A0000","AAAA" +"00,000",,"aaaaa.aaaaa@aaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAA" +"00,000",,"aaaaaa.aaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000A00AA","AAAA" +"00,000",,"aaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000000","AAAA" +"000,000",,"aaaaaaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000AAA0A","AAAA" +"000,000",,"aaaaaa.aaaaaaa@aaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA00A0A0A","AAAA" +"00,000",,"aaaaaaaaa0000@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000AAA00","AAAA" +"00,000",,"aaaaa.aaaaaaa@aaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000000","AAAA" +"0,000",,"aaaa.aaaaa@aaaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000A0AA0","AAAA" +"0,000",,"aaaaaa.aaaa@aaaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000A0AA0","AAAA" +000,,"aaaaaa_aaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000000","AAAA" +"00,000","00,000","aaaaaaa@aaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A0A0AA0","AAAAAAAA" +000,,"aaaaaa.aaaaa@aaaaaa-aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000000","AAAA" +000,,"aaaaaa.aaaaa@aaaaaa-aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000000","AAAA" +000,,"aaaaa.aaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000000","AAAA" +000,"00,000","aaaa000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000000","AAAAAAAA" +000,,"aaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000000","AAAA" +"000,000","000,000","AAAAA0AA@AAAAA.AAA",00/00/0000 0:00:00AA,"0,000.00","AAAA0000A00","AAAAAAAA" +"000,000",,"aaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000A0A","AAAA" +"00,000",,"aaaaaaaaaa_0000@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA000A00","AAAA" +"00,000","00,000","aaaaaaa.aaaaaaa@aaaaaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA000A0000","AAAAAAAA" +"0,000",,"aaaaa_aaaaaa@aa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000A000","AAAA" +"00,000",,"aaaaaa.aaaaaa@aa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA000A00","AAAA" +"000,000",,"aaaaaa.a.aaaaaa@aaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaa.a.aaaaaaaaa@aaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000000A","AAAA" +"00,000",,"aaaaaaaa0@aaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA000AA00A","AAAA" +"00,000",,"aaaaaa0000@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA000AA00A","AAAA" +"000,000",,"AAaaaa@aaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA000A00AA","AAAA" +"000,000",,"Aaaaa.Aaaaaaa@aaaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA000A00AA","AAAA" +"000,000",,"aaaaa.aaaa@aaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA000A00AA","AAAA" +"000,000",,"aaaaa0@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA000A00AA","AAAA" +"00,000","000,000","Aaaaaaaaa00@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000000A","AAAAAAAA" +"00,000",,"aaaaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A000000","AAAA" +"00,000",,"aaaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A000000","AAAA" +"000,000",,"aaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000000","AAAA" +"00,000","000,000","aaaaaaaaaa00@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA000AA00A","AAAAAAAA" +"00,000",,"aaaaaaaa@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA000AA00A","AAAA" +"000,000","00,000","aaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000000A","AAAAAAAA" +"000,000","000,000","aa0000@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000000A","AAAAAAAA" +"000,000",,"AAAAAAA@AAAAAAA.AAA",00/00/0000 00:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A000A00","AAAA" +"00,000",,"Aaaaaa_aaaaa@aa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaa.aa.aaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00A00A","AAAA" +"00,000","00,000","Aaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000000A","AAAAAAAA" +"00,000",,"aaaaaaaa@aaaaaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00000A","AAAA" +"00,000",,"Aaaaaaaa.Aaaa@AaaaAaaaaAaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA000AA00A","AAAA" +"00,000","000,000","aaaa.aaaaaaaaaa@aa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000A00A","AAAAAAAA" +"00,000",,"aaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA000000","AAAA" +"000,000",,"aaa000@aaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000000","AAAA" +"00,000",,"aaaaaaa.aaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA000000","AAAA" +"00,000",,"aaaaaaaa000@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000000A","AAAA" +"00,000",,"aaaa.aaaaaaa@aaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000A0A","AAAA" +"000,000",,"aaaa_aa0@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000AA00","AAAA" +"00,000",,"aaaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000AA0A","AAAA" +"000,000","0,000","Aaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA0AAAA0","AAAAAAAA" +"000,000","00,000","aaaaaaa@aaaaaa.aa",00/00/0000 00:00:00AA,"0,000.00","AAA000AAA0A","AAAAAAAA" +"000,000",,"aaaaaa@aaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA0AAAA0","AAAA" +"00,000",,"aaaaaaa_aaaaa@aa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"AAaaaaa@aaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA0AAAA0","AAAA" +"000,000","00,000","aaaaa_aaaaaaaa@aa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00AA00","AAAAAAAA" +"00,000",,"aaaaaaa.aaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA000A0000","AAAA" +"000,000",,"aaaaaaaa.aaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000A00","AAAA" +"000,000",,"aaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A0A00AA","AAAA" +"00,000",,"aaaaaaaaaaaa@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA000AAAA0","AAAA" +"00,000",,"Aaa0000@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA000AAAA0","AAAA" +"00,000",,"aaa.aaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA000000","AAAA" +"00,000",,"aaaaaa_aaaa@aaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA000AAAA0","AAAA" +"00,000","00,000","aaaaaa@aaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A000000","AAAAAAAA" +"00,000",,"aaaaaaaaaa000a@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A000000","AAAA" +"00,000",,"aaaaaaaa@aaaa.aa.aa",00/00/0000 00:00:00AA,"0,000.00","AAA0A000000","AAAA" +"00,000",,"aaaaaa@aaaaaaaaa.aa",00/00/0000 00:00:00AA,"0,000.00","AAA0A000000","AAAA" +"00,000","000,000","aaaaaa_aaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A000000","AAAAAAAA" +"00,000",,"aaaa-a@aaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A000000","AAAA" +"00,000",,"aaaaa@aaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A000000","AAAA" +"00,000",,"aaaaaaa@aaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A000000","AAAA" +"00,000",,"a_aaaaa00@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A000000","AAAA" +"00,000","000,000","aaaaaa0000@aaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A000000","AAAAAAAA" +"00,000",,"aaaaaa_aaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A000000","AAAA" +"00,000",,"aaaaa_aaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA000000","AAAA" +"00,000","00,000","aaaaa_aaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00AA00","AAAAAAAA" +"00,000","000,000","Aaaaa_aaaaaaa@aa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000000A","AAAAAA AAAA AAAAA" +"000,000","00,000","aa_aa00@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00A000","AAAAAAAA" +"00,000",,"Aaaaa.aaaaaaa@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaa_aaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA00A000","AAAA" +"00,000","000,000","aaa00000@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA00A0A00","AAAAAAAA" +"00,000","000,000","aaaaa@aaaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA00A0A00","AAAAAAAA" +"000,000",,"aaaa.aaaaa@aaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA00A000","AAAA" +"000,000","00,000","aaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA00A000","AAAAAAAA" +"000,000","000,000","aaaa00@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA00A000","AAAAAAAA" +"000,000",,"aaaaaaaaaaaaaaa@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA00A000","AAAA" +"000,000",,"aaaaa0000@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA00A000","AAAA" +"000,000",,"aaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA00A000","AAAA" +"000,000",,"aaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA00A000","AAAA" +"000,000",,"aaaaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA00A000","AAAA" +"000,000",,"aaaaaaaa.aaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA00A000","AAAA" +"000,000",,"aaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA00A000","AAAA" +"000,000","000,000","aaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA00A000","AAAAAAAA" +"000,000",,"aaaaaaa@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA00A000","AAAA" +"000,000",,"aaaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA00A000","AAAA" +"000,000","00,000","aaaa.aaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA00A000","AAAAAAAA" +"000,000",,"aaaaa.aaaaaaaa@aaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA000A00","AAAA" +"00,000","000,000","aaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000AA0A","AAAAAAAA" +"000,000",,"aaaa.aaaa@aaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A0AAAAA","AAAA" +"0,000",,"aaaaaaaa0000@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA00A00A","AAAA" +"000,000",,"aaaaa.aaaaaa@aaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA00A00A","AAAA" +"00,000",,"aaaaaa.aaaaa@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000AA0A","AAAA" +"000,000",,"aaaaaaaa.aaaaaaa@aaa.aaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000000","AAAA" +"00,000","000,000","aaa000@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA0AA0A0","AAAAAAAA" +"000,000","00,000","aaaaaaaaaa00@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA000A0A00","AAAAAAAA" +"000,000","000,000","aaaaaa0000@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000A0A","AAAAAAAA" +"000,000",,"aaaa.aaaaaaa@aaaaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA00A00A0","AAAA" +"000,000","00,000","aaaaaaa.aaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000000","AAAAAAAA AAA AAAAAAA" +"000,000",,"aaaaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000000","AAAA" +"000,000","00,000","aaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000000","AAAAAAAA" +"000,000",,"aaaaaaa.a@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000000","AAAA" +"000,000","00,000","aaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00000A","AAAAAAAA" +"00,000",,"aaaaaaaaaa@aaaaa.aaa.aa",00/00/0000 00:00:00AA,"0,000.00","AAA00000000","AAAA" +"00,000",,"aaaaaaa@aaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA00A00A0","AAAA" +"00,000","000,000","aaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000000","AAAAAAAA AAA AAAAAAA" +"000,000",,"aaaaaaaaa@aaaaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00A000","AAAA" +"00,000",,"aaaa.aaaaaa@aaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000000","AAAA" +"000,000",,"aaaaaa.aaaaaaaa@aaaaaa-aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000A00A","AAAA" +"00,000","000,000","aaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000000","AAAAAAAA" +"000,000",,"aaaa.aaaaa@aaaaaa-aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000A00A","AAAA" +"00,000",,"aaaaaaa.aaaaaaaaa@aaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000000","AAAA" +"000,000",,"aaaaaaaa.aaaaaaa@aaaaaa-aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000A00A","AAAA" +"000,000",,"aaaaaaa000@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00000A","AAAA" +"000,000",,"aaaaaaaaa0@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000A0A","AAAA" +"00,000","00,000","aaa_aaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A000A0A","AAAAAAAA AAA AAAAAAA" +"00,000",,"aaaa.aaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000000","AAAA" +"00,000",,"AAAaaaa@aaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000000","AAAA" +"000,000",,"aaaaaaa.aaaaaaa@aaaaaa-aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000A00A","AAAA" +"000,000","000,000","aaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA000A0A","AAAAAAAA AAA AAAAAAA" +"00,000",,"aaaaa@aaaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00A000","AAAA" +"00,000",,"aaaaaaa_aaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000000","AAAA" +"000,000","000,000","aaaaaa.aaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000A00A","AAAAAA AAAA AAAAA" +"00,000",,"aaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000000","AAAA" +"00,000",,"AAaaa0@AaaaaAaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000000","AAAA" +"00,000",,"aaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A000A0A","AAAA" +"000,000",,"Aaaaaaaaa.A.Aaaaaaa@aaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000000","AAAA" +"000,000","00,000","aaaa.aaaaa@aaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000000","AAAAAAAA" +"00,000","000,000","aaaaaa.aaaaaaaaa@aa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000A00A","AAAAAAAA" +"00,000","00,000","aaaa.aaaaaaa@aa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000A00A","AAAAAAAA" +"000,000",,"aaaaaaaaa0000@aaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000000","AAAA" +"00,000",,"aaaaa.aaaaaa.aaaaaa@aaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA000AA00A","AAAA" +"000,000",,"aaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000A0A","AAAA" +"00,000","00,000","aaaaaaa.aaaaaa@aaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA000AA00A","AAAAAAAA" +"00,000",,"aaaaaaaaa.aaaaa@aaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA000AA00A","AAAA" +"000,000","00,000","aaaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA000AAA00","AAAAAAAA" +"000,000","000,000","aaaaa00@aaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000AA00","AAAAAAAA AAA AAAAAAA" +"000,000",,"aaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000AA00","AAAA" +"00,000",,"aaaaaa.aaaaaa@aa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA00A000","AAAA" +"00,000","0,000","aaaaaaaaaa00@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAAAAAA" +"000,000",,"AAaaaaa@aaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA0AAAA0","AAAA" +"00,000",,"aa0000@aaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"00,000",,"aaaaaaaaaaaaaaa0000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000A0A","AAAA" +"000,000",,"aaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA00AA00","AAAA" +"00,000",,"aaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000AA00","AAAA" +"0,000",,"aaaa_aaaaaa@aaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00AA0A","AAAA" +"000,000",,"aaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000A0A","AAAA" +"000,000",,"aaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000A0A","AAAA" +"00,000",,"aaaaaaa@aaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000000A","AAAA" +"00,000",,"aaaaaaa.aaaa@aaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000A0AA0","AAAA" +"00,000",,"aaaaa@aaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000A000","AAAA" +"000,000",,"aaaaaa000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000A0A","AAAA" +"000,000",,"aaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000A0A","AAAA" +"00,000","0,000","aaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAAAAAA AAA AAAAAAA" +"0,000",,"aaaaaa@aaaaa.aa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000000","AAAA" +"0,000","000,000","aaaaa.aaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000A00A","AAAAAAAA" +"00,000",,"aaaa.aaaaaa@aaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000A000","AAAA" +"00,000",,"aaaa0a@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000A00","AAAA" +"00,000",,"aaaaaa00@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000A00","AAAA" +"00,000",,"AAAAAAAAAAAAA@AAAAA.AAA",00/00/0000 0:00:00AA,"0,000.00","AAAA0000000","AAAA" +"000,000","0,000","aaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A0AA0A0","AAAAAAAA" +"000,000",,"aaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000000","AAAA" +"000,000",,"aaaaaa00aa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000000","AAAA" +"00,000",,"aaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000000","AAAA" +"000,000",,"aaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAA" +"000,000","000,000","aaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000A0A","AAAAAAAA" +"00,000",,"aaaa.aaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000A00","AAAA" +"00,000","00,000","aaaaa.aaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAAAAAA" +"000,000",,"aaaaaaa@aa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000A000","AAAA" +"000,000","00,000","aaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAAAAAA" +"000,000",,"aaaaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000000","AAAA" +"000,000",,"aaaaaa00@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000","0,000","aaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAAAAAA" +"000,000",,"aaaa.aaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"Aaaaaaa.Aaaaa@aa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaa.aaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"00,000","000,000","aaaaaa@aaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000A0A","AAAAAAAA" +"000,000",,"aaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000000","AAAA" +"00,000",,"aaaaa@aaaaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA00","AAAA" +"00,000",,"aaaaaaaaaaaaa0@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA00","AAAA" +"00,000",,"aaaaa@aaaaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA00","AAAA" +"00,000","000,000","aaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA00","AAAAAAAA AAA AAAAAAA" +"000,000","00,000","aaaaaaa.aaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA00A00A","AAAAAAAA AAA AAAAAAA" +"00,000",,"aaa.aaaaa@aaaaaaa.aa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000000","AAAA" +"00,000","00,000","aaaaa000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000000","AAAAAA AAAA AAAAA" +"000,000",,"aaaaaaa.aaaa@aaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000A0000","AAAA" +"00,000",,"aaa.000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000000","AAAA" +"000,000","000,000","aaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000A000","AAAAAAAA" +"000,000",,"aaaaaaaa@aaaaaa.aa",00/00/0000 0:00:00AA,"0,000.00","AAA000AAA0A","AAAA" +"000,000",,"aaaaaaaa_aaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA00A00A","AAAA" +"00,000","000,000","a0000.aa@aaaaa.aaa.aa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000A00","AAAAAAAA" +"000,000",,"AAAAAAA@aaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000A0A","AAAA" +"000,000","000,000","aaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000A00","AAAAAAAA AAA AAAAAAA" +"00,000",,"aa0000@aa00.aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000A00","AAAA" +"000,000",,"AAAAA@AAAAAAAAAAAAA.AAA",00/00/0000 0:00:00AA,"0,000.00","AAA0A000A00","AAAA" +"000,000",,"aaaaa-000@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000A00","AAAA" +"000,000","000,000","aaaaaaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA00000A","AAAAAAAA AAA AAAAAAA" +"000,000","00,000","aaaaa.aaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA00000A","AAAAAAAA" +"000,000","000,000","Aaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA00000A","AAAAAAAA" +"000,000",,"aaaaaaaaaaa00@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAA" +"00,000","000,000","aaaaaaaa0000@aaaaaaaaa.aa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000A00","AAAAAAAA" +"00,000",,"aaaaa0a@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000A00","AAAA" +"0,000",,"aaaa-aaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000A000A","AAAA" +"00,000","00,000","aaaaaaa00@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA00A000","AAAAAAAA" +"000,000","0,000","aaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00AA00","AAAAAAAA" +"000,000",,"aaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000A00","AAAA" +"00,000",,"aaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000A0A","AAAA" +"00,000",,"a.a.aaaaaa@aaaaaaaaa.aa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000A0A","AAAA" +"00,000","00,000","aaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000A0A","AAAAAAAA" +"00,000",,"aaaaaa.aaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000A0A","AAAA" +"00,000",,"aaaaaa.aaaaa0@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000A0A","AAAA" +"00,000",,"aaaaaa@aaaaaaaaa.aa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000A0A","AAAA" +"00,000",,"aaaaaaaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000A0A","AAAA" +"00,000",,"aaaaaaa@aaa.aa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000A0A","AAAA" +"00,000",,"aaaaaaaa@aaaaaaaaa.aa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000A0A","AAAA" +"00,000","000,000","aaaaaaaaaa@aaaaaaaaa.aa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000A0A","AAAAAAAA" +"00,000",,"aaaaaa@aaaaaaaaaa.aa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000A0A","AAAA" +"00,000",,"aaaaa0000@aaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000A0A","AAAA" +"00,000",,"aaaaaaaaa@aaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000A0A","AAAA" +"0,000","00,000","a_aaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00A000","AAAAAAAA" +"00,000",,"aaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000A0A","AAAA" +"00,000",,"aaa_aaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000A0A","AAAA" +"00,000","00,000","aaaaa_aaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAAAAAA" +"000,000","00,000","aaaaaaaaaaaa0@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00000A","AAAAAA AAAA AAAAA" +"000,000",,"aaaaaa@aaaaaaaaa.aa",00/00/0000 0:00:00AA,"0,000.00","AAA0000AA0A","AAAA" +"000,000","00,000","aaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAAAAAA" +"00,000",,"aaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000000","AAAA" +"00,000","000,000","aa_aaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA00AA0A","AAAAAAAA" +"0,000","000,000","aaaaaaaaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000A00A","AAAAAA AAAA AAAAA" +"00,000",,"aaaaaaa.aaaa@aaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA00AAA00","AAAA" +"000,000",,"Aaaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A0AA00A","AAAA" +"0,000","000,000","aaaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000A00A","AAAAAA AAAA AAAAA" +"00,000","00,000","aaaa000000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000000","AAAAAAAA" +"000,000","00,000","aaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000000","AAAAAAAA" +"000,000","000,000","Aaaaa.Aaa.Aaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAAAAAA" +"000,000","00,000","Aaaaaa.Aaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAAAAAA" +"00,000",,"a000@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000A00","AAAA" +"000,000","00,000","aaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000000","AAAAAAAA" +"000,000",,"aaaaaaa.aaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00A000","AAAA" +"00,000",,"aaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000000A","AAAA" +"00,000",,"aaaa0000@aaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000000A","AAAA" +"00,000","00,000","aaaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000000A","AAAAAAAA" +"000,000",,"aaaaaaa_00@000.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000000","AAAA" +"00,000",,"aaaaaa0a0aaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A0A00A0","AAAA" +"000,000",,"aaaaa.a.aaaaaaaa@aaaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA0A0000","AAAA" +"000,000",,"aaaaaa.aaaaaaa@aaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA0A0000","AAAA" +"00,000","000,000","aaaa_aaa_@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000000","AAAAAAAA" +"00,000",,"aaaa_aaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000000","AAAA" +"00,000",,"aaaaaa_a0@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000000","AAAA" +"00,000",,"aaaaaaaa_aaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000000","AAAA" +"00,000","0,000","aaaaaa.a.aaaaaaa@aaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000A00","AAAAAA AAAA AAAAA" +"000,000","000,000","aaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA00A000","AAAAAAAA AAA AAAAAAA" +"000,000",,"aaaa0aaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000000","AAAA" +"000,000",,"aaaaaaaa@aaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000000","AAAA" +"00,000",,"AAAaaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000A000","AAAA" +"00,000",,"aaaaaaaaaaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"00,000",,"aaaa00@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000000","AAAA" +"000,000",,"aaaaaaaaaa00@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000AAAA0","AAAA" +"00,000",,"aaaa.aaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000000","AAAA" +"000,000",,"aaaa.aaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA000AA0AA","AAAA" +"00,000",,"aaaa0a@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A000A00","AAAA" +"0,000","0,000","aaaaaaaaa@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000000A","AAAAAAAA" +"000,000",,"Aaaa.Aaaaaaaa@aaaaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA000A0AA0","AAAA" +"00,000","00,000","aaaa0a@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A000A00","AAAAAA AAAA AAAAA" +"00,000",,"aaaa0a@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A000A00","AAAA" +"000,000",,"aaaaaa_aaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000000","AAAA" +"000,000",,"aaaaa_aaaa@aaaaa.aa.aa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000000","AAAA" +"00,000",,"aaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A000A00","AAAA" +"00,000",,"aaaaa00@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A000A00","AAAA" +"0,000",,"aaaaa.aaaa@aa.aaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000AA00","AAAA" +"000,000",,"aaaaa.aaaaaaaa@aaaaaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A0A00AA","AAAA" +"00,000",,"aaaaaaa_aaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA000AA0A0","AAAA" +"00,000",,"aaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA000AA0A0","AAAA" +"000,000","000,000","aaa_aaaaaa00@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A000A0A","AAAAAAAA" +"00,000",,"aaaaaa00@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA000AA0A0","AAAA" +"00,000",,"Aaaaa@aaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000AA0A","AAAA" +"000,000",,"aaaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA000AAAA0","AAAA" +"00,000","000,000","aaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00A00A","AAAAAAAA" +"00,000","000,000","aaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000A000","AAAAAAAA" +"00,000",,"aaaaa@aaaaaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00A000","AAAA" +"000,000","00,000","aaa@aaaaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000A00","AAAAAAAA" +"00,000",,"aaaaaa@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA00AA00","AAAA" +"000,000",,"aaaaa@aaa-aaaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000A00","AAAA" +"00,000",,"aaaaaaaa@aaaaaaaaaaaaa.aa",00/00/0000 00:00:00AA,"0,000.00","AA.00000000","AAAA" +"000,000",,"aaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A000A0A","AAAA" +"00,000",,"aaaaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A000A00","AAAA" +"00,000",,"aaaaa000@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000A000","AAAA" +"00,000",,"aaaaaa.aaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000000A","AAAA" +"00,000",,"aaaaa@aaaaa-aaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000A000","AAAA" +"000,000","000,000","aaaaaaaaaaa00@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00A00A","AAAAAAAA" +"000,000","00,000","aaaaaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000A0A","AAAAAAAA" +"00,000","00,000","aaaaaaa_a_a@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000AA00","AAAAAAAA" +"00,000",,"aaaaaaaa_a@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000AA00","AAAA" +"00,000","00,000","aaaaaaa.aaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000A000","AAAAAAAA" +"00,000",,"aaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA00","AAAA" +"00,000",,"aaa.aaaaaaa.aaaaaa@aaa.aa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA00","AAAA" +"00,000",,"aaaaaaaaa@aa.aaa.aa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA00","AAAA" +"00,000",,"aaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA00","AAAA" +"00,000",,"aaaaaaaa0000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA00","AAAA" +"00,000",,"aaaa0000aa@aaaaa.aa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA00","AAAA" +"00,000",,"aaaaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA00","AAAA" +"00,000",,"aaaaaaaaaaaaaa000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA00","AAAA" +"00,000",,"aaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA00","AAAA" +"00,000",,"a_aaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000A000","AAAA" +"000,000",,"aaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00A00A","AAAA" +"000,000",,"aaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00A00A","AAAA" +"00,000","000,000","aaaaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000A0000","AAAAAAAA" +"000,000",,"aaaaaa.aaaaa@aaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA00AA000","AAAA" +"000,000","00,000","aaaaaaaaaaaaaa@aaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAAAAAA" +"000,000","000,000","aaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000A00A","AAAAAAAA" +"00,000",,"0000000000@aa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA00000A","AAAA" +"00,000",,"aaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000000","AAAA" +"00,000","000,000","aa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000000","AAAAAAAA" +"00,000",,"aaaaaaaaaa00@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000000","AAAA" +"00,000","00,000","aaaa_000@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAAAAAA AAA AAAAAAA" +"00,000","00,000","aaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000A0A","AAAAAAAA" +"00,000","000,000","aaaaaa@aaa-aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAAAAAA AAA AAAAAAA" +"00,000",,"aaaa@aaa-aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"00,000",,"aaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"00,000","00,000","aaaaaaaaaaa0000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000000","AAAAAAAA" +"00,000","000,000","aaaaaaaa_aaa000@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000000","AAAAAAAA" +"000,000","000,000","aaa0aa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000A0A","AAAAAAAA" +"00,000","000,000","aaaaaaaaa0@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAAAAAA" +"000,000",,"aaaaaaa@aaaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000A0A","AAAA" +"000,000","000,000","aaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000A0A","AAAAAAAA" +"000,000",,"aaaaaaa@aaaaa.aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000A0A","AAAA" +"000,000","00,000","Aaaaa.Aaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000A00","AAAAAAAA" +"000,000","000,000","aaaa00@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000A0A","AAAAAAAA" +"00,000","00,000","Aaaaaaaa_Aaa@aaaa.aaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000A0A","AAAAAAAA" +"00,000",,"aaaaaa.aaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA00","AAAA" +"000,000",,"aaaa0000@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00A000","AAAA" +"000,000","000,000","aaaaaaa000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00A000","AAAAAAAA" +"000,000",,"aaaaaaaaaaa@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00000A","AAAA" +"00,000",,"aa-aaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000000A","AAAA" +"00,000","00,000","aaaaaaa00000@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00A000","AAAAAAAA" +"000,000",,"aaaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA000000","AAAA" +"00,000",,"aaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000A000","AAAA" +"00,000",,"aaaa.aaaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000A000","AAAA" +"00,000",,"aaaaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000A000","AAAA" +"00,000",,"aaaaaa0@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000A000","AAAA" +"00,000","000,000","aaaaaaa0@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000A000","AAAAAAAA" +"00,000",,"aaaaaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000A000","AAAA" +"00,000",,"aaaaaa.aaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000A000","AAAA" +"00,000",,"aaaaaa.aaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00000A","AAAA" +"000,000","00,000","aaaaa00@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000AA00","AAAAAA AAAA AAAAA" +"0,000",,"a_aaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000000","AAAA" +"00,000",,"aaa_aaa_aaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000000","AAAA" +"00,000",,"aaaaaaaaaaaaa0000@aaaaa.aa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000000","AAAA" +"00,000",,"aaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000","00,000","Aaaaaaa@aaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00A00A","AAAAAAAA" +"00,000","000,000","aaaaa00aaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AA.00000000","AAAAAA AAAA AAAAA" +"000,000","000,000","aaaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA00A000A","AAAAAA AAAA AAAAA" +000,"000,000","aaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000000A","AAAAAAAA" +"00,000",,"aaaa.aaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000A00","AAAA" +"000,000","00,000","aaaaaaaaaaaaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA00A0A00","AAAAAAAA" +"000,000","000,000","aaaaaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000A000","AAAAAAAA" +"000,000",,"aaaa.aaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000A000","AAAA" +"00,000",,"aaaaa_aaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA00000A","AAAA" +"00,000","00,000","aaaa.aaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA00A0A00","AAAAAAAA" +"000,000",,"aaaaaaa00@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A0AAAA0","AAAA" +"0,000","000,000","aaaaaa_000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000A0A","AAAAAAAA" +"000,000",,"aaaa_aa0@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000AA00","AAAA" +"00,000","00,000","aaaaaaaaaa@aaaaa.aa",00/00/0000 00:00:00AA,"0,000.00","AAAA000A00A","AAAAAAAA" +"00,000",,"aaaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000AA0A","AAAA" +"00,000",,"aaaaaa_aaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000AA0A","AAAA" +"000,000","000,000","aaaaaa@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA000A00A0","AAAAAAAA" +"000,000",,"AAaaaaaaaaa@aaaaaaaaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A000000","AAAA" +"000,000",,"aaaaaaa.aaaaaaaaa@aaaa.aaaaaa.aa",00/00/0000 00:00:00AA,"0,000.00","AAAAA000000","AAAA" +"000,000",,"aaaa.aa-aaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA000000","AAAA" +"000,000",,"aaaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000AA00","AAAA" +"000,000",,"aaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000AA00","AAAA" +"00,000","000,000","aaaaaaaaaaaaa@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA000A00","AAAAAAAA" +"000,000",,"aaaaaaa@aaaa.aa",00/00/0000 00:00:00AA,"0,000.00","AAA0A000A0A","AAAA" +"00,000",,"aaaaaaa000@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00000A","AAAA" +"000,000",,"aaaaaaa@aaaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000000","AAAA" +"00,000","000,000","AAAAAA@AAAA.AAA",00/00/0000 00:00:00AA,"0,000.00","AAA00000000","AAAAAA AAAA AAAAA" +"00,000","000,000","aaaaaa.aa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000A00A","AAAAAAAA" +"00,000",,"aaaaaaaaa.aaaaa@aaaaaaaaa.aa",00/00/0000 00:00:00AA,"0,000.00","AAAAA00000A","AAAA" +"00,000","00,000","aaaaaaaa_0@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000A000","AAAAAAAA AAA AAAAAAA" +"000,000","000,000","aaa.aaaa@aa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000A00","AAAAAAAA" +"00,000",,"aaaaaaa@aaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A000A0A","AAAA" +"00,000","0,000","aaaaa000@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000000","AAAAAAAA" +"00,000","000,000","aaaaaaaaa@aaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000A00","AAAAAAAA" +"00,000",,"aaaaaa_aa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000A00","AAAA" +"00,000",,"Aaaaaa00000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000000","AAAA" +"000,000","000,000","aaaaaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000A00","AAAAAAAA AAA AAAAAAA" +"000,000","00,000","aaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA00AA000","AAAAAAAA" +"000,000",,"aaaaaaaa@aaaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000A000","AAAA" +"000,000",,"aaa_aaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000AA0A","AAAA" +"000,000",,"aaaaaaaaa@aaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00A000","AAAA" +"000,000",,"aaaaaa@aaaaaaa.aaa.aaa.aa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000A00","AAAA" +"000,000",,"aaaaaaaa0000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000A000","AAAA" +"000,000",,"aaaaaaaaaaaaaaa000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000A000","AAAA" +"00,000","000,000","aaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000A0AAA","AAAAAAAA" +"00,000","00,000","Aaaaaaaa0000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000000","AAAAAA AAAA AAAAA" +"000,000","000,000","AAaaaaaaa@aaaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA00A00A","AAAAAAAA" +"00,000","000,000","aaaa_aaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAAAAAA" +"00,000",,"aaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"00,000",,"aaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000A00","AAAA" +"00,000",,"aaaaaaaa@aaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAA" +"00,000",,"aaaaaaa@aa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAA" +"00,000",,"aaaaaaa@aa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAA" +"00,000",,"aaaaaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000000","AAAA" +"00,000",,"aaaaa000@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A A00000000","AAAA" +"00,000",,"aaaaaaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","A A00000000","AAAA" +"00,000","00,000","a.aaaaaaa@aaaaaaaaa.aa",00/00/0000 0:00:00AA,"0,000.00","AAAAA0A0000","AAAAAA AAAA AAAAA" +"000,000",,"aaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A0AAA0A","AAAA" +"000,000",,"aaa@aaaa.aa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000000","AAAA" +"000,000","000,000","aaaaaaa0000@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000A00","AAAAAAAA" +"00,000",,"aaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000A00","AAAA" +"00,000",,"aaaaaaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA0A00A0","AAAA" +"00,000",000,"a.aaaaaa@aaaaaaa.aa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAAAAAA AAA AAAAAAA" +"00,000",,"aaa0000@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000A00","AAAA" +"00,000",,"aaaaaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000A00","AAAA" +"00,000",,"aaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000A00","AAAA" +"00,000",,"aaaa.aaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000A00","AAAA" +"00,000",,"aaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000A00","AAAA" +"00,000",,"aaaaaaa000@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000A0A","AAAA" +"000,000",,"aaaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaaaaaaaa@aaa.aa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000000","AAAA" +"000,000",,"aaaaaaaaa@aaa.aa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000000","AAAA" +"000,000","000,000","aaaaaaaaaa@aaa.aa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000000","AAAAAAAA" +"000,000",,"a.aaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000000","AAAA" +"000,000",,"aaaa.aaaaaaa@aaaaaa-aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000000","AAAA" +"000,000",,"aaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000000","AAAA" +"000,000",,"aaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000000","AAAA" +"000,000",,"aaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000000","AAAA" +"000,000",,"aaaaaa@aaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000000","AAAA" +"000,000",,"aaaaaaaa@aaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000000","AAAA" +"000,000",,"aaaaaaaaa@aaa.aa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000000","AAAA" +"000,000",,"aaaaa@aaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000000","AAAA" +"000,000",,"aaaaaaa.aaaa@aaaaa.aa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000000","AAAA" +"000,000",,"aaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000000","AAAA" +"000,000","000,000","aaaaaa.aaaaa000@aaaaaaaaa.aa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000000","AAAAAAAA" +"000,000",,"aaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000000","AAAA" +"000,000",,"aaaaaaa@aaaaaaaaa.aa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000000","AAAA" +"000,000",,"aaaaaaa@aaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000000","AAAA" +"000,000","000,000","aaaaaa_aaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA00","AAAAAAAA" +"00,000",,"aaaaa.aa@aaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000A0A","AAAA" +"000,000","000,000","aaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000AAA00","AAAAAAAA" +"000,000","000,000","aaaaa_@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000AAA00","AAAAAAAA" +"00,000",,"aaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000A0A","AAAA" +"000,000","000,000","aaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000A000","AAAAAAAA" +"000,000","00,000","aaaaaa_aaaaa00@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000AAA00","AAAAAAAA AAA AAAAAAA" +"000,000","000,000","aaaaaaa00@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000AAA00","AAAAAA AAAA AAAAA" +"000,000","00,000","aaaaaaaaaa00@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000AAA00","AAAAAA AAAA AAAAA" +"000,000",,"aaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000AAA00","AAAA" +"000,000","00,000","aaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000AAA00","AAAAAAAA" +"000,000",,"aaaaaaa@aaaaaaaaa.aa",00/00/0000 0:00:00AA,"0,000.00","AAA000AAA00","AAAA" +"000,000","00,000","aaaaaaaaaaaa@aaaa-aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000AAA00","AAAAAAAA" +"000,000",,"aa_aaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000AAA00","AAAA" +"000,000",,"aaaaaaaaaa0@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000AAA00","AAAA" +"000,000","00,000","aaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000AAA00","AAAAAAAA" +"000,000","00,000","aaaaa_aaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000AAA00","AAAAAAAA" +"000,000","00,000","aaaaaaaaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000AAA00","AAAAAAAA" +"000,000",,"aaaaaa_aaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000AAA00","AAAA" +"000,000",,"aaaaaaaa00@aaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000AAA00","AAAA" +"000,000","000,000","aaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000AAA00","AAAAAA AAAA AAAAA" +"000,000",,"aaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000AAA00","AAAA" +"000,000",,"aaaaaaaaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000AAA00","AAAA" +"00,000",,"aaaaaaa0@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00000A","AAAA" +"00,000",,"aaaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00000A","AAAA" +"000,000","0,000","aaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000AA0A","AAAAAAAA" +"000,000","00,000","aaaaaaaaaa@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000A00","AAAAAAAA AAA AAAAAAA" +"000,000",,"aaaaa.aaaaa@aaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000000","AAAA" +"000,000",,"aaaaa.aaaaa@aaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000000","AAAA" +"000,000",,"aaaaaa.aaaaaa@aaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000000","AAAA" +"000,000","000,000","aaaaaaaa00@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA00AA0A0","AAAAAAAA" +"00,000","000,000","aaaaaaa0@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000A000","AAAAAAAA" +"00,000","00,000","aaaaaaaaa0000@aaaaa.aa",00/00/0000 00:00:00AA,"0,000.00","AAA0000000A","AAAAAAAA" +"00,000","00,000","aaaaaa.aaaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A0A000A","AAAAAAAA" +"000,000",,"aaaaaaaaaaaa@aaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A000000","AAAA" +"000,000",,"aaaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00000A","AAAA" +"000,000",,"aaa@aaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A000000","AAAA" +"000,000",,"aaaaaaaaaa@aaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A000000","AAAA" +"000,000",,"a.aaaaaaaaa@aaaaaaaa.aa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00000A","AAAA" +"000,000",,"aaaaaaaa@aaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A000000","AAAA" +"000,000",,"aaaaaaa@aaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A000000","AAAA" +"000,000",,"aaaaaa.aaaaaaa@aaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000000","AAAA" +"000,000",,"aaaaa.aaaaaaaa@aaaaaaaa.aa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00000A","AAAA" +"000,000","000,000","Aaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA000A0A0A","AAAAAAAA" +"000,000",,"aaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA00A00A","AAAA" +"000,000","000,000","Aaaaaaa000@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000A00","AAAAAAAA" +"000,000",,"aaaaaaaaaaaa@aaaaaaaaa.aa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00000A","AAAA" +"00,000","000,000","aaaaa.aaaaaaaaa@aaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA00AA0AA","AAAAAAAA" +"00,000",,"aaaaaaaa@aaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA00AA0AA","AAAA" +"000,000",,"aaaaaa.aaaaa@aaaaaaaa.aa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00000A","AAAA" +"000,000","000,000","aaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00000A","AAAAAAAA" +"000,000",,"aaaaaaaa.aaaaaaa@aaaaaaaaaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00000A","AAAA" +"000,000",,"aaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00000A","AAAA" +"00,000",,"aaaaaaaa@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000A000","AAAA" +"000,000",,"aaaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000000","AAAA" +"000,000",,"aaaaa_aaaaa@aaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000000","AAAA" +"000,000","00,000","aaaa00@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000A0A","AAAAAAAA" +"00,000",,"aaaaaa@aaaaaaaaa.aa",00/00/0000 0:00:00AA,"0,000.00","AAA0A0A00AA","AAAA" +"00,000",,"aaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000000","AAAA" +"000,000",,"aaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000000","AAAA" +"000,000",,"aaaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000000","AAAA" +"00,000","000,000","aaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00A000","AAAAAAAA" +"000,000",,"aaaaaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000000","AAAA" +"000,000",,"aaaaaa.a@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000000","AAAA" +"000,000",,"aaaaaaa.aa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000000","AAAA" +"00,000",,"aaaaa.aaaaa@aaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA00","AAAA" +"000,000",,"aaaa00@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00A000","AAAA" +"000,000",,"aaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00A000","AAAA" +"00,000","00,000","aaaaaaa_aaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000A000A","AAAAAA AAAA AAAAA" +"000,000",,"aaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000A00","AAAA" +"00,000","000,000","aaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000000","AAAAAAAA" +"000,000",,"aaaaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000A00A","AAAA" +"00,000",,"aaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000000","AAAA" +"000,000","000,000","Aaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000A00A","AAAAAAAA AAA AAAAAAA" +"00,000",,"aaaaaaaa00@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000A00","AAAA" +"00,000",,"aaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000A00","AAAA" +"00,000",,"aaaaaaa00@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000A00","AAAA" +"00,000",,"aaaa00aa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000A00","AAAA" +"000,000",,"aaaaaaaaaa0000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000000A","AAAA" +"000,000",,"aaaa@aaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000A0A00","AAAA" +"00,000",,"aaaaaaaa000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA00A000","AAAA" +"00,000","000,000","aaaaa_aaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000000","AAAAAAAA" +"000,000","000,000","aaaaaaaaa0@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA000A0000","AAAAAAAA" +"000,000","000,000","aaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000000","AAAAAAAA" +"000,000",,"aaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000000","AAAA" +"000,000","000,000","aaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000000","AAAAAAAA AAA AAAAAAA" +"000,000","000,000","Aaaaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000000A","AAAAAAAA" +"00,000",,"aaaaaaa0000@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaa@aaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000000A","AAAA" +"00,000",,"aaaaaaaaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000A00","AAAA" +"000,000",,"aaaaaaa0aaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000A000","AAAA" +"00,000",,"aaaaaaa000@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAA" +"000,000",,"aaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A0A0A00","AAAA" +"00,000","00,000","aaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA00A00A0","AAAAAAAA" +"000,000",,"Aa000@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000000","AAAA" +"000,000",,"Aaaaaa_aaa00@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000000","AAAA" +"000,000",,"aaaaaaa_aaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000000","AAAA" +"000,000",,"aaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000000","AAAA" +"000,000",,"aaaaaaaaa000000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000000","AAAA" +"000,000",,"aaa00000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000000","AAAA" +"000,000",,"aaaaaaaaa00@aa.aaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000000","AAAA" +"000,000",,"aaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000000","AAAA" +"000,000",,"aaaaaaaa00@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000000","AAAA" +"000,000",,"aaaaa00@aaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000000","AAAA" +"000,000",,"aaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000000","AAAA" +"000,000",,"aaaaaaaaaaaaaaaa@aaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000000","AAAA" +"000,000",,"aaaaaaaaaaaaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000000","AAAA" +"000,000",,"aaaaaaaa00@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000A00A","AAAA" +"00,000",,"aaaaaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA0A0000","AAAA" +"000,000","000,000","aaaaaaa000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA00AA00","AAAAAAAA" +"000,000",,"aaaaaaaaa@aaaaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA00AA00","AAAA" +"000,000",,"aaaaaaaaa@aaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA00AA00","AAAA" +"000,000",,"aaaaaaaaa00@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA00AA00","AAAA" +"000,000",,"aaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA00AA00","AAAA" +"000,000",,"aaa_aaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA00AA00","AAAA" +"000,000",,"aaaaaaa@aaaaaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA00AA00","AAAA" +"00,000",,"aaaaaaaaa000@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000A00A","AAAA" +"00,000","00,000","a000000@aaaaa.aaa.aa",00/00/0000 00:00:00AA,"0,000.00","AAA0A000A0A","AAAAAAAA" +"000,000",,"aaaaaa0000@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAA" +"000,000","000,000","Aaaaaaa_Aaa@aaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAAAAAA" +"00,000","00,000","aaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA00","AAAAAAAA" +"00,000",,"aa_aaaaaaa@aaaaaa.aa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000A00","AAAA" +"00,000",,"aaaa.aaaa@aa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A000A00","AAAA" +"000,000","00,000","aaaaaa00@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA00A000","AAAAAAAA" +"00,000","00,000","aaaa_000@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000000","AAAAAAAA AAA AAAAAAA" +"00,000",,"aaaaaa0000@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000000","AAAA" +"00,000","000,000","aaaa_000@aaaa.aa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000000","AAAAAAAA" +"000,000",000,"000aaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA00000A","AAAAAAAA" +"00,000","0,000","aaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000A00","AAAAAAAA" +"00,000",,"aaaa000@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000A00A","AAAA" +"000,000",,"aaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00A00A","AAAA" +"000,000",,"aaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000AA00","AAAA" +"000,000","00,000","aaa00000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000A00","AAAAAAAA" +"00,000",,"aaaaaaaaa@aaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00AA00","AAAA" +"00,000","000,000","aaaaaaaa@aaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00AA00","AAAAAAAA" +"00,000",,"aaaaaaa@aaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00AA00","AAAA" +"00,000",,"aaaaaaaaa@aaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00AA00","AAAA" +"00,000",,"aaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00AA00","AAAA" +"00,000",,"aaaaa@aaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00AA00","AAAA" +"00,000",,"aaaaaaaaaaa@aaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00AA00","AAAA" +"00,000",,"aaaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A000A0A","AAAA" +"00,000",,"aaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AA.00000000","AAAA" +"00,000",,"aaaaaaaa@aaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00A000","AAAA" +"00,000",,"aaaaaaaa@aaaaaaaaaaaaa.aa",00/00/0000 00:00:00AA,"0,000.00","AA.00000000","AAAA" +"00,000","000,000","aaaaa00aaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AA.00000000","AAAAAA AAAA AAAAA" +"00,000","000,000","aaaaaaaa0000@aaaaa.aaa.aa",00/00/0000 00:00:00AA,"0,000.00","AAA00000000","AAAAAAAA" +"000,000",,"aaaaaaaaaaa@aaaaaaaaa.aa",00/00/0000 00:00:00AA,"0,000.00","AAA00000000","AAAA" +"00,000",,"aaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AA.00000000","AAAA" +"00,000",,"aaaa@aaaaaaaaaaaaa.aa",00/00/0000 00:00:00AA,"0,000.00","AA.00000000","AAAA" +"00,000",,"aaaaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00A000","AAAA" +"00,000",,"aaaaaaaaaa000@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00A000","AAAA" +"00,000",,"aaaaaaaa0000@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA00A0A0A","AAAA" +"00,000",,"aaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000A000","AAAA" +"00,000",,"aaaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00000A","AAAA" +"00,000",,"aaaaaaaaaa00@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000000","AAAA" +"00,000",,"aaaaa@aaaaaaaaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA0A000A","AAAA" +"00,000","000,000","aaaaaaaaaa@aaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00A000","AAAAAA AAAA AAAAA" +"000,000","00,000","aaaaaaaaaaaaa00@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAAAAAA" +"000,000",,"aaaaa_aaaaa00@aaa.aaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAA" +"000,000",,"aaaaaaaa@aaaaa.aaa.aa",00/00/0000 0:00:00AA,"0,000.00","AAA0000A000","AAAA" +"00,000",,"aaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000A0000","AAAA" +"00,000","00,000","aaaaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000A0000","AAAAAAAA" +"00,000",,"aaaaaa_aaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000A0000","AAAA" +"000,000","000,000","aaaaaaaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000A0A","AAAAAAAA" +"000,000",,"aaaaaaaaa@aaaaaaaaaaaaaaaaa.aaa.aa",00/00/0000 0:00:00AA,"0,000.00","AAA00000A0A","AAAA" +"00,000",,"aaaaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"AaaaaaaaAaaa@AaaaaaaAaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA00A000","AAAA" +"00,000",,"aaaaa_aaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A0A000A","AAAA" +"000,000","000,000","aaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAAAAAA" +"00,000",,"aaaaa_aaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A0A000A","AAAA" +"00,000",,"aaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A0A000A","AAAA" +"000,000","000,000","AAAA_AAAAAAA@AA.AAA",00/00/0000 0:00:00AA,"0,000.00","AAAA000A000","AAAAAA AAAA AAAAA" +"000,000",,"aa0aaaaaaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000A00AA","AAAA" +"000,000","00,000","a.a.aaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000A0A","AAAAAAAA" +"000,000",,"aaaaaaaa.aaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAA" +"000,000",,"aaaaaaa00@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAA" +"000,000",,"aaaaa0000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAA" +"000,000",,"aaaaaa00@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAA" +"000,000",,"aaaaaaaa@aaaaaaa-aaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAA" +"000,000",,"Aaaaaaaa.Aaaaaaa@aaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAA" +"000,000",,"aaaaaaaaaaa00@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAA" +"000,000",,"aaaaa.aaaa@aa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAA" +"000,000",,"aaa.aaaaaaa00@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAA" +"000,000",,"aaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAA" +"000,000",,"aa.aaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAA" +"000,000",,"aaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAA" +"000,000",,"AAAAAA.AAAAAAAA@aaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAA" +"000,000",,"aaaaaaaa00@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAA" +"000,000",,"aaaaaaa0@aaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAA" +"000,000",,"aaaaaa_aaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAA" +"000,000",,"Aaaaaaaaa0@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAA" +"000,000",,"aaaaaaa00@aaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAA" +"000,000",,"aaaaaa0000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAA" +"000,000",,"aaaaaa_aaaaaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAA" +"000,000",,"AAA0@aaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAA" +"00,000",,"aaaaa_aaaaaaaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000A00A","AAAA" +"00,000",,"aaaaaaaa@aaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000A00A","AAAA" +"000,000","000,000","aaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A0A00A0","AAAAAAAA" +"000,000","000,000","aaaaaa_aaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000000","AAAAAAAA" +"000,000","00,000","aaaaaaaaaaa@aaaaaaa.aa.aa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAAAAAA" +"0,000",,"aaaaaa_aaaa_aaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000A000","AAAA" +"0,000",,"aaaaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000A000","AAAA" +"0,000",,"a_a_a_a_a_0_00@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000A000","AAAA" +"0,000","000,000","aaaaaaaaaaaaa00@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000A000","AAAAAAAA" +"0,000",,"aaaaaaaaa_aaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000A000","AAAA" +"0,000",,"aaaaaaa.aaaaaaaa00@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000A000","AAAA" +"00,000","000,000","aa_aaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000AA00","AAAAAAAA" +"00,000","000,000","aaaaaaa0@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000A000","AAAAAAAA" +"000,000",,"aaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000A000","AAAA" +"00,000",,"aaaaaaaa@aaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000A00","AAAA" +"000,000","000,000","aaaaaa000@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000000","AAAAAAAA AAA AAAAAAA" +"000,000","000,000","aaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000A00A","AAAAAAAA" +"000,000","000,000","aaaaaaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A000000","AAAAAAAA" +"00,000","00,000","aa.aaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAAAAAA" +"00,000","000,000","aaaaaa@aaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000A000","AAAAAAAA" +"000,000","00,000","aaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000AA0A","AAAAAAAA" +"00,000",,"aaaaaaaaaaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00AA00","AAAA" +"000,000","00,000","aaaaaaaaa.aaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000A00","AAAAAAAA" +"000,000",,"Aaaaaaa.A@aaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000AA00","AAAA" +"00,000","00,000","aaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000A0A","AAAAAAAA" +"000,000",,"aaaaaa000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000000","AAAA" +"00,000",,"aaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000A000","AAAA" +"00,000",,"aaaa_00@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000AA00","AAAA" +"00,000","00,000","aaaa.aaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA00A0A00","AAAAAAAA" +"00,000",,"Aaaaaa@aaaaaaaaa.aa.aa",00/00/0000 0:00:00AA,"0,000.00","AAAA000A00A","AAAA" +"00,000",,"Aaa000@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000A00A","AAAA" +"00,000",,"aaaaaaaaa000@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"a.aaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000A000","AAAA" +"00,000","00,000","Aaaaaaa_Aaaaaaaa@aa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000000A","AAAAAAAA" +"000,000","0,000","Aaaaaa.Aaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000A0A","AAAAAAAA" +"000,000","000,000","aaaaaa0a@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000A0A","AAAAAAAA AAA AAAAAAA" +"00,000",,"aaaa@aaaaaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000000","AAAA" +"000,000",,"aaaaaaaaa.a.aaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000A0A","AAAA" +"000,000",,"aaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00AA0A","AAAA" +"00,000",,"aaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00A00A","AAAA" +"000,000","00,000","aaaaaaaaaaa@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA00A00A0","AAAAAAAA" +"000,000",,"aaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000A00","AAAA" +"00,000","000,000","aaaaa.aaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000000","AAAAAAAA" +"000,000",,"aaaaaa@aaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA000A0AAA","AAAA" +"00,000",,"aaaa.aaaaa0@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000000","AAAA" +"00,000",,"aaaaaaaaaaaa@aaaaaaaaa.aa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000000","AAAA" +"00,000",,"aaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00AA00","AAAA" +"00,000","00,000","aaaaa.aaaaa0@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000000","AAAAAAAA" +"00,000","00,000","aaaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000000","AAAAAAAA" +"00,000",,"aaaaaa0@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00AA00","AAAA" +"00,000",,"aaaaaaa.aaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00AA00","AAAA" +"000,000",,"aaaaaaa.aaaaaaaaa@aaaaaaaaa.aa",00/00/0000 00:00:00AA,"0,000.00","AAA0000A00A","AAAA" +"00,000",,"aaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00AA00","AAAA" +"000,000",,"aaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000AA0A","AAAA" +"000,000","00,000","aaaaa@aa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA000A0AA0","AAAAAAAA AAA AAAAAAA" +"00,000","000,000","aaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00AA00","AAAAAAAA" +"00,000",,"aaaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000000","AAAA" +"00,000","000,000","Aaaa.Aaaaa@Aaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A0A00A0","AAAAAAAA" +"00,000",,"aaaaaaaaaaaaaaa0@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA000AAAAA","AAAA" +"00,000","000,000","aaaaaaaaa@aaaaaaaa.aa",00/00/0000 00:00:00AA,"0,000.00","AAAAA000000","AAAAAAAA" +"000,000",,"aaaa.aa-aaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA000000","AAAA" +"00,000",,"aaaaaa000@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000A00","AAAA" +"00,000","0,000","aaaaaaaa0@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000A00","AAAAAAAA" +"00,000",,"aaaaaa_aaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000A00","AAAA" +"00,000","000,000","aaaaaaaa@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000A00","AAAAAAAA" +"00,000",,"aaaaa.aaaaa@aaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000AA00","AAAA" +"00,000",,"aaaaa@aaaa.aa",00/00/0000 00:00:00AA,"0,000.00","AAAA000AA00","AAAA" +"00,000",,"aaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000000","AAAA" +"0,000",,"aaaa0000@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000A00","AAAA" +"000,000",,"aaaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00AA0A","AAAA" +"00,000","000,000","aaaaaaaaaaaa0@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000000A","AAAAAAAA" +"000,000",,"aaaaaaa.aaaaaaaaa@aaaa.aaaaaa.aa",00/00/0000 00:00:00AA,"0,000.00","AAAAA000000","AAAA" +"000,000","00,000","aaaaaaaaaaa@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A000A0A","AAAAAAAA" +"000,000",,"Aaaa-Aaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000AA00","AAAA" +"00,000","000,000","aaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000A00","AAAAAAAA" +"00,000","00,000","aaaaaaaaa00@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000AA0A","AAAAAAAA" +"00,000",,"aaa000@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000A00","AAAA" +"00,000",,"aaaa.a.0000@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA00A0000","AAAA" +"000,000",,"aaaaa000@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00000A","AAAA" +"000,000",,"aaaaaaaaa@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000000","AAAA" +"00,000","00,000","aaaaaaaaaaa@aaaaaaaaa.aa",00/00/0000 00:00:00AA,"0,000.00","AAA0000AA0A","AAAAAAAA" +"000,000","000,000","aaaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A0A00AA","AAAAAAAA AAA AAAAAAA" +"000,000",,"Aaaaaaaa@aaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000","000,000","aaaaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000A0A","AAAAAAAA" +"00,000",,"aaaaaaa@aaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000AA0A","AAAA" +"000,000",,"aaaaaaaaaaa@aaaaa.aa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAA" +"00,000",,"aaaaaaa@aaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000000","AAAA" +"00,000",,"aaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA00","AAAA" +"000,000",,"aaaaaaaaa0000@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000A00AA","AAAA" +"00,000",,"aaaaaaaaaa00@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00AA00","AAAA" +"00,000",,"Aaaa_Aaaaaa@Aaaaaaaaaaa.Aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00AA00","AAAA" +"00,000",,"aaaaaaaaaa@aaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00AA00","AAAA" +"000,000","00,000","aaaaaaaaaa@aaaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000AAA0A","AAAAAAAA AAA AAAAAAA" +"00,000","00,000","aaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000000","AAAAAAAA" +"00,000",,"aaaaaaaaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000000","AAAA" +"000,000","000,000","aaaaa@aaaaaaaaaaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000AA00","AAAAAAAA AAA AAAAAAA" +"000,000",,"aaaaaa.aaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA0A","AAAA" +"000,000","000,000","aaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000A00","AAAAAAAA" +"00,000","00,000","aaaaaaaa00@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000A00","AAAAAAAA" +"000,000","000,000","aaaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000000","AAAAAAAA" +"000,000",,"a.aaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA00AAA00","AAAA" +"00,000","000,000","aaaaaaaaaaa@aaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000AA0A0","AAAAAAAA" +"00,000","00,000","aaaaaaa@aaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000AA0A0","AAAAAA AAAA AAAAA" +"000,000",,"aaaaaaa.aaaaaa@aaaaaa.aa",00/00/0000 0:00:00AA,"0,000.00","AAA0000A00A","AAAA" +"0,000",,"aaaa.aaaaaaa@aaaaaa.aa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000000","AAAA" +"00,000","000,000","aaaaaaaaaaa@aaa.aa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00A000","AAAAAAAA" +"00,000",,"aaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA0A","AAAA" +"00,000","000,000","aaaaaaa_aaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00A000","AAAAAA AAAA AAAAA" +"00,000","000,000","aaaaaa@aaa-aaaa.aa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00A000","AAAAAAAA" +"00,000",,"aaaaa@aaaaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00A000","AAAA" +"00,000",,"aaaaaaaa@aaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00A000","AAAA" +"000,000","00,000","aaaaaaaaaaaa00@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAAAAAA AAA AAAAAAA" +"000,000","00,000","aaaaaa.aaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000A00","AAAAAAAA" +"000,000","00,000","aaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA00AA0A","AAAAAAAA" +"00,000","000,000","aaaaaaa000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000A000","AAAAAAAA" +"000,000",,"AAAAA_AAAAA@AAAAA.AAA",00/00/0000 0:00:00AA,"0,000.00","AAA00000A00","AAAA" +"000,000",,"aaaaa_aaaaa@aaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAA" +"000,000",,"aaaaa_aaaaaa@aaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAA" +"00,000","000,000","aaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000000","AAAAAAAA AAA AAAAAAA" +"000,000","00,000","aaaaaa000@000.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000A00","AAAAAAAA AAA AAAAAAA" +"0,000","000,000","aaaaa000000@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000000","AAAAAA AAAA AAAAA" +"000,000",,"aaaaa00@aaaa.aaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000A00","AAAA" +"000,000",,"aaaaaaa@aaaaaaaa.aa",00/00/0000 00:00:00AA,"0,000.00","AAA0A000A00","AAAA" +"000,000","00,000","aaaa0000@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000A00","AAAAAAAA" +"00,000",,"aaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000000","AAAA" +"00,000","000,000","aaa000@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000000","AAAAAAAA" +"000,000","000,000","aaaaaa000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000A0A","AAAAAAAA" +"00,000",,"aaaaaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00A000","AAAA" +"00,000","000,000","aaaaaaa@aaaa.aaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA00","AAAAAA AAAA AAAAA" +"000,000",,"aaaaa00@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000A00","AAAA" +"00,000",,"Aaaaa.Aaaaaa@aaaaaaaaa-aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA00","AAAA" +"00,000","00,000","aaa000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA00AA000","AAAAAAAA" +"00,000","000,000","Aaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAAAA AAAA AAAAA" +"00,000","00,000","aaaaaaa@aaaaaaaaaaaaa.aa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAAAAAA" +"00,000","000,000","aaaaa00aaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAAAAAA" +"00,000",,"aaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAA" +"00,000",,"aaaaaaaaa@aaaaaaaaaaaaa.aa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAA" +"00,000",,"aaaaaaa@aaaaaaaaaaaaa.aa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAA" +"00,000",,"aaaaaaaa@aaaaaaaaaaaaa.aa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAA" +"00,000",,"aaaaaaa.aaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAA" +"00,000","00,000","aaaaaa000@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAAAAAA" +"000,000",,"aaaaaaa0000@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA00","AAAA" +"000,000",,"aaaaaa.aaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000AAAA0","AAAA" +"00,000",,"aaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"00,000",,"aaaaaa@aaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaa.aaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000000","AAAA" +"00,000",,"aaaaaa00@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA000A000A","AAAA" +"000,000",,"aaaaaa@aaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA00000A","AAAA" +"00,000",,"aaaaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A0A0000","AAAA" +"00,000",,"aaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A0A0000","AAAA" +"00,000","00,000","aaaa000aa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00AA0A","AAAAAAAA" +"00,000",,"aaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00AA0A","AAAA" +"00,000",,"Aaaa.Aaaaaaa@aaaaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA000AA00A","AAAA" +"000,000",,"aaaaaa.aaaaa@aaaaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA000A00A0","AAAA" +"00,000","000,000","aaaaaaa.aaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A000000","AAAAAAAA AAA AAAAAAA" +"000,000",,"aaaaa@aaaaaaa.aa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000A0A","AAAA" +"0,000",,"aaaaa.aaaaaa@aaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000A000","AAAA" +"00,000","00,000","aaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA000A00","AAAAAAAA" +"000,000",,"aaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA0AAA00","AAAA" +"00,000",,"aaaaaaa.aaaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA0A00A0","AAAA" +"00,000","000,000","aaaaaaaaa@aaaaaaa.aa",00/00/0000 00:00:00AA,"0,000.00","AAAA000000A","AAAAAAAA" +"00,000",,"Aaaaaaaa.aaaaaaa@aaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000A000","AAAA" +"00,000",,"aaaaaaaaaa@aaaaa.a",00/00/0000 00:00:00AA,"0,000.00","AAAAA000000","AAAA" +"00,000","000,000","aaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA00AAA0A","AAAAAAAA" +"0,000","000,000","aaaaaaa.aaaaaa@aaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00A000","AAAAAAAA" +"00,000",,"aaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00A000","AAAA" +"00,000",,"aaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00A000","AAAA" +"00,000",,"aaaaaaaa@aaaaaa.aa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00A000","AAAA" +"00,000",,"aaaaaaaaaa@aaaaaaaaa.aa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00A000","AAAA" +"00,000",,"aaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00A000","AAAA" +"00,000",,"AaaaaAaaaAaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000AA00","AAAA" +"00,000",,"aaaaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000000","AAAA" +"00,000",,"Aaaaaaa.Aaaaaaaa@aaaaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA000A00AA","AAAA" +"00,000",,"aaaaaa_00@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00A00A","AAAA" +"000,000",,"aaaaaaaaaa@aaaaaaaaaaa.aa",00/00/0000 00:00:00AA,"0,000.00","AAA0A000A00","AAAA" +"00,000",,"aaaaaa@aaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000AA00","AAAA" +"000,000",,"aaaaaa0a@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00000A","AAAA" +"000,000",,"aaaaa0000@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"00,000",,"aaaaaaaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000A000","AAAA" +"00,000",,"aaaaaaaaa00@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00AA00","AAAA" +"00,000",,"aaaaaaaaa0000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00AA00","AAAA" +"00,000",,"aaaaa0_aaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00AA00","AAAA" +"00,000",,"aaa_aaaaa_aaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00AA00","AAAA" +"000,000",,"aaaa@aaaaaaaaaaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000AA00","AAAA" +"000,000",,"aaaaaa@aaaaaaaaaaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000AA00","AAAA" +"00,000",,"aaaaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000000A","AAAA" +"00,000",,"aaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000000A","AAAA" +"000,000",,"aaaaaa0000@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA00A000","AAAA" +"00,000",,"aaaaaaaa0000@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA00000A","AAAA" +"00,000","00,000","aaaaaaaa_aaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00000A","AAAAAAAA" +"000,000","00,000","aaaaaaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000A0A","AAAAAAAA" +"00,000","000,000","aaaaaaa@aaaaa.aa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00A000","AAAAAAAA" +"000,000",,"aaaaaaaaaaa@aaaaaaaaaaa-aa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA00","AAAA" +"00,000",,"aaaaa.aaaaaaa@aa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00AA00","AAAA" +"000,000",,"aaaaaaa00@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000A0A","AAAA" +"00,000",,"Aaaaa.Aaaaaaaa@aaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA00","AAAA" +"00,000","000,000","aaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAAAAAA" +"00,000",,"aaaaaaaaa00@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA0A","AAAA" +"000,000","00,000","aaaaaaa.aaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000000A","AAAAAAAA" +"000,000",,"aaaaa.aaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000A000","AAAA" +"000,000",,"aaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA00000A","AAAA" +"00,000",,"aaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00AA00","AAAA" +"000,000","00,000","aaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000A00A","AAAAAAAA" +"00,000",,"aaaaaa@aaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"00,000",,"aaaaa000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00A000","AAAA" +"000,000",,"Aaaaaaaaaaaaaaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000A00","AAAA" +"000,000",,"Aaaaaaaaaaaaaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000A00","AAAA" +"00,000",,"aaaaaaaa000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000000","AAAA" +"00,000",,"aaaaaa0000@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000000","AAAA" +"00,000",,"aaaaaaaaaaaaaaaaaa@aa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000000","AAAA" +"00,000",,"aaaaaaaaaa@aa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000000","AAAA" +"00,000",,"aaaa_00@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000000","AAAA" +"00,000",,"aaa_aaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000000","AAAA" +"00,000",,"aaaaaaaaaaaaaa@aa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000000","AAAA" +"00,000",,"a_aaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000000","AAAA" +"000,000","00,000","aaaaa.aaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAAAA AAAA AAAAA" +"00,000",,"aaaaaa0000@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAA" +"00,000",,"aaaa@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA00A00A","AAAA" +"00,000",,"aaaaaaaaaaaa00@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA00A00A","AAAA" +"000,000","000,000","aaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000AA00","AAAAAA AAAA AAAAA" +"0,000",,"Aaaaa00@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000A000","AAAA" +"0,000",,"aaaaa.00@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000A000","AAAA" +"0,000",,"aaaaaaaaaaaa00@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000A000","AAAA" +"0,000",,"aaaaa.aaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000A000","AAAA" +"0,000","000,000","aaaaaaa00@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000A000","AAAAAAAA" +"0,000",,"aaaaaaa0000@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000A000","AAAA" +"000,000",,"aaa_aa@aaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000A0A","AAAA" +"00,000",,"aaaaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"00,000","000,000","aaaaaaaa00@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAAAAAA" +"00,000",,"aa0aaaaaaa_0000@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA00A000","AAAA" +"000,000",,"aaaaaaaa@aaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000A00","AAAA" +"00,000",,"Aaaaaaaaaaaaa00@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000A0A","AAAA" +"00,000",,"aaaa.aaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000AA0A","AAAA" +"00,000",,"aaaaaaaa@aaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000AA0A","AAAA" +"00,000",,"aaaaa@aa0aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000AA0A","AAAA" +"00,000",,"aaaaaaaaaa@aaaaa.aa",00/00/0000 0:00:00AA,"0,000.00","AAA0000AA0A","AAAA" +"00,000","000,000","aaaaaa0aa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000A00","AAAAAAAA" +"00,000",,"Aaaaaa.Aaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000A0A","AAAA" +"000,000",,"aa_aaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000AA0AA","AAAA" +"000,000","00,000","Aaaaa.Aaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000A0A","AAAAAAAA" +"00,000",,"aaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA00AAA00","AAAA" +"00,000",,"aaaa0000@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000A000A","AAAA" +"00,000","0,000","aaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000AAAAA","AAAAAAAA" +"000,000",,"aaaa.aaaaaaaa@aaaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000000","AAAA" +"00,000","00,000","aaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000000","AAAAAAAA AAA AAAAAAA" +"000,000","00,000","Aaaa_aaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000A0A","AAAAAAAA" +"000,000","000,000","a_aaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000A00","AAAAAAAA" +"00,000","000,000","aaaaaaa.aaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA000AAA00","AAAAAAAA" +"00,000",,"aaaaaaaaa@aaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA00A000","AAAA" +"00,000",,"aaaa.aaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A000A00","AAAA" +"000,000","000,000","aaaaaa0000@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000AA00","AAAAAAAA" +"000,000",,"aaaaaaaaa@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000000","AAAA" +"000,000",,"aaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA00000A","AAAA" +"00,000",,"Aaaaa.A.Aaaaaaaaa@Aaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA000A0000","AAAA" +"000,000","000,000","Aaaaaa0000@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000A0A","AAAAAA AAAA AAAAA" +"000,000","000,000","aaaaaaa_aaaaa@aaaaaaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA00A0AA0","AAAAAAAA" +"000,000",,"aaaaaa_aaaaaaa@aaaaaaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA00A0AA0","AAAA" +"000,000",,"aaaaa_aaaa@aaaaaaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA00A0AA0","AAAA" +"000,000",,"aaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000A0A","AAAA" +"00,000",,"aaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000000","AAAA" +"000,000",,"aaaaaa00000@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000A0A","AAAA" +"00,000",,"aaa_aaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000A00","AAAA" +"000,000",,"aaaaaaa.aaaaaa@aaaaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA00AA0A0","AAAA" +"000,000",,"aaaa00@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A000A0A","AAAA" +"00,000",,"aaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA000000","AAAA" +"0,000",,"aaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000000","AAAA" +"00,000",,"AAAAA.AAAAAA@AAAAAAA.AAA",00/00/0000 00:00:00AA,"0,000.00","AAAA000A00A","AAAA" +"00,000",,"aaaaaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000000","AAAA" +"00,000",,"aaaaa@aaaa.aa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000000","AAAA" +"00,000","000,000","aaaaa_a_aaaaa00@aaa.aaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000A00","AAAAAAAA" +"00,000",,"aaaaaaaaa0000@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000A00","AAAA" +"000,000",,"aaaaaaaaaaaaa@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA000000","AAAA" +"000,000","000,000","aaaaa@aaaaaaaaaaaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000AA00","AAAAAAAA AAA AAAAAAA" +"000,000",,"a.aaaa@aaaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000AA00","AAAA" +"00,000",,"aaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA000A0000","AAAA" +"00,000","000,000","aaaaa@aaaaaaaaaaaaaaaa.aa",00/00/0000 00:00:00AA,"0,000.00","AAAAA00A000","AAAAAAAA" +"00,000","0,000","aaaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000AA00","AAAAAAAA" +"00,000",,"aaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000000","AAAA" +"000,000",,"aaaaa.aaaaaaa@aaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000A00","AAAA" +"00,000",,"aaaaa.a.aaa@aaaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000AA0A0","AAAA" +"00,000",,"aaaaa.aaaa.aaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA0AAA00","AAAA" +"00,000","000,000","aaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000A000","AAAAAAAA" +"000,000",,"aaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000A000","AAAA" +"000,000",,"aaaaaaaaaaa000@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000000","AAAA" +"000,000",,"aaaa00@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000000","AAAA" +"000,000",,"aaaaaa.a.aaaa@aaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000AA00","AAAA" +"000,000","0,000","aaaaaa_aaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000AA00","AAAAAAAA" +"00,000","000,000","aaaaaa@aaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000000","AAAAAAAA" +"000,000",,"aaaaaa-@aaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA00A0000","AAAA" +"0,000",000,"a.aaaaaaaa0000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAAAAAA" +"00,000","00,000","Aaaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000A00","AAAAAAAA" +"000,000","0,000","aaaaaa000@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000A00A","AAAAAAAA AAA AAAAAAA" +"00,000","000,000","aaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000A000A","AAAAAA AAAA AAAAA" +"000,000",,"aaaaaaaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00AA0A","AAAA" +"0,000","000,000","aaaaaaaa@aaaa.aa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAAAAAA" +"000,000",,"aaaaa_aaaaaaaa_00@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA00A00A","AAAA" +"00,000",,"aaaaaa00@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000A00","AAAA" +"000,000",,"aaaaaaa@aa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAA" +"00,000",,"aaaa000@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000000","AAAA" +"00,000",,"aaaaaaa@aaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000000","AAAA" +"00,000","00,000","aaaaaaaaaa000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000A00A","AAAAAAAA" +"00,000",,"AaaAaaaa_Aaaaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000A00A","AAAA" +"00,000",,"aaaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000A00A","AAAA" +"00,000",,"aaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00A00A","AAAA" +"00,000","00,000","a_aaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00A00A","AAAAAAAA" +"00,000",,"aaaa.aaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00A000","AAAA" +"00,000",,"aaaaaaaaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000A000","AAAA" +"000,000",,"Aaaaaa.Aaaaaa@AAAaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000000A","AAAA" +"00,000",,"aaaaaaaa@aaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000AA00","AAAA" +"000,000",,"aaaaaaaaa@aaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA000AA000","AAAA" +"00,000",,"aaaaaaa@aaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00000A","AAAA" +"0,000","00,000","aaaaaaaa@aaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000000A","AAAAAAAA" +"00,000","00,000","aaaaaa0@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A000A00","AAAAAAAA" +"00,000","000,000","aaaaa00@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000000","AAAAAAAA" +"00,000","000,000","aaaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000A0A","AAAAAAAA" +"00,000",,"aaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000000","AAAA" +"00,000",,"aaaaaa.a.aaaaaaa@aa.aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000000","AAAA" +"00,000",,"aaaaaaa@aaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000AA00","AAAA" +"00,000",,"aaaaaa00000@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000000","AAAA" +"000,000",,"aaaa0aaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000A000","AAAA" +"000,000",,"aaaa@aaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000A000","AAAA" +"000,000",,"aaaaa.aaaa@aa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000A000","AAAA" +"000,000","000,000","aaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00AA00","AAAAAAAA" +"000,000","000,000","aaaaa.aaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA000A0A00","AAAAAAAA" +"000,000","000,000","aaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00000A","AAAAAAAA" +"00,000",,"Aaaaaa.Aaaaaa@aaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000AA00","AAAA" +"00,000",,"aaaa.aaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA000000","AAAA" +"00,000",,"aaaaa.aaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA000000","AAAA" +"00,000",,"AAaaaaa@aaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A000000","AAAA" +"00,000",,"aaaaaaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A000000","AAAA" +"00,000",,"aaaaa@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A0A00A0","AAAA" +"00,000",,"aaaaaa@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A0A00A0","AAAA" +"000,000",,"aaaaaaa.aaaaaa@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA00A00A","AAAA" +"00,000",,"aaaaaaaa-aaaaa00@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA000A00","AAAA" +"0,000","00,000","aaaa.aaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000AA0A","AAAAAAAA" +"00,000","000,000","a.aaaaaa@aaaaaaaaa.aa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000000","AAAAAAAA" +"000,000","000,000","aaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000A00","AAAAAAAA AAA AAAAAAA" +"000,000",,"aaaaaaa@aaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000A00","AAAA" +"000,000",,"aaaaaaaa00@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000AAAA0","AAAA" +"00,000","000,000","aaaaa.aaaaaaaa@aaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000000","AAAAAAAA" +"00,000",,"aaaa.aaaaaaaa@aaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000000","AAAA" +"00,000",,"aaaaaaaaa.aaaaaaaa@aaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000000","AAAA" +"000,000",,"aaaaa00@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000A000","AAAA" +"00,000",,"Aaaa000@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAA" +"00,000","000,000","aaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAAAAAA" +"00,000",,"aaaaa00@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAA" +"00,000",,"aaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAA" +"00,000","0,000","aaaaaaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAAAAAA" +"00,000",,"aaaaaa00@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAA" +"00,000","000,000","aaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAAAAAA" +"00,000",,"aaaaa.aaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAA" +"00,000",,"aaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAA" +"00,000",,"aaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAA" +"00,000","000,000","aaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAAAAAA" +"00,000",,"aaaa.aaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAA" +"00,000",,"aaaa0aaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAA" +"00,000",,"aaa000@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAA" +"00,000","00,000","aaaaaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAAAAAA" +"00,000","00,000","aaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAAAAAA" +"00,000",,"aaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAA" +"00,000",,"a.aaaaaaa0@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAA" +"00,000",,"aaa_aaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAA" +"00,000",,"aaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAA" +"00,000",,"a.aaa.a.00@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAA" +"00,000",,"aaaaaaaa0000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAA" +"00,000",,"Aaaaaaaa@aaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAA" +"00,000","00,000","aaaaaaaa@aa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAAAAAA" +"00,000",,"aaaa00_00@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAA" +"00,000","00,000","aaaaaaaa00@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAAAAAA" +"00,000",,"aaaaa000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAA" +"00,000",,"aaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAA" +"00,000",,"aaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAA" +"00,000",,"aaaaa0aaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAA" +"00,000","00,000","a_aaa_00@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAAAAAA" +"00,000",,"aaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAA" +"00,000","000,000","aaaaaaaaaa00000@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAAAAAA" +"00,000",,"aaaaaaa.aaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAA" +"00,000","00,000","aaaaa00@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAAAA AAAA AAAAA" +"00,000",,"aaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAA" +"00,000",,"aaaaaaa0a@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAA" +"00,000","00,000","aaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAAAAAA" +"00,000",,"aaaaaa00@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAA" +"00,000",,"aaaaaaa@aaaa.aa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAA" +"00,000","00,000","aaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAAAAAA AAA AAAAAAA" +"00,000","00,000","aaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAAAAAA" +"00,000","000,000","aaa0000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAAAAAA" +"00,000",,"aaaaaaaaa0@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAA" +"00,000",,"aaaaaaa0@aaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAA" +"00,000",,"aaaaaaa_aaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAA" +"00,000",,"aaaaaaaa.aaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAA" +"00,000","000,000","aaaaaaaaaa000000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAAAAAA" +"00,000",,"aaaaaa.aaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAA" +"00,000",,"aaa@aaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAA" +"00,000",,"aaaaaaaaaaaaaaaaaaaaa@aaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAA" +"00,000",,"0aaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAA" +"00,000",,"aaaaaa@aaaaa.aa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAA" +"00,000",,"aaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAA" +"00,000",,"aaaaaaaa@aaaaaaa.aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAA" +"00,000",,"Aaaaaaa000000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAA" +"00,000","000,000","aaaaaa.aaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAAAAAA" +"00,000",,"Aaaaaaaa.a.a@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAA" +"00,000",,"aaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAA" +"00,000",,"aaaaaa00@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAA" +"00,000","000,000","Aaaaaaaaaaa000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAAAA AAAA AAAAA" +"00,000",,"AAA0@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAA" +"00,000",,"aaaaaa0000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAA" +"00,000",,"aaaa_aaaaa_00@aaaaaaa.aa.aa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAA" +"00,000",,"aaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAA" +"00,000",,"aaaaaa00@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAA" +"00,000",,"aaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAA" +"00,000",,"aaaaaaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAA" +"00,000",,"aa.aaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAA" +"00,000",,"aaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAA" +"00,000",,"aaaa-aaaa@aaaaaaa.aa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAA" +"00,000",,"a00_aaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAA" +"00,000",,"aaaa_aaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAA" +"00,000",,"aaaaaaaaaaa00@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAA" +"000,000",,"aa0000@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000A000","AAAA" +"000,000",,"aaaaaaaaa@aaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000A000","AAAA" +"000,000",,"aaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000A000","AAAA" +"000,000","00,000","aaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000000","AAAAAAAA" +"000,000","00,000","aaaaaaaaaaaa@aaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000A00","AAAAAAAA" +"00,000",,"a0aa.aaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000A00A","AAAA" +"000,000",,"aaaaaa.aaaaaa@a-aaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAA" +"000,000",,"aaaaaaa@aaaaa.aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000A0A","AAAA" +"00,000","00,000","aaaaaaaaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAAAAAA" +"00,000",,"aaaaa0@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000A000","AAAA" +"000,000","000,000","aaaaaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000A0A","AAAAAAAA AAA AAAAAAA" +"000,000","000,000","aa_aaaa00@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000A0A","AAAAAAAA" +"00,000",,"aaa@aaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000000","AAAA" +"00,000",,"aaaaa_aaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000000","AAAA" +"00,000","000,000","aaaaaaaaaaaaa@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00AA0A","AAAAAAAA" +"000,000",,"aa.aaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000","00,000","aaaaaaaaa.aaa@aa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000000A","AAAAAAAA" +"000,000",,"aaaaaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000","000,000","aaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000000A","AAAAAAAA" +"00,000","000,000","aaaaa00@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A0AA000","AAAAAAAA" +"00,000","00,000","aa.aaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00A00A","AAAAAAAA" +"00,000",,"Aaaaaa.aaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00A00A","AAAA" +"00,000","000,000","aaaaaaaaa00@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000000","AAAAAAAA AAA AAAAAAA" +"00,000","00,000","aaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000000","AAAAAAAA AAA AAAAAAA" +"000,000",,"aa_aaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000AA0AA","AAAA" +"000,000","00,000","aaaaaaa@aa.aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000AA00","AAAAAAAA" +"000,000",,"aaaaaaa_aaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaaa_aaa00@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaaaaa0@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A000000","AAAA" +"00,000","000,000","aaaa@aaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000000","AAAAAAAA" +"00,000",,"aaaaaaaa@aaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A0AA000","AAAA" +"00,000",,"aaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00AA00","AAAA" +"000,000",,"aaaaaa0000@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000000","AAAA" +"000,000",,"aaaaaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA00A00A","AAAA" +"00,000",,"aaaaaa@aaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000","00,000","aaaaa@aaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00AA00","AAAAAAAA" +"000,000",,"aaaaaaaa0@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000A000","AAAA" +"000,000","000,000","aaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000AA00A","AAAAAAAA" +"00,000",,"aaaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000AA0A","AAAA" +"000,000","000,000","aa0aaaa0@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A000000","AAAAAAAA" +"00,000",,"aaaaa000@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"00,000",,"aaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00A00A","AAAA" +"00,000",,"aaaaa0000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000000","AAAA" +"00,000","000,000","aaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000000","AAAAAAAA" +"000,000",,"aaaaaaaaa00@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000AA00","AAAA" +"0,000","000,000","AAaaaaaaa@aaaaa.aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000A000A","AAAAAAAA" +"0,000",,"aaaaaaaaa@aaaaaaaaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000A000A","AAAA" +"00,000","00,000","aaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00A000","AAAAAAAA" +"000,000",,"aaaa.aaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA00","AAAA" +"000,000","000,000","aaaaaaaaa00@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA00","AAAAAAAA" +"000,000",,"aaaaa.aaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA00","AAAA" +"000,000",,"aaaaaaaaaaaa@aaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA00","AAAA" +"000,000",,"a0aaa0aa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA00","AAAA" +"000,000","000,000","aaaaaaaa@aaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000A00A","AAAAAAAA AAA AAAAAAA" +"000,000",,"aaaa@aaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000A00A","AAAA" +"00,000",,"Aaaaa.Aaaaaa@aaaaaaaaa-aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA00","AAAA" +"00,000","00,000","aaaaaaaaa@aaaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAAAAAA" +"00,000",,"aaaaaaaaaaaaaa@aaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00A000","AAAA" +"00,000","00,000","aaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00A000","AAAAAAAA" +"000,000",,"aaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000A000","AAAA" +"0,000",,"aaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA000A0A00","AAAA" +"00,000",,"Aaaaaaaaa.Aaaaaa@aa.aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000A0A","AAAA" +"000,000",,"aaaaaaaa@aaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000A00A","AAAA" +"000,000",,"aaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000000","AAAA" +"000,000","000,000","aaaaaa@aaaaaa.aa",00/00/0000 00:00:00AA,"0,000.00","AAAAA00A00A","AAAAAAAA AAA AAAAAAA" +"00,000",,"aaaaa0000@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000000A","AAAA" +"00,000",,"AaaaaaaaaaA@aaaaaaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000000A","AAAA" +"00,000",,"aaaaaaa@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000000A","AAAA" +"00,000",,"aaaaaaa0000@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000000A","AAAA" +"00,000",,"aaaaa.aaaaaaaa@aa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000000A","AAAA" +"00,000",,"aaaaa.aaaaaa@aa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000000A","AAAA" +"00,000","000,000","aaaaaa.aaaaa@aa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000000A","AAAAAAAA" +"00,000",,"aaaaaa.aaaaaa@aa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000","000,000","aaaaaa0000@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA00A00A","AAAAAAAA" +"000,000",,"Aaaaa00@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000A0A","AAAA" +"000,000",,"aaaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000000A","AAAA" +"00,000",,"aaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A000000","AAAA" +"00,000",,"aaaaaaa@aaaaaaaaaaaaaa.aa.aa",00/00/0000 00:00:00AA,"0,000.00","AAA000A00A0","AAAA" +"000,000",,"aaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA000AA0A0","AAAA" +"000,000",,"Aaaaaaaa.Aaaaa@aaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A000A00","AAAA" +"000,000","00,000","aaaaaaa0@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A000A00","AAAAAAAA" +"000,000",,"aaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA000A0A","AAAA" +"000,000",,"aaaaaaaa0@aaaaaaa.aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000A000","AAAA" +"000,000",,"Aaaaa0@aaaaaaa.aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000A000","AAAA" +"000,000","00,000","aaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000A000","AAAAAAAA" +"000,000",,"aaaa.aaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000A000","AAAA" +"000,000","000,000","aaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000AA00","AAAAAAAA AAA AAAAAAA" +"0,000","00,000","aaaaaaaaa.aaaaaaa@aaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000A00","AAAAAAAA" +"00,000","0,000","aaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAAAAAA" +"0,000",,"aaaaaaa@aaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000A000","AAAA" +"0,000",,"aaa@aaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000A000","AAAA" +"0,000",,"aaaaaaa@aaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000A000","AAAA" +"000,000",,"aaaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000A0A","AAAA" +"00,000",,"Aaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000A00A","AAAA" +"00,000",,"aaaaaaaa@aaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000A0A","AAAA" +"000,000",,"aaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000A000","AAAA" +"000,000",,"aaaaaaaaa.aaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000A000","AAAA" +"00,000","00,000","aaaaaa.aaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000AA000","AAAAAAAA" +"00,000","000,000","aaaaaaaaaaaa0@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000AA000","AAAAAAAA" +"0,000",,"aaaa@aaaa.aa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00000A","AAAA" +"00,000","000,000","aaaaaaaa@aaaaaaaa.aa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000A0A","AAAAAAAA" +"000,000",,"aaaaaa.aaaaaaaa@aaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000000","AAAA" +"000,000",,"aaaaaa@aaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA0A","AAAA" +"000,000","00,000","aaaaaaaaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAAAAAA" +"00,000","000,000","aaaa.aaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000A00","AAAAAAAA" +"00,000","00,000","aaaaa00@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000AA000","AAAAAAAA" +"00,000","0,000","aaa.aaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000AA000","AAAAAAAA" +"000,000","00,000","aaaa@aaaaaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000000","AAAAAAAA" +"0,000",,"aaaaaaaaaaaa@aaaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000000","AAAA" +"000,000",,"aaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000A0000","AAAA" +"000,000","00,000","aaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAAAAAA" +"00,000",,"aaaaaaa00@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000A0A","AAAA" +"0,000",,"aaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000A00","AAAA" +"000,000",,"aaaaaaaaaaa@aaaaaaaa.aa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000000","AAAA" +"0,000",,"aaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00A00A","AAAA" +"00,000",,"aaa_aaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000A00","AAAA" +"000,000","000,000","aaaaaaaaaaa@aaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA00AA0A","AAAAAAAA" +"000,000","000,000","aaaaaaa.aaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000AA00","AAAAAAAA" +"000,000",,"aaaaaa000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"0,000",,"aaaaaaa00000@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A000A00","AAAA" +"00,000",,"aaaaaa@aaaaaaaaaa.aa",00/00/0000 0:00:00AA,"0,000.00","AAA000A0A0A","AAAA" +"00,000",,"aaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000000","AAAA" +"00,000","0,000","aaaaaaaa00000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000000","AAAAAAAA AAA AAAAAAA" +"00,000",,"aaaaa00@aaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000000","AAAA" +"00,000",,"aaaaaa.a.aaaaa@aaaa.aaaa",00/00/0000 0:00:00AA,"0,000.00","AAAA00A0AAA","AAAA" +"00,000",,"AAAAA.AAA@AAAAA.AAA",00/00/0000 0:00:00AA,"0,000.00","AAA0000A000","AAAA" +"000,000","000,000","aaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000A00","AAAAAAAA" +"000,000",,"aaaaaa@aaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000000","AAAA" +"0,000",,"aaaaaa.aaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000A000A","AAAA" +"000,000","00,000","aaaaaa.aaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000000","AAAAAAAA AAA AAAAAAA" +"00,000",,"aaaaaaaaa@aaaaaaaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000A00A","AAAA" +"0,000","000,000","aaaaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA00AA00","AAAAAAAA" +"000,000",,"aaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA000A0AA0","AAAA" +"00,000",,"aaaaaaaaaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000A00","AAAA" +"00,000","000,000","aaa.aaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA000000","AAAAAAAA" +"0,000",,"aaaaaaaaaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000AA00","AAAA" +"00,000",,"Aaaaaaa_aaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA0A0000","AAAA" +"000,000",,"aaaaaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000000A","AAAA" +"00,000","00,000","aaaaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA00A0A0A","AAAAAAAA" +"00,000","000,000","Aaaa_Aaaaa@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA00A000","AAAAAAAA" +"00,000","00,000","aaaaaaaaaaaa0000@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA000AA000","AAAAAAAA" +"000,000",,"aaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA000000","AAAA" +"000,000","000,000","aaaaaaaa@aaaaaaaaa.aa",00/00/0000 00:00:00AA,"0,000.00","AAAAA00A00A","AAAAAAAA" +"000,000",,"aaaaaaaaa@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00A000","AAAA" +"000,000",,"Aaaaaaaa_Aaaaa@aaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00A000","AAAA" +"000,000",,"aaaaa.aaaaaa@aaaaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00A000","AAAA" +"00,000",,"aaaaaaa000@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000000","AAAA" +"00,000",,"aaaa00000@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000000","AAAA" +"00,000",,"aaaaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000000","AAAA" +"00,000",,"aaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000000","AAAA" +"00,000",,"aaaaaaa.aaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000000A","AAAA" +"0,000",,"aaaaaaaaa@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000A00A","AAAA" +"0,000","00,000","aaaaaaaaaa000@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000A00A","AAAAAAAA AAA AAAAAAA" +"00,000","000,000","Aaaaaaaaa0@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A0AAA00","AAAAAAAA" +"000,000","000,000","aaaaaaaaa0@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA00000A","AAAAAA AAAA AAAAA" +"000,000",,"aaaaa.aaaaaa@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA00000A","AAAA" +"000,000","000,000","aaaa000@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA00000A","AAAAAAAA" +"000,000",,"aaaaaaaaa_aaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA00000A","AAAA" +"000,000","00,000","aaaaaaaaaaa@aaaaaa.aa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00A000","AAAAAAAA" +"000,000",,"AAAaaaaa@aaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00A00A","AAAA" +"000,000",,"aaaaa@aaaaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000000","AAAA" +"000,000",,"aaaaaaaa@aaaaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000000","AAAA" +"0,000",,"aaaaaaaaaaaa@aaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000000","AAAA" +"0,000",,"aaaaa.aaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000000","AAAA" +"000,000","000,000","aaaaa0000@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00A00A","AAAAAAAA AAA AAAAAAA" +"00,000","00,000","aa.aaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000A00","AAAAAAAA" +"00,000",,"aaaaaaa@aaaaaaaaaaaaaaaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000000","AAAA" +"00,000",,"aaaaaaa@aaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000AA0A","AAAA" +"000,000",,"aaaaaa@aaaaaaa.aa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000A00","AAAA" +"00,000","000,000","aaaaaaaa0000@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000A00","AAAAAAAA" +"000,000",,"aaaaaa_aaaaaa00@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A000000","AAAA" +"000,000","00,000","aaaaa_aaaaaa@aa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000000","AAAAAA AAAA AAAAA" +"0,000",,"aaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000000","AAAA" +"0,000",,"aaaaaaa_aa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000000","AAAA" +"0,000",,"Aaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000000","AAAA" +"00,000","000,000","Aaaaaa.Aaaaaaaaa@aaa.aaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA00AA0AA","AAAAAAAA" +"00,000","00,000","Aaaaa.Aaaaaaa@aaa.aaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA00AA0AA","AAAAAAAA" +"000,000",,"aaaaaaa@aaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A000000","AAAA" +"00,000","0,000","aaaaaaaa00@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA000000","AAAAAAAA" +"00,000",,"aaaaa00@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA000000","AAAA" +"000,000",,"aaaaaaa.aaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000AA0A","AAAA" +"00,000",,"aaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A000000","AAAA" +"00,000",,"Aaaaa.Aaaaa@aaa.aaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA00AA0AA","AAAA" +"00,000",,"aaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000A0A","AAAA" +"00,000","00,000","aaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000000","AAAAAAAA" +"0,000",,"aaaa00@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000A00","AAAA" +"0,000",,"aaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAA" +"0,000",,"aaaaaaaa000@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAA" +"0,000",,"aaaaaa00@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAA" +"0,000",,"aaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAA" +"0,000",,"aaaa0000@aaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAA" +"0,000",,"aaaaaaaaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAA" +"0,000",,"aaaaaaaaaa@aaaaaaaaa.a00.aa.aa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAA" +"0,000",,"aaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAA" +"00,000",,"aaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000A0A00","AAAA" +"000,000",,"aaaaaa.aaaa@aaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000000","AAAA" +"000,000","000,000","aaaaaa.aaaaa@aa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAAAAAA" +"00,000",,"aaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000A0A00","AAAA" +"000,000",,"aaaa0000@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000A000","AAAA" +"00,000",,"Aaaaa.Aaaaaa@aaaaaaaaa-aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000A000","AAAA" +"00,000",,"aaaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000A0A","AAAA" +"0,000","000,000","aaaaaa@aaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000A00","AAAAAA AAAA AAAAA" +"0,000",,"aaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000A00","AAAA" +"000,000","00,000","aaaaa.a.aaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000A0A","AAAAAAAA" +"00,000","00,000","aaaaaa@aaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA00A000","AAAAAAAA AAA AAAAAAA" +"0,000","00,000","aaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000A00","AAAAAAAA" +"00,000","00,000","aaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA00","AAAAAAAA" +"00,000",,"aaaaaaaaa@aaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA00A000","AAAA" +"00,000",,"aaaaa@aaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA00A000","AAAA" +"00,000",,"aaaaaa@aaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA00A000","AAAA" +"000,000","00,000","aaaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A0AA000","AAAAAAAA" +"000,000","00,000","aaaaaa.aaaaaa@aaaaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000AA0A0","AAAAAA AAAA AAAAA" +"00,000",,"aaaaaaa.aaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00A00A","AAAA" +"000,000","000,000","aaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000000","AAAAAAAA" +"000,000",,"aaa.aaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000A00","AAAA" +"000,000","00,000","aaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAAAAAA" +"00,000",,"aaaaaaaaaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000A0A","AAAA" +"00,000","000,000","aaaaaaaaaa@aaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAAAAAA" +"000,000",,"aaaaaaaaaaaaa@aaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000A00A","AAAA" +"00,000",,"aaaaaaa0000@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000A00","AAAA" +"00,000","000,000","aaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAAAAAA" +000,,"aaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A0A0000","AAAA" +"00,000",,"aaaaaaaaaaa@aaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000000","AAAA" +"000,000",,"aaaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000000","AAAA" +"000,000",,"aaaaaaaa00@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000000","AAAA" +"000,000","00,000","aaaaaaa00@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000000","AAAAAAAA" +"000,000",,"aaaaaaaaa.aaaaaaa@aaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000000","AAAA" +"000,000",,"aaaaaa.aaaaaaa@aaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000000","AAAA" +"000,000","000,000","aaaaaaaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000000","AAAAAAAA" +"000,000",,"aaaaaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000000","AAAA" +"000,000",,"aaaaaaaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000000","AAAA" +"000,000",,"aaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000000","AAAA" +"000,000",,"aaaaaaa_aaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000000","AAAA" +"000,000",,"aaaaa0@aaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000000","AAAA" +"000,000",,"aaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000000","AAAA" +"000,000",,"aaaaaaaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000000","AAAA" +"000,000",,"aaaaaa.aaaaaa@aaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000000","AAAA" +"000,000",,"aaaaaa_aaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000000","AAAA" +"000,000",,"aaaaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000000","AAAA" +"000,000",,"aaaaaa00@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000000","AAAA" +"000,000",,"aaaaaaa@aaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000000","AAAA" +"000,000",,"aaaaa.aaaaaaaa@aaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000000","AAAA" +"000,000",,"aaaaa.aaaaaaaaaa@aaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000000","AAAA" +"00,000","000,000","aaaa00@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000A00","AAAAAAAA" +"000,000","000,000","aaaaaaaa@aaaaaaaaa.aa.aa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA00","AAAAAAAA" +"00,000",,"aaaaa.aaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000A0A","AAAA" +"00,000","000,000","aaaaaaa.aaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000A0A","AAAAAAAA AAA AAAAAAA" +"00,000",,"aaaaa.aaaaaa@aaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00000A","AAAA" +"00,000",,"aaaa.aaaaa@aaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00000A","AAAA" +"00,000","00,000","aaaa_aaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000A00","AAAAAA AAAA AAAAA" +"000,000",,"aaaaaaaa@aaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000000","AAAA" +"000,000","000,000","aaaaaaaaaaaa00@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA000000","AAAAAAAA" +"000,000",,"aaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000000A","AAAA" +"00,000",,"aaaaaa.aaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000000","AAAA" +"000,000","00,000","aaaaaaaaaaaa000@aaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00A00A","AAAAAAAA" +"00,000",,"aaaaa@aaaaaa-aaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00000A","AAAA" +"00,000",,"aaaaaa@aaaaaa-aaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00000A","AAAA" +"000,000",,"aaaaaaa.aaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA00AA0A","AAAA" +"000,000","00,000","aaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000AA0A","AAAAAAAA" +"00,000","000,000","aaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA00000A","AAAAAAAA" +"00,000",,"aaaaa000@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAA" +"000,000",,"aaa0000@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000A00","AAAA" +"000,000","00,000","aaaaaa0@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000000","AAAAAAAA" +"000,000",,"Aaaaaaa.Aaaaaa@aaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000A00","AAAA" +"000,000",,"aaaaaaaaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA00000A","AAAA" +"000,000",,"aaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA00000A","AAAA" +"000,000","00,000","aaaaaaa_0@aaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA00000A","AAAAAAAA" +"000,000",,"aaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA00000A","AAAA" +"000,000","00,000","aaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA00000A","AAAAAA AAAA AAAAA" +"000,000",,"aaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA00000A","AAAA" +"000,000","00,000","aaaaaaaa0@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA00000A","AAAAAAAA" +"000,000",,"aaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA00000A","AAAA" +"000,000",,"aaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA00000A","AAAA" +"000,000","000,000","aaaaaaa.aaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000A00A","AAAAAAAA" +"000,000",,"Aaaa_aaa@aa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00000A","AAAA" +"00,000",,"aaaaa.aaaaaaaa@aaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000A00","AAAA" +"00,000",,"aaaaaaa@aaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000A0A","AAAA" +"000,000","00,000","a_aaa00@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000A000","AAAAAAAA AAA AAAAAAA" +"000,000",,"aaaaaa00@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000000","AAAA" +"00,000","000,000","a_aaaa0000@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000A00A0","AAAAAAAA AAA AAAAAAA" +"00,000","000,000","aaaaaaaaaa0000@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA000A00A0","AAAAAAAA" +"000,000",,"aaaaa.aaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000A00","AAAA" +"000,000","00,000","aaaaa0@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A0A0AA0","AAAAAAAA" +"00,000","00,000","aaaaaaa@aaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000000A","AAAAAAAA AAA AAAAAAA" +"00,000",,"Aaaaaaaaa.Aaaaaa@aaaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA00A00AA","AAAA" +"00,000",,"Aaaaa.Aaaaaaaaaa@aaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000000","AAAA" +"00,000",,"aaaaaaaaa.aaaaa@aaaaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA000A0000","AAAA" +"000,000",,"aaaaaa0@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000AA00","AAAA" +"000,000",,"aaaaaaaaa@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000000","AAAA" +"00,000","00,000","aaaaaaa_aaaa0000@aaaaa.aaa.aa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00A000","AAAAAAAA" +"000,000",,"aaaaaaa_aaaaaaaaaaa@aa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000A000","AAAA" +"000,000","00,000","aaaaaaaa_aaaaaa@aa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000A000","AAAAAAAA" +"000,000","000,000","aaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000000","AAAAAAAA" +"000,000","000,000","aaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000000","AAAAAAAA" +"00,000",,"Aaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000000A","AAAA" +"00,000",,"aaaa.aaaaaaa@aa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000000A","AAAA" +"00,000","000,000","aaaaaa.aaaaaa@aa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000000A","AAAAAAAA" +"000,000","00,000","aaaaaaa00@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A000A0A","AAAAAAAA AAA AAAAAAA" +"000,000","000,000","aaaaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA000A0A00","AAAAAAAA" +"00,000",,"aaaaaa.aaaaaaa@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000000","AAAA" +"000,000",,"Aaaaaa_Aaaa@aaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA00AA00A","AAAA" +"00,000",,"aaaaa.aaaaaaa@aaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA00A0A0A","AAAA" +"00,000",,"aaaaaa_aaaaaaaaa@aa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000A00","AAAA" +"0,000",,"aaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000A0A","AAAA" +"00,000","00,000","aaaaaaaa0@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000AA00","AAAAAAAA" +"00,000",,"aaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000AA00","AAAA" +"000,000",,"aaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA00AA0A","AAAA" +"000,000",,"a.aaaaaaaaaa@aaaaaaaa.aa",00/00/0000 00:00:00AA,"0,000.00","AAA0A000A0A","AAAA" +"000,000","0,000","aaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000A00","AAAAAAAA" +"0,000","00,000","aaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000000","AAAAAAAA" +"0,000",,"aa@aaaaaaaaaaa.aa",00/00/0000 00:00:00AA,"0,000.00","AAA000AAAA0","AAAA" +"0,000","00,000","AAaaaa@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA000AAAA0","AAAAAAAA" +"0,000",,"aaaa.aaaaaaaa@aaaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA000AAAA0","AAAA" +"00,000","000,000","aaaaaaaaaaa@000.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000A0A","AAAAAAAA" +0,"000,000","aaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A0A0000","AAAAAAAA" +"00,000","00,000","Aaaaaaa.aaaaa00@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA000A000A","AAAAAAAA" +"00,000","000,000","aaaaa@aaaaaaaaa.aa",00/00/0000 0:00:00AA,"0,000.00","AAA00000A00","AAAAAA AAAA AAAAA" +"0,000","000,000","aaaaaaaa@aaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000A000","AAAAAAAA" +"000,000","00,000","aaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAAAAAA" +"00,000",,"AAA.A@AAAAAAA.AAA",00/00/0000 0:00:00AA,"0,000.00","AAA0A00A000","AAAA" +"00,000",,"aaaaaa@aaaaaaaaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000A000","AAAA" +"000,000",,"aaa.aaaaaaaaa@aaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000A00","AAAA" +"00,000",,"aaaaaa@aaa-aaaa.aa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00A000","AAAA" +"00,000",,"aaaa.aaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000A0A","AAAA" +"000,000",,"aaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000A00A","AAAA" +"000,000",,"aaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000000A","AAAA" +"000,000","00,000","aaaaaaaaaa0000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000000","AAAAAAAA" +"000,000",,"aaaaa.aaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000000A","AAAA" +"000,000","000,000","aaa0000@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAAAAAA" +"00,000",,"aaaaaaaaaaaaaaaaaaaaa00@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000AA0A0","AAAA" +"000,000",,"aaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA00000A","AAAA" +"000,000","00,000","aaaaaaaa0@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00A000","AAAAAAAA AAA AAAAAAA" +"0,000",,"Aaaa000@aaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000000","AAAA" +"000,000","00,000","aaaaaaaa@aaaaaaaa.aaa.aa",00/00/0000 0:00:00AA,"0,000.00","AAAAA00AA00","AAAAAAAA" +"000,000",,"aaaa@aaaaaaa.aaa.aa",00/00/0000 0:00:00AA,"0,000.00","AAAAA00AA00","AAAA" +"000,000","00,000","aaaaaaaaaa00@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000A0AA0","AAAAAAAA" +"000,000","00,000","aaaaaaaaa@aaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000000","AAAAAAAA" +"000,000","00,000","a_aaaa_aaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA00","AAAAAA AAAA AAAAA" +"000,000",,"aaaaaaa_aaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000000A","AAAA" +"000,000","00,000","a_aaaa_aaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000000A","AAAAAA AAAA AAAAA" +"0,000","00,000","aaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAAAAAA" +"00,000","00,000","aaaaaaaa_0@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000A00A","AAAAAAAA" +"00,000",,"aaaaaaaa00@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000A00A","AAAA" +"00,000",,"aaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000A00A","AAAA" +"000,000",,"aaaaaa_aaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaaa@aaaaaaaaa.aa",00/00/0000 00:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaaaaaa00@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000","000,000","aaaaaaaaaa_aaaaa00@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000000A","AAAAAAAA" +"000,000",,"aaaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000","00,000","a_aaaa_aaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA00AA00","AAAAAAAA" +"000,000","000,000","aaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA00AA00","AAAAAAAA" +"000,000","000,000","aaaaaa00@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA00AA00","AAAAAAAA" +"000,000",,"aaaaaa_000@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaaa00aa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000","000,000","aaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000AA00","AAAAAA AAAA AAAAA" +"000,000",,"a0aaaaa_00@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000","000,000","aaaaaa00@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000AA00","AAAAAA AAAA AAAAA" +"000,000","00,000","a_aaaa_aaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000AA00","AAAAAA AAAA AAAAA" +"000,000","000,000","aaaaaa00@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000AA00","AAAAAA AAAA AAAAA" +"000,000","000,000","aaaaa000@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00A00A","AAAAAAAA AAA AAAAAAA" +"00,000",,"aaaaaa.aaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A0A00A0","AAAA" +"00,000",,"aaaaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A0A00A0","AAAA" +"00,000",,"Aaaa000@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAA" +"00,000",,"aaaaaa00@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAA" +"00,000",,"aaaaa.aaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAA" +"00,000",,"aaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAA" +"00,000","000,000","aaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAAAAAA" +"00,000",,"aaaa.aaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAA" +"00,000",,"aaaa0aaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAA" +"00,000",,"aaa000@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAA" +"00,000",,"aaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAA" +"00,000",,"a.aaaaaaa0@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAA" +"00,000",,"aaa_aaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAA" +"00,000",,"aaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAA" +"00,000",,"a.aaa.a.00@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAA" +"00,000",,"aaaaaaaa0000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAA" +"00,000",,"Aaaaaaaa@aaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAA" +"00,000",,"Aaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAA" +"00,000",,"aaaaaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAA" +"00,000",,"aaaa00_00@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAA" +"00,000",,"aaaaa000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAA" +"00,000",,"aaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAA" +"00,000",,"a.a.a0@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAA" +"00,000",,"aaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAA" +"00,000",,"aaaaa0aaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAA" +"00,000",,"aaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAA" +"00,000",,"aaaaaaa.aaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAA" +"00,000","00,000","aaaaa00@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAAAA AAAA AAAAA" +"00,000",,"aaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAA" +"00,000",,"aaaaaaa0a@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAA" +"00,000",,"aaaaaa00@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAA" +"00,000",,"aaaaaaa@aaaa.aa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAA" +"00,000",,"aaaa.aaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAA" +"00,000",,"aaaa000@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAA" +"00,000",,"aaaaaaaaa0@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAA" +"00,000",,"aaaaaaa0@aaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAA" +"00,000",,"aaaaaaa_aaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAA" +"00,000",,"aaaaaaaa.aaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAA" +"00,000","00,000","aaaaaaaaaa00@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAAAAAA" +"00,000",,"aaaaaaaa0@aaaaaaa.aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAA" +"00,000",,"A_Aaaaaaa0@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAA" +"00,000",,"aaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAA" +"000,000",,"aaaaaaaaa0000@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00AA00","AAAA" +"00,000",,"aaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A0AAAA0","AAAA" +"00,000",,"aaaaa.a.aaaaa@aaaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A0AAAA0","AAAA" +"00,000",,"aaaaaaaaa@aaaaaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A0AAAA0","AAAA" +"00,000",,"aaaaa.aaaa@aaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A0AAAA0","AAAA" +"00,000",,"aaaaaaa.aaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A0AAAA0","AAAA" +"00,000",,"aaaaaaa.aaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A0AAAA0","AAAA" +"00,000",,"Aaaaaaa.Aaaaaaaa@aaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A0AAAA0","AAAA" +"00,000",,"Aaaa_Aaaaaa@aaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A0AAAA0","AAAA" +"00,000",,"aaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A0AAAA0","AAAA" +"00,000",,"aaaaaaaaaaaaa00@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A0AAAA0","AAAA" +"00,000",,"aaaaaaaaa.aaaaa@aaaaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A0AAAA0","AAAA" +"00,000",,"aaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A0AAAA0","AAAA" +"00,000",,"aaaaaaaaa.aaaaaa@aaaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A0AAAA0","AAAA" +"00,000",,"aaaaa.a.aaaaa@aaaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A0AAAA0","AAAA" +"00,000","000,000","aaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A0AAAA0","AAAAAAAA" +"00,000",,"aaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A0AAAA0","AAAA" +"00,000",,"aaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A0AAAA0","AAAA" +"00,000",,"aaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A0AAAA0","AAAA" +"00,000",,"aaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A0AAAA0","AAAA" +"00,000",,"aaaaaaa.aaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A0AAAA0","AAAA" +"00,000",,"aaaaa.aaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A0AAAA0","AAAA" +"00,000",,"aaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A0AAAA0","AAAA" +"000,000",,"aaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000A00","AAAA" +"00,000","000,000","aaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA00000A","AAAAAAAA" +"00,000",,"aaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAA" +"00,000",,"aaaaaaaaaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAA" +"000,000","000,000","aaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000A000","AAAAAAAA" +"00,000",,"aaaaaaaaa@aaaaaaaaaaaa.aa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000A00","AAAA" +"000,000","000,000","aaaaaaa@aaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A0A0000","AAAAAAAA" +"00,000",,"aaaaaaaa0000@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA00A0A0A","AAAA" +"00,000",,"aaaaa.aaaaaa@aaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000A0A","AAAA" +"000,000","000,000","aaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00AA0A","AAAAAAAA" +"00,000",,"aaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000A00","AAAA" +"00,000",,"aaaaaa000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000A00","AAAA" +"00,000","000,000","aaaaa.aaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000A00","AAAAAA AAAA AAAAA" +"00,000",,"aaaaaa.aaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000A00","AAAA" +"00,000",,"aaaaa00@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000A00","AAAA" +"000,000",,"aaaaa0@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000000A","AAAA" +"000,000",,"Aaaaaa@aaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000AA00","AAAA" +"0,000",,"AAaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000A000A","AAAA" +"00,000",,"aaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000A000","AAAA" +"0,000",,"aaaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000AA0A","AAAA" +"000,000","0,000","aaaaa0@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA00A00A","AAAAAAAA" +"000,000","0,000","aaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000A0A","AAAAAAAA" +"000,000",,"aaaaaaa@aaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000A0A","AAAA" +"000,000","00,000","aaaaaa0000@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000A0A","AAAAAAAA" +"00,000",,"aaaaaa_aaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A000A0A","AAAA" +"0,000","00,000","aaaa.aaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000AA0A","AAAAAAAA" +"00,000",,"aaaaaaaaa@aaaaaaaaaaaaaaa.aa.aa",00/00/0000 00:00:00AA,"0,000.00","AAA000A00A0","AAAA" +"000,000","000,000","aaaaaaaaa@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A000A0A","AAAAAAAA" +"00,000",,"aaaaaaaaaaaa@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA000AA00A","AAAA" +"000,000",,"aaaaaaaa0@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000000","AAAA" +"00,000","000,000","aaaaaaaaaaa00@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000A000","AAAAAAAA" +"0,000",,"aaaa000@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A000A00","AAAA" +"00,000",,"aaaaaaaa@aaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000000A","AAAA" +"00,000","00,000","Aaaa_Aaaaaa@Aaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000A00","AAAAAAAA" +"000,000",,"aaaaaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000","000,000","Aaaa_Aaaaaaa@aa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000A000","AAAAAA AAAA AAAAA" +"0,000","000,000","aaaaaaaaaaa@aaaaaaa.aa",00/00/0000 00:00:00AA,"0,000.00","AAA0A000A0A","AAAAAAAA" +"0,000","00,000","aaaaaaa0000@aaaa.aa",00/00/0000 00:00:00AA,"0,000.00","AAA0A000A0A","AAAAAAAA" +"000,000","000,000","aaaaaaa000@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000AA0A","AAAAAAAA" +"000,000","00,000","aaaa00@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000AA0A","AAAAAAAA" +"000,000",000,"000aaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000AA0A","AAAAAAAA" +"00,000","0,000","aaaa_00@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA000AA000","AAAAAAAA" +"000,000",,"Aaaaa.Aaaaaa@aaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000A000","AAAA" +"000,000",,"aaaaaaaaa@aaaaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA000A00AA","AAAA" +"000,000",,"aaaaaa@aaaaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA000A00AA","AAAA" +"000,000",,"aaaaaaaaaa00@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000A0A","AAAA" +"000,000",,"aaaaaa@aaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000A00","AAAA" +"000,000",,"aaaa.aaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000A00","AAAA" +"000,000",,"aaaaaaa.aaaaaaa@aaaaaaaaa.aa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000A00","AAAA" +"000,000",,"aaaa.aaaaaa@aaaaaaaaa.aa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000A00","AAAA" +"0,000","00,000","aaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A000000","AAAAAAAA" +"00,000",,"aaaaa.aaaaaaa@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000000","AAAA" +"000,000","00,000","aaaa00@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000A00","AAAAAAAA" +"00,000","000,000","aaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000A00A","AAAAAAAA AAA AAAAAAA" +"00,000","000,000","aaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000A00A","AAAAAAAA AAA AAAAAAA" +"00,000",,"aaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000A00A","AAAA" +"00,000",,"aaaa.aaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000A00A","AAAA" +"00,000",,"aaaaaaa.aaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000A00A","AAAA" +"000,000",,"aaaa00@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000A00","AAAA" +"00,000",,"aaaaaaaaaaaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000A0A","AAAA" +"000,000",,"aaaaaa000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAA" +"00,000","00,000","aaaaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00000A","AAAAAAAA" +"00,000","0,000","aaaaaaaaaaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000A0A","AAAAAAAA" +"000,000",,"aaaaaaaaa00@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA00A000","AAAA" +"000,000","00,000","aaaaa.a.aaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000A00A","AAAAAAAA" +"00,000",,"aaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000A000","AAAA" +"000,000","000,000","aaaaaa_000@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA00","AAAAAAAA" +"00,000",,"aaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000A000","AAAA" +"000,000",,"aaaaa000@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000A00A","AAAA" +"00,000","000,000","aaa000@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000A0A","AAAAAAAA AAA AAAAAAA" +"00,000",,"aaaaaaaaaaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA00A000","AAAA" +"000,000",,"aaaaa@aa-aaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00000A","AAAA" +"00,000","000,000","aaaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000A000","AAAAAA AAAA AAAAA" +"000,000",,"aaaaaaaaaa@aa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000A00A","AAAA" +"000,000",,"Aaaaaaaaaaa00@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000A000","AAAA" +"000,000","00,000","aaaaaaaaaa00@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAAAAAA" +"000,000","00,000","aaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAAAAAA AAA AAAAAAA" +"000,000",,"aaaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000A000","AAAA" +"000,000","000,000","aaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000A000","AAAAAAAA" +"00,000",,"aaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A0A0000","AAAA" +"000,000",,"aaaaaa_aaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A0AAAAA","AAAA" +"00,000",,"aaaa_aaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000","00,000","aaa0000@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000AA00","AAAAAAAA" +"000,000",,"aaaaaaa0000@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000000","AAAA" +"000,000",,"aaaaaaaaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000000","AAAA" +"000,000",,"aaaaaaa_aaaaaaa@aa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000A00A","AAAA" +"000,000","000,000","aaaaaaa_aaaaaaa@aa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000A00A","AAAAAAAA" +"000,000","00,000","aaaaaaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000A00A","AAAAAAAA" +"000,000",,"aaaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000A00A","AAAA" +"000,000","000,000","aaaaaaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000A00A","AAAAAAAA" +"000,000",,"aaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000A00A","AAAA" +"000,000",,"aaaaaaaa00@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000A00A","AAAA" +"000,000","000,000","aaaaaaa00@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000A00A","AAAAAAAA" +"000,000",,"aaaaaaa00@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000A00A","AAAA" +"000,000","0,000","aaaa000@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000A00A","AAAAAAAA" +"000,000","00,000","aaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000A00A","AAAAAAAA" +"000,000","00,000","aaaaaaaaaa@aaaaaaaaa.aa.aa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAAAAAA" +"00,000",,"aaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA00","AAAA" +"000,000",,"aaaaaaa@000.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000A00","AAAA" +000,"00,000","aaaaaaaa000@aa.aa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000000","AAAAAAAA AAA AAAAAAA" +000,,"0aaaaaaa0@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000000","AAAA" +"000,000","000,000","aaaaaaa00@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00000A","AAAAAAAA" +"00,000",,"aaaaaaaaaa@aaaaaaaaa.aa.aa",00/00/0000 0:00:00AA,"0,000.00","AAA000AAA0A","AAAA" +"000,000",,"aaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAA" +"00,000",,"aaaaaa.aaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000A00A","AAAA" +"00,000","000,000","aaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000000","AAAAAAAA" +"000,000",,"aaaaa000000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000A00","AAAA" +"000,000",,"aaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000A00","AAAA" +"000,000",,"aaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000A00","AAAA" +"000,000",,"aaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000A00","AAAA" +"00,000","000,000","aaaaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000000","AAAAAAAA" +"0,000",,"aaaaaaaa00@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"0,000",,"aaaaaa0@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"0,000","00,000","aaaaa000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAAAA AAAA AAAAA" +"0,000",,"aaaaaaa000@aaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"0,000",,"aaaaaaaaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"0,000",,"aaaaaaa_aaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"0,000",,"aaaaaaa000000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"0,000",,"aaaaa@aaaa-aaaa-aa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"00,000",,"aaaaaaa.aaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000000","AAAA" +"000,000",,"aaaaaaa.aaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000A00","AAAA" +"000,000","000,000","aa@aaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000A00","AAAAAAAA" +"000,000",,"aaaaaa@aaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000A00","AAAA" +"000,000","00,000","Aaaaa.Aaaaaaaa@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A000000","AAAAAAAA" +"00,000",,"aaaaaaaaa00@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00A000","AAAA" +"000,000",,"aaaaa000@aa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000000","AAAA" +"00,000",,"aaa00@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA00AA00","AAAA" +"00,000",,"aaaaaa@aaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00AA0A","AAAA" +"00,000",,"aaaaa_00@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000AA0A","AAAA" +"000,000","000,000","aaaa00@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000000A","AAAAAAAA" +"00,000",,"Aaaaaaaa.Aaaa@AaaaAaaaaAaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA000AA00A","AAAA" +"00,000",,"aaaaaaaaa@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA000AA00A","AAAA" +"00,000",,"AAAAAAA00@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA000AA00A","AAAA" +"000,000",,"A.aaaaaaa@Aaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000000","AAAA" +"000,000","00,000","aaaa.aaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000000","AAAAAAAA" +"00,000","00,000","aaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000A000","AAAAAAAA" +"000,000","0,000","aaaaa.aaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00AA00","AAAAAAAA" +"0,000",,"Aaaaaaa@aaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000000","AAAA" +"000,000","000,000","aaaaa.a.aaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00AA00","AAAAAAAA AAA AAAAAAA" +"000,000","00,000","aaaaa00@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA000AAAAA","AAAAAAAA AAA AAAAAAA" +"000,000","000,000","aaaaaa.aaaaaa@aa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000000","AAAAAAAA" +"000,000",,"aaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaaaa_aaaaa@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000000","AAAA" +"000,000",,"aaaaaa.aaaaaaaa@aa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000000","AAAA" +"00,000","00,000","aaaaa0@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA00A000","AAAAAAAA" +"000,000","000,000","aaaaa000@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A000000","AAAAAAAA" +"000,000",,"aaaaaa.aaaaaaa@a-aaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00000A","AAAA" +"00,000","00,000","aaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000AA00","AAAAAAAA" +"000,000","00,000","aaaaaaaa0000@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000000","AAAAAAAA" +"00,000",,"aaaaaaaa@aaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA00A000","AAAA" +"000,000","00,000","aaaaaaa0000@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000A000","AAAAAAAA" +"00,000",,"aaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000000A","AAAA" +"000,000","000,000","aaaaaaa.aaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A000A00","AAAAAAAA AAA AAAAAAA" +"000,000",,"aaaaaaaa@aaaaa.aa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00AA00","AAAA" +"00,000","000,000","aaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA00000A","AAAAAAAA" +"000,000",,"aaaaaa.a.aaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A000A0A","AAAA" +"000,000","000,000","aaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000000A","AAAAAAAA" +"00,000","00,000","aaaaaaa0@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00A000","AAAAAAAA" +"00,000","00,000","aaaaaaa0@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00A000","AAAAAAAA" +"000,000","000,000","aaaaaaaa@aaaa.aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000000","AAAAAAAA" +"000,000",,"aaaaaa.aaaaa@aaaa.aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000000","AAAA" +"000,000",,"aaaaa00@aaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000000","AAAA" +"000,000","000,000","aaaa-aa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000000","AAAAAAAA" +"00,000",,"aaaaaaaaa@aaaaaaaa.aa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA0A","AAAA" +"000,000","000,000","aaaaaaaa.aaaaaaa@aa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000A0A","AAAAAAAA" +"000,000","00,000","aaaaa-a.aaaaaaaaa@aa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000A0A","AAAAAAAA" +"00,000",,"aaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000000","AAAA" +"00,000",,"aaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000000","AAAA" +"00,000",,"aaaa.aa.aaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000000","AAAA" +"00,000",,"aaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000000","AAAA" +"00,000",,"aaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000000","AAAA" +"00,000",,"aaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000000","AAAA" +"00,000",,"aaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000000","AAAA" +"00,000",,"aaaaaaaa000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000000","AAAA" +"00,000",,"aaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000000","AAAA" +"00,000",,"aaaaa.aaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000000","AAAA" +"00,000",,"aaaaaaa.aaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000000","AAAA" +"00,000",,"aaaaa.aaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000000","AAAA" +"00,000",,"aaa.aaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000000","AAAA" +"00,000",,"aaaaaa_aaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000000","AAAA" +"00,000",,"a.aaaa00@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000000","AAAA" +"00,000",,"aaaaaaaaa000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000000","AAAA" +"00,000",,"aaaaaa0@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000000","AAAA" +"00,000",,"aaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000000","AAAA" +"00,000",,"aaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000000","AAAA" +"00,000",,"aaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000000","AAAA" +"00,000",,"aaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000000","AAAA" +"00,000",,"aaaa.a.000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000000","AAAA" +"00,000",,"aaa0aaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000000","AAAA" +"00,000",,"aaaaaaa.a.aa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000000","AAAA" +"00,000",,"aaaaaaaa00@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000000","AAAA" +"00,000",,"aaaa.aaaaaaa.a@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000000","AAAA" +"00,000",,"aaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000000","AAAA" +"00,000",,"aaaaaaaaaa.aaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000000","AAAA" +"00,000",,"aaaa.aaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000000","AAAA" +"00,000",,"aaaaaa.aaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000000","AAAA" +"00,000",,"Aaaaa@aa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000","00,000","AAaaaaAAAaaaaa@aaa.aaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000AA0A0","AAAAAAAA" +"000,000",,"aaaaaaaa.aa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000AA00","AAAA" +"00,000","000,000","Aaaa.aaaa00@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000A00A","AAAAAAAA" +"000,000",,"aaaaaaaa@aaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000A00","AAAA" +"00,000","0,000","aaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000000A","AAAAAAAA AAA AAAAAAA" +"000,000",,"aaaa00@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000000","AAAA" +"00,000","000,000","aaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000AA0A","AAAAAAAA" +"000,000","00,000","aaa000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A0AA00A","AAAAAAAA" +"00,000",,"aaaaaaa00@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000000","AAAA" +"00,000",,"aaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000000","AAAA" +"00,000",,"aaaaaa.aaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000000","AAAA" +"000,000","00,000","aaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000000","AAAAAAAA" +"000,000","00,000","aaaaaaaa.aaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000A0A","AAAAAAAA" +"000,000",,"aaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000000","AAAA" +"000,000","0,000","aaaaaa.aaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000000","AAAAAAAA AAA AAAAAAA" +"000,000","000,000","aaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000A00A","AAAAAAAA AAA AAAAAAA" +"000,000",,"aaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000A0A","AAAA" +"000,000","0,000","aaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000A0A","AAAAAAAA" +"000,000","000,000","aaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000A0A","AAAAAAAA" +"000,000",,"aaaa_aaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000A0A","AAAA" +"000,000","00,000","aaaaaaa000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000AA00","AAAAAAAA" +"000,000",,"aaa00@aaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000","0,000","aaaaaaaaaaa0000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000000","AAAAAAAA" +"00,000",,"aaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000000","AAAA" +"000,000","00,000","aaaaa.aaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000A00","AAAAAAAA" +"000,000","00,000","aaaaa_aaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000000","AAAAAAAA" +"00,000",,"aaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000000A","AAAA" +"000,000","00,000","aaa000@aaaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000000","AAAAAA AAAA AAAAA" +"00,000",,"aaaaaaaaa@aaa.aa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000000","AAAA" +"00,000",,"aaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000000","AAAA" +"00,000",,"aaaaaaaaaaaa0000@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000000","AAAA" +"00,000",,"aaaaaa_aaaaaa@aaaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000000","AAAA" +"00,000",,"aaaaaaaaa0@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000000","AAAA" +"000,000","000,000","aaaaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000A00","AAAAAAAA" +"00,000",,"aaaaaaaaaaaaaaaaa@aaaaa.aa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00A00A","AAAA" +"00,000",,"aaaaaaa0000@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000AA0A","AAAA" +"00,000","000,000","aaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000000","AAAAAAAA" +"000,000","00,000","aaaaaaaaa00@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA00","AAAAAA AAAA AAAAA" +"00,000",,"aaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000A000","AAAA" +"00,000","000,000","aaa0000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA00A000","AAAAAAAA AAA AAAAAAA" +"000,000","00,000","aaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA00AA00","AAAAAAAA" +"000,000","000,000","aaaaaaa0_aa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000000","AAAAAAAA" +"000,000","00,000","aaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000000","AAAAAAAA" +"000,000",,"aaaaaaaaaaa@000.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000000","AAAA" +"000,000","00,000","aaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000000","AAAAAAAA AAA AAAAAAA" +"000,000","000,000","aaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000000","AAAAAA AAAA AAAAA" +"000,000","000,000","aaa0000@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000000","AAAAAAAA AAA AAAAAAA" +"000,000",,"aaaaaaaa0000@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000000","AAAA" +"000,000","000,000","aaaaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA00A00A","AAAAAAAA" +"00,000",,"aaaa000@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000A00","AAAA" +"0,000",,"aaaaaa0000@aaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA00000A","AAAA" +"00,000",,"aaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000000","AAAA" +"00,000",,"aaa0000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA0A","AAAA" +"00,000",,"aaaa0000@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA0A","AAAA" +"00,000",,"aaaaa_aa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA0A","AAAA" +"00,000",,"aaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA0A","AAAA" +"00,000",,"aaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA0A","AAAA" +"000,000",,"aaaa_aa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000000","AAAA" +"000,000",,"aaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000AA00","AAAA" +"000,000",,"aaaaaaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000AA00","AAAA" +"000,000","00,000","aaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAAAAAA" +"000,000","00,000","aaaaa@aaaaaa.aaa.aa",00/00/0000 00:00:00AA,"0,000.00","AAA00000A0A","AAAAAAAA AAA AAAAAAA" +"000,000","000,000","aaaaa_aaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000A0A","AAAAAAAA" +"000,000","00,000","aaaaaaaaaaaaaa@aaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000A0A","AAAAAAAA" +"000,000",,"aaaaaa_aaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaaaa0000@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaaaa0000@aaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000","000,000","aaa00@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000000A","AAAAAAAA" +"000,000",,"aaaaaaa0@aaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaaaaa00000@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"a_aaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaaaaa0@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaa0aaaaa000@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaa0aaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaa0a@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaaaa0@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaaaaaaa0000@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaa_aaaaa_0@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaaaa000000@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaaa0000@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaaa0000@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaaaaaaaaaaa@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"a_aaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaaaaaa00@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaaaaaa0000@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaaaaa_aaaaa_00@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaaaa00@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaaa0000@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaaaa@aaaaa-aaaaaaaaa-aaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaa@aaaaaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaaaaaaaaaa0000@aa.aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaaaaaa0000@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaa000@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaaaa0000@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000000A","AAAA" +"00,000",,"aaaaaa@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000000A","AAAA" +"00,000","00,000","aaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000AA0A","AAAAAAAA" +"00,000","00,000","aaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000AA0A","AAAAAAAA" +"000,000",,"aaa.aaaaaa0@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000A00","AAAA" +"000,000",,"a_aa_aaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A0AA000","AAAA" +"000,000","00,000","aaaaaaa00@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000AA00","AAAAAAAA" +"000,000",,"aaaaaaaa00@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00000A","AAAA" +"0,000",,"aaaaaa00@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000A00","AAAA" +"00,000","000,000","aaaaaaaa@aaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000A00","AAAAAAAA AAA AAAAAAA" +"000,000",,"aaaaa000@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA00AA00","AAAA" +"000,000",,"aaaa_aaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA00","AAAA" +"000,000",,"aaaaa_aaaaa_a@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000A00A","AAAA" +"00,000",,"aaaaaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000A00A","AAAA" +"000,000",,"aaaaaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000000","AAAA" +"000,000","000,000","aaaaaaa@aaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAAAAAA" +"000,000",,"Aaaaaaaaaaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000A0000","AAAA" +"000,000",,"Aaa_Aaaa0@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000A0000","AAAA" +"000,000",,"aaaaaaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000A0A","AAAA" +"0,000","000,000","aaaaaaaaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000A0A","AAAAAAAA" +"000,000",,"aaaa@aaa-aaaaa-aaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000AA0A","AAAA" +"00,000",,"aaaa00a@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA000000","AAAA" +"00,000",,"aaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA000000","AAAA" +"00,000",,"aaaaaaaaaa0000@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA000000","AAAA" +"00,000",,"aaaaaaaa0@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA000000","AAAA" +"00,000",,"aaaaaaaa00@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA000000","AAAA" +"00,000","00,000","aaaaaa000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA00000A","AAAAAAAA" +"000,000","000,000","aaaaaa00@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA00A00A","AAAAAAAA" +"000,000",,"aaaaaaa@aaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA00A00A","AAAA" +"00,000","00,000","aaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000A0A","AAAAAAAA" +"000,000",,"aaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000A000","AAAA" +"00,000",,"aaaaaa.aaaaa@aaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000A00","AAAA" +"00,000",,"aaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA000000","AAAA" +"00,000",,"aaaaaaa0000@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000000A","AAAA" +"00,000",,"aaaaaaaa0000@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A000A00","AAAA" +"00,000",,"aaaaaaaa.aaaaa@aaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A000A00","AAAA" +"000,000",,"aaaa_aaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000A00A","AAAA" +"00,000",,"aaaaaaa@aaaaaaaaa.aa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaaa@aaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00A00A","AAAA" +"000,000",,"aaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00A00A","AAAA" +"00,000",,"aaaaaaaaaaa00@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000000","AAAA" +"00,000",,"aaaaaaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000A0A","AAAA" +"000,000","000,000","aaaaaaa_aaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAAAAAA" +"000,000",,"aaaaaaa.aaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00AA0A","AAAA" +"000,000",,"a_aaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00000A","AAAA" +"000,000",,"aaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00000A","AAAA" +"000,000",,"aaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00000A","AAAA" +"000,000",,"aaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00000A","AAAA" +"000,000",,"aaaaa00@aaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00000A","AAAA" +"000,000",,"0000000000@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00000A","AAAA" +"000,000",,"aaaaaaaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00000A","AAAA" +"000,000",,"aaaa_aaa_aaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00000A","AAAA" +"000,000","00,000","aa.aaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A0A0000","AAAAAAAA" +"000,000",,"AaaaaaaaaAaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA00A0AAA","AAAA" +"000,000","00,000","Aaaaaaa_00@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000AA00","AAAAAAAA" +"000,000",,"aaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000000","AAAA" +"00,000","000,000","aaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000A0A","AAAAAAAA AAA AAAAAAA" +"000,000","000,000","aaaaa.aaaa@aaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000AA00","AAAAAAAA" +"00,000",,"aaaaaaa00@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000000","AAAA" +000,"00,000","aaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000A000","AAAAAAAA" +"00,000",,"aaaaaa_aa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000A000","AAAA" +"00,000",,"aaaaaaaaaaa@aaa.aa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000AA00","AAAA" +"00,000",,"aaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA0AA0A0","AAAA" +"000,000","00,000","aaaaaaa00@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000000","AAAAAAAA" +"000,000",,"aaaaa.aaaaaaa@aaaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAA" +"000,000","000,000","aaaaaaa.aaaaa@aaaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAAAAAA" +"00,000",,"aaaaaaaa.aaaaaaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000000","AAAA" +"000,000","000,000","aaaaaaaaaa0@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000AA0A","AAAAAAAA" +"00,000","000,000","aaaaaaaaaaa@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000A00","AAAAAAAA" +"000,000",,"aaaaaa@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000A0A","AAAA" +"000,000",,"aaaaa00aaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000A0A","AAAA" +"0,000","00,000","aaaa_aaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000000","AAAAAAAA" +"000,000",,"aaaaaaaa0000@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000A00A","AAAA" +"000,000",,"aaaa_aaa@aaaaa.aa",00/00/0000 00:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaa0000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000A00","AAAA" +"00,000",,"aaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000A00","AAAA" +"000,000",,"aaaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000A00","AAAA" +"000,000",,"aaaaaa.aaaa@aaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000000","AAAA" +"00,000",,"aaa.aaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000000","AAAA" +"000,000",,"aaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000A000","AAAA" +"000,000",,"aaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000A0A","AAAA" +"00,000",,"aaaaaaa.aaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00AA00","AAAA" +"00,000","000,000","aaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00AA0A","AAAAAAAA" +"000,000","000,000","Aaaaaaaaaaaa@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00000A","AAAAAAAA" +"00,000",,"aaaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA000A0000","AAAA" +"00,000","00,000","aaaaaa@aaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000A00","AAAAAAAA" +"000,000","000,000","Aaaaaaaa.Aaaaaaa@aa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000A000","AAAAAAAA" +"0,000","00,000","aaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000000","AAAAAAAA" +"0,000",,"aaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000000","AAAA" +"00,000","000,000","aaaaa000@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A000A00","AAAAAAAA" +"000,000",,"aaaaaaa000@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000000","AAAA" +"000,000","000,000","aaa.aaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA00A00A","AAAAAAAA" +"00,000",,"aaaaaa.aaaaaaaa@aaaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000A000","AAAA" +"00,000",,"aaaaa.aaaa@aaaaaaaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000A000","AAAA" +"000,000",,"aaaaaaaaa@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA000A00","AAAA" +"000,000",,"aaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA00A00A","AAAA" +"0,000","000,000","aaaaaa@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A000A0A","AAAAAA AAAA AAAAA" +"000,000",,"aaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA00A00A","AAAA" +"000,000",,"aaaaaaaaa0000@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA00A00A","AAAA" +"0,000",,"aaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A000A0A","AAAA" +"0,000",,"aaaaaaaa00000@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A000A0A","AAAA" +"0,000",,"aaaaaaaa00@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A000A0A","AAAA" +"0,000",,"0aaaaaa@aaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A000A0A","AAAA" +"00,000","00,000","aaaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA000AA000","AAAAAAAA" +"00,000",,"aaa000@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A000A0A","AAAA" +"00,000",,"Aaaa.A.Aaaaa@aa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000A00A","AAAA" +"000,000",,"aaaaaaaaaaa@aaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA00A00A","AAAA" +"000,000",,"aaaaaa.aaaaa@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000AA00","AAAA" +"00,000","00,000","aaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000A00A","AAAAAAAA" +"000,000","000,000","Aaa0aaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA00A000","AAAAAAAA" +"00,000","000,000","aaaaaaa0000@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA00A00A","AAAAAAAA" +"000,000",,"aaaaaa.aaaaaaa@aa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000A00A","AAAA" +0,,"aaaaa@aaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000","000,000","aaaaaaaaaaa@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A000000","AAAAAAAA" +"00,000","000,000","aaaaaaaa@aaaaa.aa",00/00/0000 00:00:00AA,"0,000.00","AAAA000AA00","AAAAAAAA" +"00,000",,"Aaaaa.Aaaaaaa@aaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00A00A","AAAA" +"00,000",,"aaaaaaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00A00A","AAAA" +"00,000",,"aaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00A00A","AAAA" +"00,000",,"Aaa.Aaaaaaaa@aaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00A00A","AAAA" +"00,000",,"Aaaa.Aaaaaa@aaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00A00A","AAAA" +"00,000",,"aaaaaa.aaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00A00A","AAAA" +"00,000",,"a0aaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00A00A","AAAA" +"00,000",,"a0aaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000A00","AAAA" +"00,000",,"aaaaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000A00","AAAA" +"000,000",,"aaaaaaaaaa0000@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00A000","AAAA" +"00,000",,"aaaaaaaaa00@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000000A","AAAA" +"000,000",,"aaaaaaaaaaaaaa0@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000000A","AAAA" +"00,000","000,000","aaaa_aaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA00000A","AAAAAAAA" +"000,000",,"aaaaaaaa0000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000A000","AAAA" +"00,000",,"aaa00000@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAA" +"00,000",,"aaaaaaaaa@aaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAA" +"00,000",,"Aaaaaaa0@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAA" +"00,000","000,000","aaaaaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAAAA AAAA AAAAA" +"000,000",,"AA0aaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000000","AAAA" +"0,000",,"aaaaaa_aaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000A00","AAAA" +"0,000",,"aaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000A00","AAAA" +"0,000",,"aaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000A00","AAAA" +"00,000",,"aaaaaaaaaaa@aaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000A00","AAAA" +"000,000",,"aaaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA0A","AAAA" +"000,000",,"aaaaa.aaaaaaa@aaaaa.aaaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000A0A","AAAA" +"00,000","00,000","aaaaaaaa000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00AA0A","AAAAAAAA" +"00,000",,"aaaaa000@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00AA0A","AAAA" +"0,000",,"aaaaaaaaaaaaaaa00@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA00","AAAA" +"0,000",,"aaaaaaaa00@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA00","AAAA" +"00,000",,"aaaaa0000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000A00","AAAA" +"00,000",,"aaaaaa0000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000A00","AAAA" +"000,000",,"aaaaaaa.aaaaaaaa@aaaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000AAAA0","AAAA" +"00,000","000,000","AaaAa0@aaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000AA00A","AAAAAAAA" +"000,000",,"aaa.aaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000000A","AAAA" +"000,000",,"aaaaaaaaaaa@aaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAA" +"00,000","00,000","aaaaaaaa.a.aaaaaa@aaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA00A0000","AAAAAAAA" +"00,000",,"aaaaaaa.a.aaaaa@aaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA00A0000","AAAA" +"00,000",,"aaaaa00000@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA00A0000","AAAA" +"00,000",,"Aaaaaa.Aaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA00A0000","AAAA" +"000,000",,"aaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA0A","AAAA" +"00,000",,"aaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAA" +"00,000","00,000","aaaaaaaaa00@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00000A","AAAAAAAA AAA AAAAAAA" +"000,000",,"aaaaaa00000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00000A","AAAA" +"000,000",,"aaaaaaaaaa@aaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000000","AAAA" +"00,000",,"aaaaaa@aaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000AA00","AAAA" +"000,000",,"aaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A0A00AA","AAAA" +"00,000",,"aaaaaaaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000AAA00","AAAA" +"00,000",,"aaaaaaa@aaaaa.a00.aa.aa",00/00/0000 0:00:00AA,"0,000.00","AAA0000AA0A","AAAA" +"000,000",,"aaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA00","AAAA" +"000,000",,"aaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA0AA0A0","AAAA" +"000,000",,"aaaaaaaa_aaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA0AA0A0","AAAA" +"00,000",,"aaaaa0000@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000AA00","AAAA" +"00,000",,"aaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000AA00","AAAA" +"00,000",,"aaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000AA00","AAAA" +"000,000",,"AAA000@aaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000AA0A","AAAA" +"000,000","000,000","aaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000AA0A","AAAAAAAA" +"00,000","000,000","aaaaaa0aa0000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAAAAAA" +"000,000",,"aaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000AA0A","AAAA" +"000,000",,"aaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000AA0A","AAAA" +"00,000",,"aaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000A0A00","AAAA" +"00,000",,"aaaa@aaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00000A","AAAA" +"0,000",,"aaaaaaa_aaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000A00","AAAA" +"00,000",,"aaaaaaa.aaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAA" +"00,000",,"aaa00000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAA" +"00,000",,"aaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000A00A","AAAA" +"00,000",,"aaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000A00A","AAAA" +"00,000",,"aaaaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000","00,000","aaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A000000","AAAAAAAA AAA AAAAAAA" +"00,000",,"aaaaaa000@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000A00","AAAA" +"000,000",,"aaaaaa@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000AA00","AAAA" +"000,000","00,000","aaaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000AA00","AAAAAAAA" +"000,000","00,000","aaaaaaa00@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000AA00","AAAAAAAA" +"000,000",,"aaaaaaaaa00@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000AA00","AAAA" +"000,000","00,000","aaaaaa000@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000AA00","AAAAAAAA" +"000,000","00,000","aaaaaaa_0000@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000AA00","AAAAAAAA" +"000,000",,"aaaaaaaaa00@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000AA00","AAAA" +"000,000",,"aaaaaaaa00@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000AA00","AAAA" +"000,000",,"aaaaaa000@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000AA00","AAAA" +"000,000",,"aaaaaaa00@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000AA00","AAAA" +"000,000",,"aaaaaaa@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000AA00","AAAA" +"000,000",,"aaaaaaaa@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000AA00","AAAA" +"000,000",,"aaaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000AA00","AAAA" +"000,000",,"aaaaaaaaa@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000AA00","AAAA" +"000,000",,"aaaaaaa@aaaaaaaa.aaaa-aaaaaa.aa",00/00/0000 00:00:00AA,"0,000.00","AAAA000AA00","AAAA" +"000,000","000,000","aaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000AA00","AAAAAAAA" +"000,000",,"aaa@aaaaaa0.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000AA00","AAAA" +"000,000",,"aaaaaaa0@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000AA00","AAAA" +"000,000",,"aaaa00@aaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000AA00","AAAA" +"000,000",,"aaaaa00000@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000AA00","AAAA" +"000,000","0,000","aaaaaaaaa@aaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000AA00","AAAAAAAA" +"000,000",,"aaaaa0@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000AA00","AAAA" +"000,000",,"aaaaaaaaaaaaa@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000AA00","AAAA" +"000,000","000,000","aaaaaaaaaa@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000AA00","AAAAAAAA" +"00,000","000,000","aaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000A00A","AAAAAAAA AAA AAAAAAA" +"000,000","000,000","aaaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000000","AAAAAAAA" +"00,000",,"aaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000A00","AAAA" +"00,000",,"aaaa@aaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA00A000","AAAA" +"00,000",,"aaaaa00@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A0A00AA","AAAA" +"00,000",,"aaaaaa00@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A0AA000","AAAA" +"00,000",,"aaaaa0000@aaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A0AA000","AAAA" +"00,000",,"aaaaaa000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A0AA000","AAAA" +"00,000",,"AaaaaaaAaaaaAaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A0AA000","AAAA" +"00,000","000,000","aaaaaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000A00","AAAAAAAA" +"00,000",,"aaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000A0A","AAAA" +"00,000","00,000","Aaaaaaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA00AA00","AAAAAAAA" +"000,000","000,000","AAAAAA00@AAAAA.AAA",00/00/0000 0:00:00AA,"0,000.00","AAA00000A00","AAAAAAAA" +"000,000","00,000","aaaaaa@aaaa.aaaaaaaaa.aa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00000A","AAAAAAAA" +"00,000","00,000","aaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000000","AAAAAAAA" +"00,000","000,000","a_aaaaaaaaa00@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA00A000","AAAAAAAA" +"000,000","000,000","aaa_aaa@aaaaa.aa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00AA00","AAAAAAAA" +"000,000",,"aaaaaa0000@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000A00","AAAA" +"00,000","00,000","aaaaaa0000@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000000","AAAAAA AAAA AAAAA" +"00,000",,"aaaaa@aaaaa0aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA00","AAAA" +"00,000",,"aaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00AA0A","AAAA" +"000,000","000,000","aaaaaa00@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000000","AAAAAAAA" +"000,000",,"aaaaa.aaaaaaaaa@aaaaaaaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA000000","AAAA" +"000,000",,"aaaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000A000","AAAA" +"000,000",,"aaaaaaa@aaaaaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000AA0A","AAAA" +"000,000",,"aaaaaaaaaa@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A000000","AAAA" +"00,000",,"aaaaaaaa@aaaaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00AA0A","AAAA" +"000,000",,"aaaaaaaa.aaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA000A000A","AAAA" +"0,000",,"aaaaaa_aaaaaaa@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000000","AAAA" +"00,000","00,000","aaaaaa.aaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000A00A","AAAAAAAA" +"000,000","00,000","a.aaaaaa@aaaaaaaaa.aa",00/00/0000 00:00:00AA,"0,000.00","AAA000AAA00","AAAAAAAA" +"00,000","00,000","aaaaaa.aaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000A0A","AAAAAAAA" +"00,000","00,000","aaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00A000","AAAAAAAA" +"00,000",,"aaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000A000","AAAA" +"00,000",,"aaaaaaaa@aaaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000000","AAAA" +"00,000",,"AAaaaaaaaaa@AaaaaAaaaa.Aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000000","AAAA" +"00,000","00,000","aaaaaaaaa@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000000","AAAAAAAA" +"000,000",,"aaaaaaaa.aaaaaa@aaaaaaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000A00","AAAA" +"00,000","000,000","aaaaaaa0@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000000","AAAAAAAA" +"00,000",,"Aaaaaaaa.aaaa@aaaa.aaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000AA00","AAAA" +"00,000","00,000","aaaaaaa_0@aaaaaaaaa.aa",00/00/0000 00:00:00AA,"0,000.00","AAAA000AA00","AAAAAAAA" +"00,000",,"aaaaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000AA00","AAAA" +"00,000","00,000","aaaaaaaaaaa0000@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000000A","AAAAAAAA" +"00,000",,"aaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000A000","AAAA" +"00,000","00,000","aaaaa.aaaaaaaaa@aaaa.aaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000AA00","AAAAAAAA" +"00,000","00,000","aaaaaaaaaaaaaa000@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000AA00","AAAAAAAA AAA AAAAAAA" +"0,000",,"aaaaaaaaa00@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000000","AAAA" +"00,000",,"a0aaaa_aaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000000","AAAA" +"00,000",,"Aaaa0000@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000000","AAAA" +"00,000","000,000","aaaaa000@aaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000A000","AAAAAAAA" +"00,000",,"Aaaaa.Aaaaaaa@aa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000A000","AAAA" +"00,000",,"aaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000A00A","AAAA" +"00,000","000,000","aaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAAAAAA" +"00,000","00,000","aaaaaaaaa@aaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000A00A","AAAAAAAA" +"00,000",,"aaaaaaaaaaaa@aaaaa.aa",00/00/0000 0:00:00AA,"0,000.00","AAAA000A00A","AAAA" +"00,000",,"aaaaaa@aaaaaaaaa.aa",00/00/0000 0:00:00AA,"0,000.00","AAAA000A00A","AAAA" +"000,000",,"aaaaaa@aaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000A00","AAAA" +"000,000",,"aaaaaaaaaa000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000A00","AAAA" +"000,000",,"aaaaaaaa00@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000A00","AAAA" +"00,000",,"aaaaaa.aaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00A000","AAAA" +"000,000",,"aaaaa_aaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA00AA00","AAAA" +"00,000","00,000","aaaaaaaa.aaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000000","AAAAAAAA AAA AAAAAAA" +"000,000",,"aaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000A00","AAAA" +"00,000",,"aa_aaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000A0A0A","AAAA" +"00,000",,"aaaaaaaaaaaaaaa0@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000A0A0A","AAAA" +"00,000","000,000","aaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000A00A","AAAAAAAA" +"00,000","00,000","aaaaaa.aaaaaaaaa@aaaaaaaaa.aa",00/00/0000 0:00:00AA,"0,000.00","AAAA00AAAA0","AAAAAAAA" +"000,000",,"Aaaaaa.Aaaaaa@Aaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000000","AAAA" +"000,000","000,000","aaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000A0A","AAAAAAAA" +"000,000",,"aaaaaaaa.aaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A0A0A0A","AAAA" +"00,000",,"aaaaaa.aaaaaaaaaa@aaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00A000","AAAA" +"000,000",,"aaaaaa.a.aaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000A0A","AAAA" +"00,000","000,000","aaa_0000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000A00A","AAAAAAAA" +"000,000","000,000","aaaa_aaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA00A000","AAAAAAAA" +"0,000","000,000","aaaaa000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAAAAAA" +"00,000",,"aaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000A00","AAAA" +"000,000",,"aaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000A000","AAAA" +"00,000","000,000","aaaa.aaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000A00","AAAAAAAA AAA AAAAAAA" +"000,000",,"aaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00000A","AAAA" +"00,000",,"aaa00@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000000","AAAA" +"000,000",,"aaaaa_aaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A0AA0AA","AAAA" +"00,000","000,000","aaa_aaa@aaa.aa",00/00/0000 0:00:00AA,"0,000.00","AAAA000000A","AAAAAAAA" +"000,000",,"aaaaaaaaa@aaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000A0A","AAAA" +"00,000","0,000","aaaaaaaaa.aaaaaa@aa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000AAA00","AAAAAAAA" +"00,000","00,000","aaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000A0A","AAAAAAAA" +"0,000","000,000","aaaaaaaaa0@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000A00","AAAAAAAA" +"00,000",,"aaa.aaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000A000","AAAA" +"00,000",,"aaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00000A","AAAA" +"00,000",,"aaaaaaaa@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000A000","AAAA" +"00,000",,"aaaaaa0000@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000A000","AAAA" +"00,000",,"aaaaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000A000","AAAA" +"00,000",,"aaaa0000_00@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000A000","AAAA" +"000,000","000,000","aaaaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA00AA00","AAAAAAAA" +"000,000",,"aaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaa.aa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaa@aaaa.aa",00/00/0000 00:00:00AA,"0,000.00","AAA0000000A","AAAA" +"0,000","000,000","aaaaaaa000@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A0A000A","AAAAAAAA" +"000,000",,"aaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000","000,000","aaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000000A","AAAAAAAA" +"000,000",,"aaaaa.aaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000","00,000","aaaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000000A","AAAAAAAA" +"000,000",,"aaaaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaa.aaa@aaaa.aa",00/00/0000 00:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaa@aaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000","00,000","aaaa_aa_aaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000000A","AAAAAAAA AAA AAAAAAA" +"00,000","00,000","a0aa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000A000","AAAAAAAA AAA AAAAAAA" +"00,000","00,000","aaaaa_aaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000A000","AAAAAAAA" +"00,000",,"aaaa_aaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000A000","AAAA" +"00,000",,"aaaaaa@aaaa.aa",00/00/0000 0:00:00AA,"0,000.00","AAAA000A000","AAAA" +"000,000",,"aaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00AA0A","AAAA" +"00,000",,"aaaa@aaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00AA00","AAAA" +"00,000",,"aaaaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAA" +"00,000",,"aaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAA" +"00,000",,"aaaaaaa000000@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAA" +"000,000","000,000","aaaaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000A000","AAAAAAAA" +"00,000","000,000","aaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000A00","AAAAAAAA" +"00,000",,"AAaaaa@aaaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAA" +"00,000",,"aaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000AA0A","AAAA" +"00,000",,"aaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000AA0A","AAAA" +"00,000",,"aaaaaaaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000AA0A","AAAA" +"00,000",,"aaaaaa00@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000AA0A","AAAA" +"00,000",,"aaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000AA0A","AAAA" +"00,000",,"aaaaa0aaaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000AA0A","AAAA" +"00,000",,"aaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000AA0A","AAAA" +"00,000",,"aaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000AA0A","AAAA" +"00,000",,"aaaaaaa000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000AA0A","AAAA" +"00,000",,"aaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000AA0A","AAAA" +"00,000",,"aaaaaa@aaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000AA0A","AAAA" +"00,000","000,000","aaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000AA0A","AAAAAAAA" +"00,000",,"aaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA00AAA00","AAAA" +"000,000",,"aaaaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00A00A","AAAA" +"000,000",,"aaaaaaa000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A0AA00A","AAAA" +"000,000",,"aaaaaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00A00A","AAAA" +"000,000",,"aaaaaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00A00A","AAAA" +"000,000",,"aaaaaaaa-aaaaaaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00A00A","AAAA" +"000,000",,"aaaaaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00A00A","AAAA" +"000,000",,"aaaaaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00A00A","AAAA" +"000,000",,"aaaaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00A00A","AAAA" +"000,000","000,000","aaaaaaaaaaa00000@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA0A0A0A","AAAAAAAA" +"000,000",,"aaaaaaa@aaa.aa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000000","AAAA" +"00,000","000,000","Aaaaaa.Aaaaaaa@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000A00","AAAAAA AAAA AAAAA" +"0,000",,"aaaaaa@aaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000A000","AAAA" +"000,000",,"aaaaaaa.aaaaaaaaa@aaaa.aaaaaa.aa",00/00/0000 00:00:00AA,"0,000.00","AAAAA000000","AAAA" +"000,000","000,000","aaaaaaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA000000","AAAAAA AAAA AAAAA" +"00,000",,"AAAAA.A.AAAA@AAAAA.AAA",00/00/0000 00:00:00AA,"0,000.00","AAA0A00000A","AAAA" +"000,000",,"aaaaaaaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000000","AAAA" +"0,000",,"aaaaaa.aaaaa@aaaaaa.aa",00/00/0000 00:00:00AA,"0,000.00","AAA00000000","AAAA" +"000,000",,"aaaaaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000000","AAAA" +"0,000",,"aaaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000000A","AAAA" +"00,000","000,000","aaaaaa0000@aaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA000A0A0A","AAAAAAAA AAA AAAAAAA" +"000,000","000,000","aaaaaaaa@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA000AA000","AAAAAAAA" +"00,000",,"AAAaaaaaaa@aaaa-aaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000","000,000","aaaaa.aaaaaa.aaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000000","AAAAAAAA" +"000,000",,"aaaaaaa0000@aaaaaa.aaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000A000","AAAA" +"00,000",,"aaaaaaaaa0000@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000A00","AAAA" +"00,000","000,000","aaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000AA00","AAAAAAAA" +"000,000",,"Aaaa@aaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000AA0A","AAAA" +"00,000",,"aaaaaaaa00@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000A0A","AAAA" +"000,000","00,000","aaaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000A0A","AAAAAAAA" +"000,000",,"aaaaaaa.aaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA000000","AAAA" +"000,000","00,000","aaaaa_aa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000000","AAAAAAAA" +"000,000","000,000","aaaaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000AA00","AAAAAAAA AAA AAAAAAA" +"00,000","00,000","aaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000000","AAAAAAAA AAA AAAAAAA" +"00,000",,"aaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000A0A","AAAA" +"00,000",,"aaaaaaaa0@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA000A0AA0","AAAA" +"00,000",,"aaaaa000@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA000000","AAAA" +"00,000",,"aaaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000A000","AAAA" +"00,000","000,000","aaaa@aaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA000AA0A0","AAAAAAAA" +"00,000",,"aaaaaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000000","AAAA" +"000,000","00,000","aaaaaaa.aaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A0A00AA","AAAAAAAA" +"00,000",,"aaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000A0A00","AAAA" +"000,000",,"aaaaaaaa-00@aaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000A000","AAAA" +"000,000",,"aaaaaaaa@aa.aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000A000","AAAA" +"000,000",,"aaaaaaaa00@aaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000A000","AAAA" +"00,000","00,000","aaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000AA0A0","AAAAAAAA" +"000,000",,"aaaaaaa@000.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA00A0000","AAAA" +"000,000",,"aaaaaaa@000.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA00A0000","AAAA" +"00,000",,"aaa_aaaaa@aaaaa.aaa.aa",00/00/0000 0:00:00AA,"0,000.00","AAA0000AA00","AAAA" +"00,000",,"aaaaaa@aaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000A0A","AAAA" +"00,000",,"aaaaa-aaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000A00A","AAAA" +"00,000",,"aaaaaa@aaaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000000","AAAA" +"00,000","00,000","aaaaaaaa.aaa@aa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000000","AAAAAAAA AAA AAAAAAA" +"00,000","000,000","aaaa.aaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00000A","AAAAAAAA AAA AAAAAAA" +"000,000","000,000","aaaaa@aaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000000","AAAAAAAA" +"000,000",,"aaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000000","AAAA" +"000,000",,"aaaaaaaa00@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000000","AAAA" +"000,000",,"aaaaaa00@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000000","AAAA" +"00,000","000,000","aaaaaaaaa00@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00000A","AAAAAAAA" +"00,000",,"aaaaaa.aaaaaaaa.a@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00000A","AAAA" +"00,000","00,000","aaaaa.aaaaaaaaaa.a@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00000A","AAAAAAAA AAA AAAAAAA" +"00,000","00,000","aaaaaaa@aaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00000A","AAAAAAAA AAA AAAAAAA" +"00,000","00,000","aaaaaaaa00@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00000A","AAAAAAAA" +"00,000",,"aaaaaaa.aaaaaaaaa.a@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00000A","AAAA" +"00,000","00,000","aaaaaaa.aaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00000A","AAAAAAAA" +"00,000","00,000","aaaaaa.aaaaa.a@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00000A","AAAAAAAA AAA AAAAAAA" +"00,000",,"aaaaaaa0aa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00000A","AAAA" +"00,000",,"aaaaaaaaaaaaaa@aaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00000A","AAAA" +"000,000",,"Aaaaaaaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000A0A","AAAA" +"00,000","000,000","aaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000AA00","AAAAAAAA" +"00,000",,"aaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000AA00","AAAA" +"000,000",,"aaaaaaaaa00@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00A000","AAAA" +"000,000","000,000","aaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000A000","AAAAAAAA" +"000,000","00,000","aaaaa0000@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000A000","AAAAAAAA" +"000,000",,"aaaaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000000","AAAA" +"00,000",,"aa.aaaaaa@aaaaaaaa.aa",00/00/0000 0:00:00AA,"0,000.00","AAA00000A0A","AAAA" +"000,000",,"aaaaa@aaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000A000","AAAA" +"00,000","0,000","aaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000AA000","AAAAAAAA" +"00,000",,"aaaaaaaaaaaa@aaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000A0A0A","AAAA" +"00,000",,"aaaaa00000@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"00,000",,"aaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00000A","AAAA" +"00,000",,"aaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000A00","AAAA" +"00,000",,"aaaaaaa@aaaa.aa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000A00","AAAA" +"00,000",,"aaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000A00","AAAA" +"000,000",,"aaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000000","AAAA" +"000,000",,"aaaaaaa@aaaa.aa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000000","AAAA" +"00,000","000,000","aaaaa_aaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000000","AAAAAAAA" +"00,000",,"aaaaa.aaaaaa@aaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000000","AAAA" +"00,000","00,000","aaaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000000","AAAAAAAA" +"00,000","00,000","aaaaaaaaaaaa00@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000000","AAAAAAAA AAA AAAAAAA" +"00,000",,"aa.aaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000000","AAAA" +"00,000",,"Aaaaaaa0000000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000AA00","AAAA" +"00,000",,"aaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000AA00","AAAA" +"00,000","000,000","aaaa_aaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000AA00","AAAAAAAA" +"000,000",,"A_aaaaaaa_aa0@aaaaa.aa",00/00/0000 0:00:00AA,"0,000.00","AAA0000A000","AAAA" +"000,000",,"aaaaaaaa.aaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000A000","AAAA" +"000,000",,"aaaaaaaaaaaaaaaa0000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000000","AAAA" +"0,000",,"aaaa_aaaaaa@aaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A0A000A","AAAA" +"00,000","00,000","aaaaaaaaa@aaaa.aa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000000","AAAAAAAA" +"00,000","0,000","aaaaaaa.aaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000AA0A","AAAAAAAA" +"000,000","00,000","aaaaaaa0@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000000A","AAAAAAAA" +"00,000","00,000","aaaa_aaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA0A","AAAAAAAA" +"000,000","000,000","aaaa.aaaa@aaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000A00","AAAAAAAA AAA AAAAAAA" +"00,000","00,000","aaaa_aaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000A000","AAAAAAAA" +000,,"aaaaaaaaa.aaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000A00","AAAA" +"00,000","00,000","Aaaaaaaa00@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000000","AAAAAAAA" +"00,000",,"aaaaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000A00","AAAA" +"000,000","00,000","aaa.aaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000A0A","AAAAAAAA" +"00,000","000,000","aaaaa_aaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000A000","AAAAAA AAAA AAAAA" +"000,000",,"aaaaaaaaaaa0@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000A000","AAAA" +"000,000",,"aaaaaaaa00@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000A000","AAAA" +"000,000",,"aaaaaa000@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000A0A","AAAA" +"000,000","000,000","aaa000@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000A00","AAAAAAAA" +"00,000",,"aaaaaaa00@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000000","AAAA" +"00,000","00,000","aaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA00","AAAAAAAA" +"00,000",,"aaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000A0A","AAAA" +"00,000",,"aaaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000A0A","AAAA" +"00,000",,"aaaaaaaaaa@aaaaaaaaa.aa",00/00/0000 0:00:00AA,"0,000.00","AAA00000A0A","AAAA" +"00,000",,"aaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000A0A","AAAA" +"00,000","000,000","aaaaaaa_aaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000A0A","AAAAAAAA" +"00,000","00,000","aaaaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000A0A","AAAAAAAA" +"00,000",,"aaaaaaaaa_a@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000A0A","AAAA" +"00,000",,"aaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000A0A","AAAA" +"00,000",,"aaaaa_aaa_00@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000A0A","AAAA" +"00,000","00,000","aaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAAAAAA" +"000,000","000,000","aaaaaa00@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA00A00A","AAAAAAAA" +"00,000","00,000","aaaaaaaaa.aaaaaa@aaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000A00A","AAAAAAAA" +"00,000",,"aa.aaaaaa@aaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000A00A","AAAA" +"00,000",,"aaaaa.aaaaaaaa@aaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000A00A","AAAA" +"000,000",,"aaaaaaa00@aaaa.aa",00/00/0000 0:00:00AA,"0,000.00","AAAA00A0000","AAAA" +"0,000",,"aaaaa.aaaa@aaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000AA0A","AAAA" +"000,000",,"a_aaa00@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000000","AAAA" +"000,000",,"aaaaaaaaa@aaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00A00A","AAAA" +"000,000",,"aaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000000","AAAA" +"000,000",,"aaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000000","AAAA" +"000,000",,"aaaaaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000000","AAAA" +"000,000",,"aaaaaa@aaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00A00A","AAAA" +"000,000",,"aaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00A00A","AAAA" +"000,000",,"aaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00A00A","AAAA" +"000,000",,"aaaa0@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00A00A","AAAA" +"000,000",,"aaaaa0@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00A00A","AAAA" +"000,000",,"aaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00A00A","AAAA" +"000,000","00,000","aaaa.aaaaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAAAAAA" +"000,000",,"aaaaa.a.aaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00AA00","AAAA" +"000,000",,"aaaaaaaaaaa00@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000AA00","AAAA" +"000,000","000,000","aaaaaa@aaa-aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA00000A","AAAAAAAA" +"00,000",,"aaaaaaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAA" +"00,000",,"aaaaaa.aaaaaa@aa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000AA00","AAAA" +"00,000","000,000","Aaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000A000","AAAAAAAA" +"00,000","00,000","aaaaaa.a.aaaaaa.aa0a@aaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA00A0AAA","AAAAAAAA AAA AAAAAAA" +"000,000","000,000","aaaaaaa.aaaa@aa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA00","AAAAAAAA" +"000,000",,"aaaaa.aaa@aaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000AA00","AAAA" +"00,000","000,000","aaaaaa0000@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000A0A","AAAAAAAA" +"0,000","000,000","a.aaaaaa@aaaaa-aaaa.aa",00/00/0000 00:00:00AA,"0,000.00","AAA00000000","AAAAAAAA" +"00,000",,"aaaaaaa.aaaaaaaa@aaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000000","AAAA" +"000,000",,"aaaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000A00A","AAAA" +"000,000",,"AaaaaaaAAAA@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000000","AAAA" +"000,000","00,000","aaaaaa.aaaa@aaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000A000","AAAAAAAA" +"0,000",,"aaaaaaaaa@aaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000000","AAAA" +"000,000","000,000","aaaaaa.aa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA000A0A0A","AAAAAAAA AAA AAAAAAA" +"00,000","00,000","aaaaaaa@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A000A0A","AAAAAAAA" +"000,000",,"aaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA000A0A0A","AAAA" +"000,000","000,000","aaaaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA000A0A0A","AAAAAAAA" +"000,000",,"aaaaaaaaaaa000@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA00A0000","AAAA" +"000,000",,"aaaaaaa-aaaaaa0000@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA00A0000","AAAA" +"00,000","00,000","aaaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000000","AAAAAAAA" +"00,000",,"aaaaaaaa0@aaaaaa.aa",00/00/0000 00:00:00AA,"0,000.00","AAA00000000","AAAA" +"00,000",,"aaaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000000","AAAA" +"000,000",,"aaaaaa@aaaaa.aa",00/00/0000 00:00:00AA,"0,000.00","AAA0000A000","AAAA" +"00,000",,"aaaaaaaaa@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000000","AAAA" +"00,000",,"aaaaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000000","AAAA" +"00,000",,"aaaaaaaa00000@aaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000000","AAAA" +"00,000",,"aaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000000","AAAA" +"00,000",,"aaaaaaaa000@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000000","AAAA" +"00,000",,"aaaaaaaaa@aaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000000","AAAA" +"00,000",,"aaaaaaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000000","AAAA" +"00,000",,"aaaaaaaaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000000","AAAA" +"00,000",,"aaaaaaaaaaa@aaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000000","AAAA" +"00,000",,"aaaaaaaaaaaaaaaaaaaaaaaaaaa@aaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000000","AAAA" +"00,000",,"aaaaaaa_aaaaaaa@aaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000000","AAAA" +"00,000",,"aaaaaa.aaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000000","AAAA" +"00,000",,"aaaaaaaaaaaaaa@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000A00A","AAAA" +"00,000",,"aaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000000","AAAA" +"00,000",,"aaaaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000000","AAAA" +"00,000",,"aaaaaaa000@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000000","AAAA" +"00,000",,"aaaaa00@aaa.aa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000000","AAAA" +"00,000",,"aaaaaa00@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000000","AAAA" +"00,000",,"aaa0000@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000000","AAAA" +"00,000",,"aaaaaaaaa000@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000000","AAAA" +"00,000",,"aaaaaaaaaaaaaa@aaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000000","AAAA" +"00,000",,"aaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000000","AAAA" +"00,000",,"aaaaaaaaa@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000000","AAAA" +"00,000",,"aaaaa000000@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000000","AAAA" +"00,000",,"aaa00000@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000000","AAAA" +"00,000",,"aaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000000","AAAA" +"00,000",,"aaaa.aaaaaaaaaaaaa@aaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000000","AAAA" +"00,000",,"aaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000000","AAAA" +"00,000",,"aaaaaaa000@aaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000000","AAAA" +"00,000",,"aaaaaaa0@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000000","AAAA" +"00,000",,"aaaaaaaa000000@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000000","AAAA" +"00,000",,"aaaaaaaaaaaaaaa000@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000000","AAAA" +"000,000","00,000","aaaaaaaaa0000@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000A0A","AAAAAAAA" +"000,000",,"aaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000000","AAAA" +"000,000",,"aaaaaaaaaa@aaaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA00AA00A","AAAA" +"000,000",,"aaaaaaaaa@aaaaaaaaaaaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA00AA00A","AAAA" +"000,000",,"aaaaaa@aaaaaaaaaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA00AA00A","AAAA" +"00,000","000,000","aaaaa000@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000000","AAAAAAAA" +"00,000",,"aaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000000","AAAA" +"00,000","000,000","aaaaaaa@aaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00A000","AAAAAAAA" +"000,000",,"aaaaa_000@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA00AA000","AAAA" +"000,000","000,000","aaaaaaaaaa0000@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00AA00","AAAAAA AAAA AAAAA" +"00,000","000,000","aaaaaa@aaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00A000","AAAAAAAA" +"000,000",,"aaa-aaaaaa00@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A000000","AAAA" +"0,000","000,000","aaaaaaa_aaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000A000","AAAAAA AAAA AAAAA" +"000,000","000,000","aaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000000","AAAAAA AAAA AAAAA" +"00,000",,"aaaaaaaaaaaaa@aaaaaaa.aa",00/00/0000 00:00:00AA,"0,000.00","AAA0A000A0A","AAAA" +"00,000","000,000","aaaaaaaa@aaaaa.aa",00/00/0000 0:00:00AA,"0,000.00","AAA0000A00A","AAAAAAAA" +"00,000",,"aaaaaaa@aaaaaaaaa.aaaaaaaa.aa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000A0A","AAAA" +"000,000","0,000","aaaaaaaaa0000@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000000","AAAAAAAA" +"000,000","000,000","aaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00000A","AAAAAAAA" +"000,000","000,000","aaaaaaaaa@aaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAAAA AAAA AAAAA" +"00,000",,"aaaaa.aaaaaaaa@aaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000A00","AAAA" +"00,000","000,000","aaaaa000@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000A00","AAAAAAAA AAA AAAAAAA" +"00,000",,"aaaaaaa@aaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000A0A","AAAA" +"000,000",,"aaaaaa.aaaaaaa@aaaaaaa.aa",00/00/0000 0:00:00AA,"0,000.00","AAA000A0A0A","AAAA" +"00,000",,"aaaaa.aaaaaa@aaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA00000A","AAAA" +"00,000",,"aaaaa.aaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA00000A","AAAA" +"00,000",,"aaaaaa00@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA00000A","AAAA" +"00,000",,"Aaaaaaa@aaaaaaaaa.aa",00/00/0000 0:00:00AA,"0,000.00","AAAA000A00A","AAAA" +"00,000",,"aaaaaaaa0000@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000A00","AAAA" +"00,000",,"aaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000A00","AAAA" +"00,000",,"aaaaaaaa.aaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000A00","AAAA" +"00,000",,"aaaaaaaa.aaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000A00","AAAA" +"00,000",,"aaaa0000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000A00","AAAA" +"00,000",,"aaaaaaaa0000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000A00","AAAA" +"00,000",,"aaaaa000000@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000A00","AAAA" +"00,000","000,000","aaaaaaa00@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000000","AAAAAAAA" +"00,000","00,000","aaaaaaa.aa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000AA00","AAAAAAAA" +"000,000",,"aaaaa00@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000000","AAAA" +"00,000","000,000","aaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000A000","AAAAAAAA" +"000,000",,"Aaaaa.Aaaaa@aaaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000A00AA","AAAA" +"000,000","000,000","aaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000A00AA","AAAAAAAA" +"000,000",,"aaaa.aaaaaa@aaaaa.aa",00/00/0000 0:00:00AA,"0,000.00","AAAA000000A","AAAA" +"00,000",,"aaaaaaaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000A00A","AAAA" +"000,000","00,000","aaaaa.a.aaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000A0A","AAAAAAAA" +"00,000","00,000","aaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A0A0A00","AAAAAAAA" +"00,000","000,000","aaaaa@aaaaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000000","AAAAAAAA" +"00,000","00,000","aaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000000","AAAAAA AAAA AAAAA" +"000,000","000,000","aaaaaaa00@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000A00","AAAAAAAA" +"000,000",,"aaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000A000","AAAA" +"000,000","00,000","aaaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000A000","AAAAAAAA" +"000,000",,"aaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000000","AAAA" +"000,000",,"aaaaaaaa.aaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000A00","AAAA" +"000,000",,"aaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000AA00","AAAA" +"00,000","00,000","aaaaaa000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000A00","AAAAAAAA" +"00,000",,"aaaaaaa_aaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000A0A","AAAA" +"00,000","00,000","aaaaaaaa_a@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00A000","AAAAAAAA" +"00,000",,"Aaaaaa.Aaaaaaaaa.aa00@aaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000A0A","AAAA" +"000,000",,"aaaaaaa@aaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00000A","AAAA" +"000,000",,"aaaaaaaaa000000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000A00","AAAA" +"000,000",,"aaaaaa_aaa00@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000A00","AAAA" +"000,000",,"aaaaa00000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000A00","AAAA" +"000,000",,"aaa0aa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000A00","AAAA" +"000,000",,"aaaaaaaaaaaaa0@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000A00","AAAA" +"000,000",,"aaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000A00","AAAA" +"000,000",,"aaaaaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000A00","AAAA" +"000,000",,"aaaaaaa0@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000A00","AAAA" +"000,000",,"aaaaaaa0000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000A00","AAAA" +"00,000",,"aaaaaaa_00@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000A0A","AAAA" +"00,000",,"aaaaaaaaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000A0A","AAAA" +"00,000",,"aaaaaaaaaa.aaaaaa@aa.aaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000A0A0A","AAAA" +"000,000",,"aaaaaaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000A00","AAAA" +"00,000",,"Aaaaaa.aaaaaa@aaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000000","AAAA" +"00,000",,"Aaaaa.Aaaaaaa@aa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA00000A","AAAA" +"00,000","000,000","Aaaaaaa000@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAAAAAA" +"00,000",,"Aaaa.Aaaaaa@aa.aaaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA00000A","AAAA" +"00,000",,"Aaaa.Aaaaaa@aa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA00000A","AAAA" +"000,000","000,000","aaaaaa.aaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000A00A","AAAAAAAA" +"000,000",,"aaaaaa@aaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"00,000",,"aaaaa.aaaa@aaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000A000","AAAA" +"000,000",,"aaaaaa00@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000000","AAAA" +"000,000","000,000","aaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000A00A","AAAAAAAA" +"000,000","000,000","aaaaa.aaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A0A0A00","AAAAAAAA" +"000,000",,"aaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000A000","AAAA" +"00,000","000,000","aa_aaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA000A0A0A","AAAAAAAA AAA AAAAAAA" +"000,000",,"Aaaa.Aaaaaa@aaaa.aa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00AA00","AAAA" +"00,000","000,000","Aaaaaa@aaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA000000","AAAAAAAA" +"00,000",,"aaaaaa@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A000000","AAAA" +"00,000",,"aaaa.aaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A0AA0A0","AAAA" +"00,000",,"aaaaaaaa@aaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA000AA00A","AAAA" +"00,000",,"aaaaaaa@aaaaaaaaaaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000A00","AAAA" +"0,000",,"aaa.aaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000A000","AAAA" +"000,000",,"aaaaa.aaaaaaaa@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000A000","AAAA" +"000,000","000,000","aaaaaaa0@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A000A0A","AAAAAAAA" +"000,000","000,000","aaaaa0000@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A000A0A","AAAAAAAA" +"000,000",,"aaaaaaa@aaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00A000","AAAA" +"00,000","00,000","aaaaaa000@aaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000A00A","AAAAAAAA" +"00,000","00,000","Aaaaaa.Aaaaaa@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00A000","AAAAAAAA" +"000,000",,"aaaaaa@aaaaaaaaaaaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000A00A","AAAA" +"00,000","00,000","aaaaaaa.aaaaa@aaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000A0A","AAAAAAAA" +"000,000",,"aaaaaaaa.aaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000A000","AAAA" +"000,000",,"aaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A0A00A0","AAAA" +"00,000","00,000","aaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA0A00A0","AAAAAAAA" +"000,000","00,000","aaaaaaa.a.aaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA000000","AAAAAAAA" +"00,000",,"aaaaaaa@aaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000AA0A","AAAA" +"000,000","00,000","Aaaaa0000@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A000A00","AAAAAAAA AAA AAAAAAA" +"000,000","000,000","aaaaaaaa@aaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A000A00","AAAAAAAA" +"00,000","00,000","aaaaaaa00@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA000A0A00","AAAAAAAA" +"00,000",,"aaaaaaaaa@Aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000000","AAAA" +"00,000",,"aaaaaaa.aaaaaaa@aaaa.aaaaa.aa.aa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000A00","AAAA" +"000,000","00,000","AAAAAA0000@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000A00A","AAAAAAAA" +"00,000",,"aaaaaaaa@aa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000000","AAAA" +"000,000",,"aaaaaa.aaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000A000","AAAA" +"00,000",,"aaaa.aaaaa@aaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000A00A","AAAA" +"0,000","000,000","aaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA00A000","AAAAAAAA AAA AAAAAAA" +"00,000",,"aaaaa.aaaaaaa@aa.aaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA000A0A0A","AAAA" +"000,000",,"aaaaaa@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000A00","AAAA" +"000,000",,"aaaaaaaa.aaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA000AA000","AAAA" +"000,000",,"Aaaaaaaa.Aaaaaa@aaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000A00A","AAAA" +"00,000",,"aaaaaaaaa@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00000A","AAAA" +"00,000",,"aaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000000","AAAA" +"00,000",,"aaaaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00AA0A","AAAA" +"00,000",,"aaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA000A00","AAAA" +"00,000",,"aaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA000A00","AAAA" +"00,000","000,000","aaaaa0_0@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000AA00","AAAAAAAA" +"000,000",,"a00000000@aaa.aaa.aa",00/00/0000 00:00:00AA,"0,000.00","AAA0A0AA000","AAAA" +"00,000",,"aaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A000000","AAAA" +"0,000","00,000","aaaaaaaaa@aaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000A000","AAAAAAAA" +"00,000",,"aaaaaaa00@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA000A0000","AAAA" +"00,000",,"aaaaaaa_aaaaaaa@aa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000A00","AAAA" +"00,000",,"aaa_aaaa@aa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000A00","AAAA" +"00,000",,"Aaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000AA0A","AAAA" +"000,000","00,000","aaaaaaaaa.aaa@aa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000000A","AAAAAAAA" +"00,000","000,000","aaaaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000AA0A","AAAAAA AAAA AAAAA" +"00,000","0,000","aaaaaa.aaaaa@aaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000A00","AAAAAAAA" +"00,000",,"aaaaaa.aaaa@aaaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000A00","AAAA" +"000,000",,"aaaaaaa@aaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A000A0A","AAAA" +"00,000","00,000","aaaaaaaaaa@aaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000AA0A","AAAAAA AAAA AAAAA" +"00,000","000,000","Aaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000000A","AAAAAAAA AAA AAAAAAA" +"00,000",,"aaaaaaaaaa0@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00A00A","AAAA" +"00,000",,"aaaaaa0000@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00A00A","AAAA" +"00,000",,"aaaaaaa00@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A000A0A","AAAA" +"00,000","00,000","aaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000000","AAAAAAAA" +"000,000",,"aaaa0@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA0A0A00","AAAA" +"0,000",,"aaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000000","AAAA" +"00,000","000,000","aaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAAAAAA AAA AAAAAAA" +"00,000",,"a.aaaaaaaa@aaaaa.aa",00/00/0000 0:00:00AA,"0,000.00","AAA000A0A00","AAAA" +"00,000",,"a.aaaaaaaa@aaaaa.aa",00/00/0000 0:00:00AA,"0,000.00","AAA000A0A00","AAAA" +"00,000",,"aaaaaa@aaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA00A000","AAAA" +"00,000","000,000","aaaaaaaaaaa000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAAAAAA" +"000,000",,"aaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA00A00A","AAAA" +"000,000",,"Aaa_Aaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000000","AAAA" +"000,000",,"Aaaaa.Aaaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000000","AAAA" +"00,000",,"aaaa.aaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000AA0A","AAAA" +"000,000",,"aaaaaaaa.aaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000A0A","AAAA" +"00,000","00,000","aaaaaaaa@aaaaaaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000AA0A0","AAAAAAAA" +"00,000",,"aaaaaa@aaaaaaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000AA0A0","AAAA" +"00,000",,"aaaaaa.aaaaa@aaaaaaaa.aa",00/00/0000 0:00:00AA,"0,000.00","AAA000AA0A0","AAAA" +"000,000",,"aa0000@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA00","AAAA" +"00,000",,"aaaaaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000A0A00","AAAA" +"000,000",,"aaaaaaaa000@aaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000A0A","AAAA" +"000,000","0,000","aaaaaa.a.aaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A0A0000","AAAAAAAA" +"000,000",,"aaaaaaa.a.aaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A0A0000","AAAA" +"000,000","000,000","aaaaaa.aaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAAAAAA" +"00,000","000,000","aaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA00","AAAAAAAA" +"000,000","000,000","AAAAAAAAAAA000@AAAAAAA.AAA",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA00","AAAAAAAA" +"00,000",,"aaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000A0A","AAAA" +"00,000","000,000","aaaaa_aaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000AA0A","AAAAAAAA" +"000,000","000,000","aaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAAAAAA" +"000,000",,"aaaaa.aaaaaa@aaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaaa_aaa00@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaa_aaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"00,000",,"aaaaaa_aaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000A00","AAAA" +"000,000",,"Aaaaaaaaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000A00A","AAAA" +"00,000","00,000","aaaaaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000AA00","AAAAAAAA" +"000,000",,"aaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000A000","AAAA" +"00,000",,"aaaaaa@aaaaaaa-aaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000A00","AAAA" +"000,000",,"aaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000AA00","AAAA" +"000,000",,"aaaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000AA00","AAAA" +"000,000",,"aaaaaaaaa@aaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000AA00","AAAA" +"000,000",,"aaaaaaaaa_a00@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000AA00","AAAA" +"000,000",,"aaaaaaaaa_a00@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000AA00","AAAA" +"000,000",,"aaaaa_aaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A000000","AAAA" +"00,000","00,000","aaaaaa@aaaaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00A00A","AAAAAAAA" +"000,000",,"aaaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA00A00A","AAAA" +"00,000","00,000","aaaaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00000A","AAAAAAAA" +"00,000","00,000","aaaaa_aa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000000","AAAAAAAA" +"00,000",,"aaaaaaa0000@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000000","AAAA" +"00,000",,"aaaaaaaa00@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000000","AAAA" +"00,000",,"aaaaaaaa00@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000000","AAAA" +"00,000",,"aaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000000","AAAA" +"00,000",,"aaaa_0000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA00","AAAA" +"00,000",,"aaa0_aaaaaa00aaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA00","AAAA" +"00,000","00,000","aaaaaa000@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAAAAAA" +"00,000",,"aaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAA" +"00,000","000,000","aaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000000A","AAAAAAAA" +"00,000","000,000","aaaaa000@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000000A","AAAAAA AAAA AAAAA" +"00,000",,"aaaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000000A","AAAA" +"000,000",,"aaaaaaaaa@aaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000000","AAAA" +"000,000",,"aaaaaaa_@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000000A","AAAA" +"000,000",,"aaaaaaa.aaaaaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000000A","AAAA" +"00,000",,"aaaaaaa.aaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000A0A0A","AAAA" +"00,000","00,000","aaaaaaaaaaaaaaaa00@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA0A00A0","AAAAAAAA" +"00,000",,"aaaaaaaaaaaa00@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000AA0A","AAAA" +"00,000",,"aaa0000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA00A000","AAAA" +"00,000",,"aaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA00A000","AAAA" +"00,000",,"aaaaaaa_aaaaaaaa@aaaaa.aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA00A000","AAAA" +"00,000",,"aaaaaa0000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA00A000","AAAA" +"000,000","000,000","aaaaa000@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000000","AAAAAAAA" +"00,000","00,000","aaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00A000","AAAAAAAA" +"000,000",,"aaaaaaaa@aaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000A0A","AAAA" +"00,000",,"aaaaaa.aaaaa@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000A00","AAAA" +"00,000",,"aaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00AA00","AAAA" +"000,000","00,000","aaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA0A000A","AAAAAAAA" +"00,000",,"aaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000A00A","AAAA" +"000,000",,"aaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000A0A","AAAA" +"00,000",,"aaaaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"00,000",,"Aaaa0Aaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"00,000",,"aaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAA" +"00,000",,"aaaaaaaa00@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000A0A","AAAA" +"00,000",,"aaaaaaa00@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000A0A","AAAA" +"000,000",,"aaaa-aaaaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"00,000",,"Aaaaaaaa0000@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000A00","AAAA" +"000,000",,"aaaa.aaaaaaa@AAAAA.AA",00/00/0000 0:00:00AA,"0,000.00","AAAAA000000","AAAA" +"000,000",,"aaaaa000@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000A000","AAAA" +"00,000",,"aaaaaaa_aa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000000","AAAA" +"000,000","00,000","aaaaaaaaaaa00@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000A00","AAAAAAAA" +"000,000","00,000","aaaaaaaaaa000@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000A0A","AAAAAAAA" +"000,000",,"aaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000AA00","AAAA" +"000,000","00,000","aaa0000@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA000AA0A0","AAAAAAAA" +"00,000",,"aaaaaaaaaaa@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA00000A","AAAA" +"00,000",,"aaa00000@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000A0A","AAAA" +"000,000",,"aaaaaaa000@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000A0A","AAAA" +"000,000",,"aaaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA00AA00","AAAA" +"00,000",,"aaaaaa_aaaaaaaaaaa@aaaaaaaa-aaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000A00","AAAA" +"00,000",,"aa.aaaaaa@aaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000A0AA0","AAAA" +"000,000","00,000","aaaaaa0000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000A0A","AAAAAAAA" +"00,000",,"aaaaaaaa@aaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"00,000",,"Aaaaa.a.aaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000A000","AAAA" +"00,000","00,000","aaaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000A000","AAAAAAAA" +"00,000",,"aaaa00@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000A000","AAAA" +"000,000",,"aaaaaa000@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA000AAAAA","AAAA" +"000,000","000,000","aaaaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000A000","AAAAAAAA" +"000,000",,"Aaaaa_Aaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000A000","AAAA" +"000,000",,"aaaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA000A00","AAAA" +"000,000",,"aaaaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000A00A","AAAA" +"000,000",,"aaaaaaaaaa0@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00000A","AAAA" +"000,000",,"aaaa_aa_aaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A000A00","AAAA" +"000,000",,"aaaaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000000","AAAA" +"000,000",,"aaaaaaaaaaaaaaaaaa@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000000","AAAA" +"00,000",,"Aaaaaa.Aaaaaaa@aaa.aaaaa.aa.aa",00/00/0000 00:00:00AA,"0,000.00","AAA0000AA00","AAAA" +"00,000",,"aaaaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA000A00","AAAA" +"000,000",,"aaaaaaaaaaaaa@aaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000A0A","AAAA" +"000,000",,"aaaaaaa00@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000A0A","AAAA" +"000,000","000,000","aaaaa.aaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000A0A","AAAAAAAA" +"000,000",,"aaaaaaaaaaaaa@aaaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000000","AAAA" +"000,000",,"aaaaaaaaaa@aaaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000000","AAAA" +"000,000",,"aaaaaaaaaaaaaaaa@aaaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000000","AAAA" +"000,000",,"aaaaaaaaaaaa@aaaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000000","AAAA" +"000,000",,"aaaaaaaaaaa@aaaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000000","AAAA" +"000,000",,"aaaaaaaaaaa@aaaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000000","AAAA" +"00,000",,"aaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000A000","AAAA" +"000,000",,"aaaa00000@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000AA00","AAAA" +"000,000",,"aaaaaaaaaaaaaa@aaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000AA00","AAAA" +"000,000",,"aaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA00A000","AAAA" +"00,000",,"aaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00A00A","AAAA" +"000,000","00,000","aaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A0AAAA0","AAAAAAAA" +"00,000",,"aaaaaaaa@aaaaaaaaaa.aa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000000","AAAA" +"00,000",,"aaaaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA000A00","AAAA" +"00,000",,"aaaaaa@aaa.aaaaaaaa-aa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA000A00","AAAA" +"00,000",,"aaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA000A00","AAAA" +"00,000",,"aaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA000A00","AAAA" +"00,000",,"aaaaa.aaaaa@aaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA000A00","AAAA" +"00,000","00,000","aaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA000A00","AAAAAAAA" +"00,000",,"aaaaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA000A00","AAAA" +"00,000",,"aaaaaaaa00@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA000A00","AAAA" +"00,000",,"aaaaaaaaaaa00@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA000A00","AAAA" +"00,000",,"aaaaaaa0@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000000","AAAA" +"00,000","0,000","aaaaaa.aaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000A00","AAAAAAAA AAA AAAAAAA" +"00,000",,"aaaaa@aaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000000","AAAA" +"000,000","00,000","aaaa00@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA000A0A","AAAAAA AAAA AAAAA" +"000,000","0,000","aaaaaa.aaaaa@aa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA000A0A","AAAAAAAA AAA AAAAAAA" +"00,000",,"a.aaaaaaaaa@aaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000A00","AAAA" +"000,000",,"aaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000A000","AAAA" +"000,000",,"aaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA000A00AA","AAAA" +"000,000",,"aaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA000A00AA","AAAA" +"00,000","000,000","aaaaa0@aaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000A0A","AAAAAAAA" +"000,000","00,000","aaaaaaaaaaaaa000@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A000000","AAAAAAAA" +"00,000","000,000","aaaaaaaaa000@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000A00","AAAAAAAA" +"000,000","00,000","aaaa_a@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA00AA0A","AAAAAAAA" +"00,000","000,000","aaaa000@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00AA00","AAAAAAAA" +"00,000","000,000","aaaaaaa@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00AA00","AAAAAAAA" +"000,000",,"aaaaaaa0@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA00AA0A","AAAA" +"000,000",,"aaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA00AA0A","AAAA" +"000,000",,"aaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA00AA0A","AAAA" +"000,000","00,000","a.a.aaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA00AA0A","AAAAAAAA" +"000,000",,"aaaaaaaaa0@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A0A00A0","AAAA" +"000,000",,"Aaaaa.Aaaaaaaa@aaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A0A00A0","AAAA" +"000,000","00,000","aaaaaa_aaaaaa0@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000000","AAAAAAAA" +"000,000",,"aaaaa_aaaa_aaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000000","AAAA" +"000,000","000,000","aaaaaa00@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000000","AAAAAAAA" +"000,000",,"aaaaaaaaaaa000@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000000","AAAA" +"000,000",,"aaaaaa.aaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000000A","AAAA" +"00,000",,"aaaaa.a.aaaaaaaa@aaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000A0000","AAAA" +"000,000","00,000","aaaaaaaa.aaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA00A000","AAAAAAAA" +"00,000","00,000","aaaaaaaa00@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA00A0AA0","AAAAAAAA" +"00,000",,"aaaa.aaaaa@aaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAA" +"000,000","000,000","aaaaaa.aaaaa-aaaaaaaa@aaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000A00","AAAAAAAA" +"000,000",,"aaaaaaaa00@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAA" +"00,000",,"a.aaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"0,000",,"aaaaaa0000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000000","AAAA" +"000,000",,"aaaaaa.aaaaaaa@aaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A0A0000","AAAA" +"000,000",,"aaaaaa.aaaaaaa@aaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A0A0000","AAAA" +"00,000",,"aaaaa00@aaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000A0A","AAAA" +"00,000",,"aaaaaa@aaaaa-aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00AA00","AAAA" +"00,000",,"aaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA00A00A","AAAA" +"00,000",,"aa00a0@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000A0A","AAAA" +"00,000","00,000","aaaaaa00@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000A0A","AAAAAAAA" +"000,000",,"aaaa_aa_aaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000A00","AAAA" +"000,000",,"a_aaaa_0_aaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000A00","AAAA" +"000,000",,"a_aaaa_0_aaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000A00","AAAA" +"000,000","0,000","aaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000A0A","AAAAAAAA" +"000,000","000,000","aaaaa.aaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000A0A","AAAAAAAA" +"000,000",,"aaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000A00","AAAA" +"00,000",,"aaaaaaaa00@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000A0A","AAAA" +"00,000",,"aaaaaaaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000A0A","AAAA" +"000,000",,"aaaaaaaaaaaa_@aaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000000A","AAAA" +"000,000",,"aaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000A000","AAAA" +"00,000",,"aaaaaaaaaaaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaa@aaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000A000","AAAA" +"0,000",,"aaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A000A00","AAAA" +"000,000",,"aaaa00@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000A0A","AAAA" +"000,000",,"aaaaaa00@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000A0A","AAAA" +"000,000",,"aaaaaaaaa00@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000A0A","AAAA" +"000,000",,"aaaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000A0A","AAAA" +"000,000",,"aaaaaaaa000000@aaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000A0A","AAAA" +"000,000",,"aaaaaaaaaa.a@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000A0A","AAAA" +"000,000",,"aaaaa0@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000A00","AAAA" +"000,000",,"aaaaaaa0000@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000A00","AAAA" +"000,000",,"aaaaaaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000A00","AAAA" +"000,000",,"aaaaaaaaaaa@aaaaa.aa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000000","AAAA" +"000,000",,"aaaaaaaaaaaaaaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000A00A","AAAA" +"000,000","000,000","aaaaaaaaaaaaaaa0000@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000A00A","AAAAAAAA" +"000,000",,"aaaaaa_aaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000A00A","AAAA" +"000,000",,"aaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000A00A","AAAA" +"000,000",,"aaaaaaa00@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000A00A","AAAA" +"000,000",,"aaaaaa0000@aaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000A00A","AAAA" +"000,000",,"aaaa_a_aaaa_aa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000A00A","AAAA" +"000,000",,"aaaaaa0aaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000A00A","AAAA" +"000,000",,"aaaaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000A00A","AAAA" +"000,000","000,000","aaaaaaa@aaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA00AAAAA","AAAAAAAA" +"000,000",,"aaa.aaaaaaaaaaaa@aa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaa.aaaaaaaaa@aa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaa.aaaaaa@aa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaaa.aaaaaa@aa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaaaa.aaaa@aa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaa.aaaaaaa@aa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaa.aaaaaaa@aa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaa.aaaaaa@aa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaa.aaaaaa@aa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaa.aaaaa@aaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000","000,000","aaaa00@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAAAAAA" +"000,000",,"aaaa.aaaaaaa-aaaaaaaa@aa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaaaaaaa@aaaaa.aa.aa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaa.aaaaaaa@aa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaa.aaaaaa@aa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaa.aaaaaa@aa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaaa.aaaaaaaaa@aa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000","000,000","aaaaaaaa@aaaaaaa.aa",00/00/0000 0:00:00AA,"0,000.00","AAA0000A00A","AAAAAAAA" +"00,000",,"aaaaa_aaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A0A0AA0","AAAA" +"00,000",,"aaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000A0A","AAAA" +"00,000","00,000","aaaa0000@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000000","AAAAAAAA" +"000,000",,"aaaaaaaaaa@aaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A0AAA0A","AAAA" +"000,000",,"aaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000000","AAAA" +"00,000","00,000","aaaaaa0@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000AA0A","AAAAAAAA" +"0,000","00,000","aaaaaaaaa@aaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000A000","AAAAAAAA" +"000,000","000,000","Aaaaa.aaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000000A","AAAAAAAA AAA AAAAAAA" +"0,000",,"Aaaaaaaa000@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000AA00","AAAA" +"000,000",,"aaaaaaaa.a.aaaaaa@aaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000000","AAAA" +"000,000",,"aaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000AA00","AAAA" +"00,000","00,000","aaaaaa.aaaaaaa@aaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A0AA000","AAAAAAAA" +"000,000","000,000","aaaaaa.aaaaaaaaa@aa.aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA000A0A","AAAAAAAA" +"000,000",,"aaaaaaaa.aaaaaaa@aaaaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00AA00","AAAA" +"00,000",,"aaaaaaaa_aaaaaaa@aa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000000A","AAAA" +"00,000",,"aaaaaaa@aaaaaaa.aa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000000A","AAAA" +"00,000",,"aaaaa_aaaaaaa@aa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000000A","AAAA" +"00,000",,"aaaaaaa000@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000000A","AAAA" +"00,000","000,000","aaaaaaa@aaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000000A","AAAAAA AAAA AAAAA" +"00,000",,"Aaaaaaa.Aaaaaa@aaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000000A","AAAA" +"00,000",,"aaaaaa.aaaaaaa@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000000A","AAAA" +"00,000",,"aaaaaaaa@aaaaaaaaaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000000A","AAAA" +"00,000",,"aaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000000A","AAAA" +"00,000",,"aaa0000@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000000A","AAAA" +"00,000",,"AAaaaaaa@aaaaaaaaaaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000000A","AAAA" +"00,000",,"aaaaaaaaaa@AaaaaaAaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000000A","AAAA" +"00,000",,"aaaaaa.aaaaaaaaa@aaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000000A","AAAA" +"00,000","000,000","aaaaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000000A","AAAAAAAA" +"00,000",,"AaaaaaAA@aaa.aaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA00A0000","AAAA" +"00,000",,"AaaaaAaa@aaa.aaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA00A0000","AAAA" +"000,000","000,000","AAAAAAAAAA@AAAAA.AAA",00/00/0000 00:00:00AA,"0,000.00","AAA00000A0A","AAAAAAAA" +"00,000",,"aaaaaaaa@aaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA00A0000","AAAA" +"00,000",,"Aaaaaaa@aaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA00A0000","AAAA" +"000,000","00,000","aaaaaa.aaaaaa@aaaaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA000A0AA0","AAAAAAAA" +"00,000",,"aaaaaaaaaaaaa00@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA000000","AAAA" +"00,000","000,000","AAAAAAA.AAAAA@AAAAA.AAA",00/00/0000 00:00:00AA,"0,000.00","AAA0000000A","AAAAAAAA" +"00,000","00,000","aaaaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A000000","AAAAAA AAAA AAAAA" +"000,000",,"aaaaaa_000@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000000","AAAA" +"000,000",,"aaaaa.aaaaaa@aaaaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA000A0AA0","AAAA" +"00,000","0,000","aaa0000@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00000A","AAAAAAAA" +"00,000",,"aaaaaaaa.aaaaaaaa.aaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA00AA00","AAAA" +"000,000",,"aaaaaaaa@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A0AAAA0","AAAA" +"000,000",,"aaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A0AAAA0","AAAA" +"000,000",,"aaaaaa@aaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A0AAAA0","AAAA" +"000,000","00,000","aaaaaaaaaaa@aaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A0AAAA0","AAAAAAAA AAA AAAAAAA" +"000,000",,"aaaaaaaa@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A0AAAA0","AAAA" +"000,000",,"aaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A0AAAA0","AAAA" +"00,000",,"aaaaaa.aaaaaaaaa@aaa.aaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA000000","AAAA" +"00,000","00,000","aaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA000A00","AAAAAAAA AAA AAAAAAA" +"00,000",,"aaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000A00","AAAA" +"00,000",,"aa-aaaaaa@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000A000","AAAA" +"00,000",,"aaaaaaaa.aaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA0AAAAA","AAAA" +"000,000",,"aaaaaaa@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000A000","AAAA" +"00,000","000,000","aa_aaaaaaa@aaaaa.aa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000A00","AAAAAAAA" +"000,000","000,000","aaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000A0A","AAAAAAAA" +"000,000","000,000","aaaaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000A0A","AAAAAAAA" +"000,000",,"aaaaaa0a@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000A0A","AAAA" +"00,000","00,000","aaaaaaa@aaaaaaaaaa.aa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000A00","AAAAAAAA" +"000,000",,"aaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000A0A","AAAA" +"00,000","000,000","aaaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00AA0A","AAAAAAAA" +"00,000",,"aaaaaa00000@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00AA0A","AAAA" +"000,000",000,"aaaaaa.aaaaaaa@aa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000A000","AAAAAAAA" +"00,000",,"Aaaaaaa.Aaaa@aaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA000AA0A0","AAAA" +"00,000","00,000","aaaaaaa@aa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000000","AAAAAAAA" +"000,000",,"aaa00a@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000A00","AAAA" +"00,000",,"aaaaaaaaaaaaaa@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA00AA00","AAAA" +"000,000",,"aaaa.aaaaaa@aaaaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00AA00","AAAA" +"00,000",,"aaaaaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000000A","AAAA" +"000,000","00,000","aaaaaaaa.a.aaaaa@aa.aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A000A00","AAAAAAAA" +"00,000",,"aaaaaa@aa-aaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000A000","AAAA" +"00,000","00,000","aaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA000A00","AAAAAAAA AAA AAAAAAA" +"00,000",,"aaaaa0000@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000A00","AAAA" +"00,000",,"aaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000A00","AAAA" +"00,000",,"a0aaa000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000A00","AAAA" +"00,000","00,000","AaAaaaAaaA@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000A00","AAAAAAAA" +"00,000",,"aaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000A00","AAAA" +"00,000",,"Aaa.Aaaaaaaa@aaaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000A00","AAAA" +"00,000",,"aaaa0aaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000A00","AAAA" +"00,000",,"aaa0000@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000000","AAAA" +"00,000",,"aaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000A000","AAAA" +"000,000",,"aaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA00","AAAA" +"000,000",,"aaaaaa@aaaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000AA0A","AAAA" +"000,000",,"aaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000AA0A","AAAA" +"000,000","000,000","aaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000A000","AAAAAAAA" +"000,000","00,000","aaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00000A","AAAAAAAA" +"000,000",,"Aaaaaa0@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00000A","AAAA" +"00,000","000,000","aa00000@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A0AA00A","AAAAAAAA" +"00,000",,"aaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000A00","AAAA" +"000,000",,"aaaa000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000","00,000","aaaaaa.aaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA00A0000","AAAAAAAA" +"000,000",,"aaaaaaa@aaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000A0A","AAAA" +"000,000",,"aaaaaaa.aaaaaa@aaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000AA0A","AAAA" +"000,000",,"aaaaaaa.aaaaaaa@aaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000AA0A","AAAA" +"000,000",,"aaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAA" +"00,000",,"aaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000A000","AAAA" +"00,000",,"aaaaaaa@aaaaaaaaaaa.aa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000A00","AAAA" +"000,000","00,000","aaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000A00","AAAAAAAA AAA AAAAAAA" +"00,000",,"aaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00A000","AAAA" +"00,000",,"a_aaaaaa00@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000A00","AAAA" +"00,000","000,000","aaaaaa0000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000A0A","AAAAAAAA" +"000,000","00,000","Aaaaaaaaaa.aaaaa@aa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00A00A","AAAAAAAA" +"00,000","00,000","aaaaaaaaaaaa0000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000AA00","AAAAAA AAAA AAAAA" +"000,000",,"aaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00000A","AAAA" +"000,000",,"aaaa0000@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00000A","AAAA" +"0,000","0,000","aaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000A00","AAAAAAAA" +"00,000","00,000","aaaaaaaaaaaaaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000000","AAAAAAAA" +"0,000",,"aaaaaa000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A0AA0A0","AAAA" +"00,000",,"a_aaaaaaaa@aaaaa.aa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000A00","AAAA" +"00,000",,"a_aaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000A00","AAAA" +"000,000",,"aaaaaaa@aaaaaa.a00.aa.aa",00/00/0000 0:00:00AA,"0,000.00","AAA0000AA00","AAAA" +"00,000",,"AAaaaaa000@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000A00","AAAA" +"000,000",,"aaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000A00A","AAAA" +"000,000",,"aaaaaaa000000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000A00A","AAAA" +"000,000",,"aaaaaa_0@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000A00A","AAAA" +"000,000",,"aaaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000A00A","AAAA" +"000,000","00,000","aaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000A00A","AAAAAAAA" +"000,000","00,000","aaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000A00A","AAAAAAAA" +"000,000",,"aaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000A00A","AAAA" +"000,000",,"aaaaaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000A00A","AAAA" +"000,000",,"aaaaaaaaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000A00A","AAAA" +"00,000","00,000","aaaaaaaa_aaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA00A0000","AAAAAAAA" +"000,000","000,000","AAAaaaaaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00A000","AAAAAAAA" +"0,000","000,000","aaaaaaaaaaa000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA00A000","AAAAAAAA AAA AAAAAAA" +"0,000","00,000","a.aaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA00A000","AAAAAAAA" +"0,000",,"aaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA00A000","AAAA" +"00,000",,"aaaaaaaaaa@aaaaa.aaa.aa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAA" +"000,000",,"aaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000A00","AAAA" +"000,000",,"aaaaaaaa@aaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000AA00","AAAA" +"000,000","00,000","aaaaaaaaaaaaaaaa@aaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000000","AAAAAA AAAA AAAAA" +"0,000",,"aaaaaaa_@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA00A000","AAAA" +"000,000",,"aaaaaa_aaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00AA00","AAAA" +"000,000",,"aaaaaa@aaaaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00AA00","AAAA" +"000,000","00,000","aaaaaaaaaa000@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00AA00","AAAAAAAA" +"000,000","00,000","aaaa_aaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000A000","AAAAAAAA" +"000,000",,"aaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000A00","AAAA" +"000,000",,"aaaaa00@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA000A0AA0","AAAA" +"000,000","000,000","aaaaa0000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00000A","AAAAAAAA" +"000,000",,"aaaaaaa.aaaaa@aaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00000A","AAAA" +"000,000",,"aaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00000A","AAAA" +"00,000",,"aaaaaa000@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"00,000",,"aaaaaaa.aaaaaaa@aaaaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"00,000",,"aaaaaaaaa@aaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"00,000",,"aaaaa00@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000A0A","AAAA" +"00,000",,"aaaaa0@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000000A","AAAA" +"00,000",,"aaaaaaaa0000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAA" +"00,000","00,000","aaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00A000","AAAAAAAA" +"000,000",,"a_aaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA00","AAAA" +"000,000",,"aaaaaaaa@aa.aa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00000A","AAAA" +"00,000",,"aaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00000A","AAAA" +"000,000","00,000","aaaaaaaaaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000AA0A0","AAAAAAAA" +"00,000","000,000","aaaaaaaaaaaaaa00@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000000","AAAAAAAA" +"00,000",,"aaaaaaaaaaaaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000A0A","AAAA" +"00,000",,"aaaa00@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000A0A","AAAA" +"000,000",,"aaaaaa.aaaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000A00","AAAA" +"000,000",,"aaaaaaa.aaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000A00","AAAA" +"000,000","000,000","aaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000000","AAAAAAAA" +"000,000",,"aaaaaa.a.aaaaaaaa@aaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A0AA000","AAAA" +"000,000",,"aaa_aaaaa-aaaaaaa@aaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA00AA00","AAAA" +"000,000",,"aaaaa.aaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000A00A","AAAA" +"000,000","000,000","aaaaaaa_aaaaaaaa@aaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA00AA00","AAAAAAAA" +"00,000","00,000","a.aaa@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000000","AAAAAAAA" +"000,000",,"aaaaaaa_aaaaaaaa@aa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000A000","AAAA" +"00,000",,"aaaaaaaaaaa@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA00A0000","AAAA" +"000,000",,"aaaaaaa_aaaaaaa@aa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000A000","AAAA" +"00,000",,"aaaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA00AA00","AAAA" +"000,000",,"aaaaaaaa_aaaaaaaaaa@aa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000A000","AAAA" +"000,000","00,000","aaaaaaa_aaaaaaa@aa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000A000","AAAAAAAA" +"00,000",,"aaaaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000AA00","AAAA" +"000,000",,"aaaaaaa0000@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000A00A","AAAA" +"000,000",,"aaaaaa@aaaaaaaaa.aa",00/00/0000 00:00:00AA,"0,000.00","AAA0000A00A","AAAA" +"000,000",,"aaaaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000A00A","AAAA" +"000,000",,"aaaaaa.aaaaa@aaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000A00","AAAA" +"000,000",,"aaaaaa@aaaaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00000A","AAAA" +"0,000",,"aaaa_aaaaaaa@aaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00AA0A","AAAA" +"000,000",,"aaaaaaaaa000@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA000A00","AAAA" +"000,000",,"aaaaaa000@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A000000","AAAA" +"000,000",,"aaaaaaaaa@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A0AA0A0","AAAA" +"000,000",,"aaaaaa@aaaaaaaaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A0AA0A0","AAAA" +"00,000",,"aaaaa0000@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00AA00","AAAA" +"000,000","00,000","aaaaa.aaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA00000A","AAAAAAAA" +"000,000",,"aaaaaaaaaa00@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000A00A","AAAA" +"000,000",,"aaaaa_aaaaaa@aaaaaaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA00A0AA0","AAAA" +"00,000","000,000","aaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000000","AAAAAAAA" +"00,000",,"aaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000000","AAAA" +"000,000",,"aaaaaaaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA000AA00A","AAAA" +"00,000",,"aaaaaaaaaa.aaaaaa@aa.aaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA000A0A0A","AAAA" +"000,000",,"aaaaaa@aaaaaaaaa.aa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00000A","AAAA" +"000,000","000,000","aaaaaa.aaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000A00A","AAAAAAAA" +"000,000",,"aaaaaaaaa00@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA000AAA00","AAAA" +"000,000","000,000","Aaaaaa_Aaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA000AAA00","AAAAAAAA" +"000,000","00,000","aaaaaaaaaa0@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A000000","AAAAAAAA AAA AAAAAAA" +"000,000","000,000","aaaaaaaa00@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A000000","AAAAAAAA" +"000,000","00,000","aaaaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000000A","AAAAAAAA" +"00,000",,"aaaaaaaaaaaa@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaaaa@aaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A000000","AAAA" +"000,000",,"aaaaaaaaaaaa@aaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A000000","AAAA" +"000,000",,"Aaaaa.Aaaaaaa@aaaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A000000","AAAA" +"000,000",,"aaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00A00A","AAAA" +"000,000",,"aaaaaa@aaaaaaaa.aa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00A00A","AAAA" +"000,000",,"aaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAA" +"000,000","00,000","aaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000AA00","AAAAAAAA" +"000,000","000,000","aaaa@aaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAAAAAA" +"000,000",,"aaaaaaaa@aaaaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"a.0aaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaa.aaaaaa@aaaaaaaa0.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaa0000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaa00@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaaaaaaaaaa0@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaaa@aaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaaaa@aaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaaaaa@0aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaa.aaaaaaa@aaaaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aa0000@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000","000,000","aaaaaaaaa_aaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAAAAAA" +"000,000",,"aaaaaa.aaaaaa@aaaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaaaaaa@aaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaa.aaaaaaaa@aaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaa_aaaaaaaa@aaaa.a00.aa.aa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaa.a.aaaaa@aa.aaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaaaaaaa@aaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaa.aaaaa@aaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaa.aaaa@aaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaa@aaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaaa00@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaaaaaa@aaaaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaa@aaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaa.aaaaaaaa@aaaaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaa.a.aaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aa00000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaa.aaaaaaaa@aaaaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaaaa@aaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaa@0aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaaa_aaaaaaaa@aaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaaaaaaaaaaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaaa@aaaaaaaaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaa@aaaaaaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaaa@aaaaaaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaaaaaa@aaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaa.aaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaaaaaaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaaaaaa-aaa@aaaaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaaaaaaaaa@aaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaa0@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaaaaaaa00@aaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaaaa@aaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaaaa.aaaaaaaaa@aaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaaa0000@aaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaa-a@aaaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaa@aaaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aa.aaa000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaaa00@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaa@aaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaa.aaaaaa@aaaaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaaaaaaa@aaaaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaaaa@aaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaaa@aaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaa0000@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaaaa@a-aaaa.a00.aa.aa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaa@aaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaa.aaaaa@aaaaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaaaaaa@aaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaa.aaaaaaaaaa@aaaaaaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaaaa@aaaaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaaaaaaaa@aaaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaaaaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaaaa@aaa-aaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaaaa@aaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaaaa@aaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaa.aaaaaa@aaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaa@aaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaaa0a@aaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaaa.aaaaaaa@aaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaa.aaaaaaa@aaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaa.aaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaa.aaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaaaaa@aaaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaaaaa.aaaaaaaa@aaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaaaa@aaaaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaa.aaaaaa@aaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaaaaaa@aaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaaaa@aaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaaaaa@aaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaaa.aaaaa@aaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaaaaaaaa@aaaaaa.aaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaa@aaaaaaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaaaaaaaaaaa@aaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaaa00@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaa.aaaaaa@00.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaa0000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaa_aaaaaa@aaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaa@aaaaaaaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaa0@aaaaaaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaaa.aaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaa.aaaaaaa@aaaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaaaaaa_0@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaaaaa@aaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaaaaaaa@aaa.aaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaaaaa@0aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaaaaaaa00@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"a@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaa_aaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaa.aaaaaa@a0aaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaa.a.aaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaa.aaaaaa@aa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaa00@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaa.aaaaaaaaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaaa@aaaaaaa.aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaaaa@aaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaaaaaaaaa0@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaaaaaaaaaaaaa@aaaaaaaa.aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaa0@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaaa.a.aaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaaaa.aaaaaaaaa@aaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaa@aaaaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaaaa@aaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaa.aaaaaaa@aaaaaaaa0.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaaa.a.aaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaaa00@aaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaaaaaa@aaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaa.aaaaaaa@aaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaa@aaaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaaaaaaa@aaaaaaaaaaaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaa.aaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaa_a_aaaaaaaaaa-aaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaaaa0@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaaaaa@aaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaaaaaaaaaaaaa0@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaa.aaaaaa@aaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaaa@aaaaaaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaaaa@aaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaaaa0@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaaaa@aaaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaa.aaaaa@aaaaaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaa0aaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaa@aaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaa@aaaaaaaaaaaaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaa.a.aaaaaa@aaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000","000,000","aaaaaaaa0@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAAAAAA" +"000,000",,"aaaaaa00@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaa.aaaaaaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaaaaaa@aaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaa.aaaaaaa@aaaaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaa.aaaaaa@aaaaaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"a.aaaaaa@aaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaaa.aaaaaaaaa@aaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaa0000@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaa.aaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaaaaaaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaaa0@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aa0000@aaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaa@aaaaaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaaa.aaaaaaa@aaaaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaaa0000@aaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaa0000@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaaa.aaaaaaa@aa.aaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaaaa00@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aa0000@aaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaa000@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000000","AAAA" +"000,000","000,000","aaaaaaa00@aaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000000","AAAAAAAA" +"00,000",,"aaaaaa.aaaaaa@aaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000000","AAAA" +"00,000",,"aaaaaaa000@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000000","AAAA" +"00,000",,"aaaaa@aaaaaaaaaaaaaaaaa.aaaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000000","AAAA" +"00,000",,"aaaaaaaaaaa@aaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000000","AAAA" +"00,000",,"aaaaaaa@aaaaaaaaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000000","AAAA" +"00,000",,"aaaaaaaaaa0@aaa.aa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000000","AAAA" +"00,000",,"aaaaa@aaaaaaaaaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000000","AAAA" +"00,000",,"aaa@aaaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000000","AAAA" +"00,000",,"aaaaaaaa@aaa.aa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000000","AAAA" +"00,000","000,000","aaaaaaaaaaa@aaa.aa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000000","AAAAAAAA" +"000,000","000,000","aaaaaaa_aaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA0A000A","AAAAAA AAAA AAAAA" +"00,000",,"aaaaaaa00@aaa.aa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000000","AAAA" +"00,000","000,000","aaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00A000","AAAAAA AAAA AAAAA" +"00,000","000,000","aaaaaaa.aaaaaaaa@aaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000000","AAAAAAAA" +"00,000",,"aaaa_aaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000000","AAAA" +"000,000",,"aaaaaaaa@aaaaaaaaaa.aa",00/00/0000 0:00:00AA,"0,000.00","AAA00000A00","AAAA" +"000,000",,"aaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000A00","AAAA" +"00,000",,"aaaaaaa0@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00A00A","AAAA" +"00,000",,"aaaaa00@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00A00A","AAAA" +"00,000","00,000","aaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00A00A","AAAAAAAA" +"00,000",,"aaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00A00A","AAAA" +"00,000",,"aaaaa0000@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00A00A","AAAA" +"00,000",,"aaaaaaa.aaaaaaa@aaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00A00A","AAAA" +"000,000",,"aaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000A00","AAAA" +"00,000","0,000","aaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000000","AAAAAAAA AAA AAAAAAA" +"00,000",,"aaaaaaa@aaaaaaaaa.aa",00/00/0000 0:00:00AA,"0,000.00","AAA0000A000","AAAA" +"00,000",,"aaaaaaa.aaaaaaaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00AA00","AAAA" +"00,000","000,000","aaa@aaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00A000","AAAAAAAA" +"00,000",,"aaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000000","AAAA" +"000,000",,"aaaaaa0@aaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000A00","AAAA" +"000,000",,"aaaaaa0@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAA" +"000,000","000,000","aaaaaa00@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000A00","AAAAAAAA" +"000,000",,"aaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAA" +"000,000","000,000","aaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000000","AAAAAAAA" +"00,000",,"aaaaaaaaaaaa@aaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000A000","AAAA" +"000,000",,"aaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00A000","AAAA" +"000,000","000,000","aaa@aaaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00A000","AAAAAAAA" +"00,000",,"aaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000A00","AAAA" +"000,000",,"aaaaaa.aaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00000A","AAAA" +"000,000","00,000","Aaaaaaaaa00@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00000A","AAAAAAAA" +"00,000",,"aaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAA" +"000,000",,"aaaaaaaaaaaa00@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000A00","AAAA" +"000,000",,"aaaaaaa0000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000A00","AAAA" +"000,000",,"aaaaaaa0000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000A00","AAAA" +"000,000",,"aaaaaaaaaaa00@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000A00","AAAA" +"000,000",,"aaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000A00","AAAA" +"000,000","00,000","aaaaaaaa0@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000A00","AAAAAAAA" +"000,000",,"aaaaaa_0_aaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000A00","AAAA" +"000,000",,"aaaaa_aaaaa00@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000A00","AAAA" +"000,000",,"aaaaa00@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000A00","AAAA" +"000,000",,"aaaaaaaa000@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000000","AAAA" +"000,000",,"aaaaaaaa.aaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000AA00","AAAA" +"00,000",,"aaaaaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00AA0A","AAAA" +"00,000","00,000","aaaaa.aaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000A0A0A","AAAAAAAA" +"000,000","00,000","aaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAAAAAA AAA AAAAAAA" +"00,000",,"aaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000A0A","AAAA" +"00,000","000,000","aaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000A0A","AAAAAAAA" +"00,000",,"aaaaaa.aaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000000","AAAA" +"00,000","000,000","aaaaaa0000@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000000","AAAAAAAA" +"00,000",,"aaaaaaa000@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000000","AAAA" +"00,000","000,000","aaaaaaaaaa0000@aaaaa.aa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000000","AAAAAAAA" +"00,000",,"a.a.aaaaaa@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A0AAA0A","AAAA" +"000,000",,"aaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000A00","AAAA" +"00,000",,"aaaaa00@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA0AA0A0","AAAA" +"00,000","00,000","aaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA00AA00","AAAAAAAA" +"00,000",,"aaaaaaa00@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA00AA00","AAAA" +"00,000","000,000","aaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA00AA00","AAAAAAAA" +"000,000",,"aaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000A0000","AAAA" +"000,000",,"aaa_aaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000A0000","AAAA" +"000,000",,"aaaa.aaaaa@aaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000A0000","AAAA" +"000,000",,"aaaaaaaaa@aaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000A0000","AAAA" +"000,000",,"aaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000A0000","AAAA" +"000,000",,"aaaaaaa.aaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000A0000","AAAA" +"000,000",,"aaa.aaaaa@aa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000A0000","AAAA" +"000,000",,"aaaaaaaa@aaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000A0000","AAAA" +"000,000",,"aaaaaaaaa@aaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000A0000","AAAA" +"000,000",,"aaaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000A0000","AAAA" +"000,000",,"aaaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000A0000","AAAA" +"000,000",,"aaaaaaaaaaaa0@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000A0000","AAAA" +"000,000",,"aaaaaaaaa000@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000A0000","AAAA" +"000,000",,"aaaaaaaaa000@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000A0000","AAAA" +"000,000",,"aaaaaaaaa000000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000A0000","AAAA" +"000,000",,"aaa_00@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000A0000","AAAA" +"000,000",,"aaaaaa.aaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000A0000","AAAA" +"000,000",,"aaaaa000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000A0000","AAAA" +"000,000",,"aaaaaaaaa.aaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000A0000","AAAA" +"000,000",,"aaaaaa.aaaaaaaa@aa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000A0000","AAAA" +"00,000",,"aa.aaaaaa@aaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000A0AA0","AAAA" +"00,000",,"aaaaaaa.aaaaaaa@aaaaaaa.aa",00/00/0000 0:00:00AA,"0,000.00","AAAA000A00A","AAAA" +"00,000","00,000","aaaaaaaaa@aaaaaaaa.aa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00A000","AAAAAAAA" +"0,000","00,000","aaaaaaaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA00","AAAAAAAA AAA AAAAAAA" +"000,000",,"aaaa.aaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA00AA0A","AAAA" +"000,000",,"aaaaaaa0000@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA00AA0A","AAAA" +"00,000",,"aaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000A0A","AAAA" +"00,000",,"aaaaa00@aaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000A0A","AAAA" +"00,000",,"aaaaaaaaaa@aaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000A0A","AAAA" +"00,000",,"aaaaaaaaaaa@aaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000A0A","AAAA" +"00,000",,"a.aaaaaaa@aaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000A0A","AAAA" +"00,000",,"aaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000A0A","AAAA" +"00,000",,"aaaa.aaaaaa@aaa.aa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000A0A","AAAA" +"00,000",,"aaaaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000A0A","AAAA" +"00,000",,"aaaaaaa_aaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000A0A","AAAA" +"00,000",,"aaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000A0A","AAAA" +"00,000",,"aaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000A0A","AAAA" +"00,000",,"a_aaaa00@aaaaa.aa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000A0A","AAAA" +"00,000",,"aaaaa@aaaaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000A0A","AAAA" +"00,000",,"aaaaaaaa@aaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000A0A","AAAA" +"00,000",,"aaaaa0000@aaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000A0A","AAAA" +"00,000",,"aaaa.aaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000A0A","AAAA" +"00,000",,"aaaaaaaa-aa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000A0A","AAAA" +"00,000",,"aaaaaaa_000@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000A0A","AAAA" +"00,000",,"aaaaaaaaaaaaaaa@aaaaaaaaa.aa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000A0A","AAAA" +"00,000",,"aaaaa.aaaaa@aaaa.aa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000A0A","AAAA" +"00,000",,"aaaaaaa.a@aaaaaaaaa.aa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000A0A","AAAA" +"00,000",,"Aaaaa_aaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000A0A","AAAA" +"00,000","000,000","aaaaaaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000A0A","AAAAAA AAAA AAAAA" +"00,000",,"aaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000A0A","AAAA" +"00,000",,"aaaaaa@aaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000A0A","AAAA" +"00,000",,"aaaaaaaaaaaaaaaaaaaaa@aaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000A0A","AAAA" +"00,000",,"aaaaaaaaaa@aaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000A0A","AAAA" +"00,000",,"aaaaaaa_a@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000A0A","AAAA" +"00,000",,"aaaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000A0A","AAAA" +"00,000",,"Aaaaaaa.Aaaaaaaaa@aaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000A0A","AAAA" +"000,000",,"aaaaaaa_aaaaaa_000@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA00AA0A","AAAA" +"000,000",,"aaaaa.aaaaaa@aaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA00A00A","AAAA" +"000,000","00,000","aaaa00a0aaa@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000000","AAAAAAAA" +"000,000",,"aaaaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA000000","AAAA" +"000,000",,"aaaaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000000A","AAAA" +"000,000","00,000","Aaaaaa.Aaaaaaaa@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00A000","AAAAAAAA" +"000,000","000,000","Aaaaaaa0000@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000000A","AAAAAAAA" +"00,000",,"aaaaaaa00@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000000A","AAAA" +"00,000","00,000","aaaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A000A00","AAAAAAAA" +"00,000",,"aaaaaaaa@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000AA0A","AAAA" +"000,000",,"aaaaaaa_aaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA00AA0A","AAAA" +"00,000","00,000","aaaaaaa@aaaa.aa",00/00/0000 00:00:00AA,"0,000.00","AAAAA000A00","AAAAAAAA AAA AAAAAAA" +"000,000",,"aaaaaaaaaaaaaa@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000A00A","AAAA" +"00,000","00,000","aaaaaa.aaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000A00A","AAAAAAAA" +"000,000",,"aaaaa00@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000A00","AAAA" +"00,000","000,000","aaa000@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00000A","AAAAAAAA" +"000,000",,"Aaaaaaa.A.Aaaa@aaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000000A","AAAA" +"00,000","00,000","AaaaaaaAaaaaaaa000@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00000A","AAAAAAAA" +"00,000","00,000","a.aaaaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00000A","AAAAAAAA AAA AAAAAAA" +"00,000",,"AAAAAAAAAAAA@AAA.AAA",00/00/0000 00:00:00AA,"0,000.00","AAA0A00000A","AAAA" +"00,000",,"aaaaa000@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00000A","AAAA" +"00,000",,"aaaaaaa000@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00000A","AAAA" +"00,000","000,000","aaaaaaaa.aaaaaa@aaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00000A","AAAAAAAA" +"00,000",,"aaaaaaaa@aaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00000A","AAAA" +"00,000",,"AAAAAAAAAA@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00000A","AAAA" +"00,000",,"aaaaaaaaaaa@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00000A","AAAA" +"00,000",,"AAaaaa@aaaaaaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00000A","AAAA" +"00,000",,"aaaa00@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00000A","AAAA" +"00,000",,"aaaaaa00@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00000A","AAAA" +"00,000",,"Aaaaaa@aaaaa-aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00000A","AAAA" +"00,000",,"AAAAAAAAAAAAAAA@AAAAAAAAA.AAA",00/00/0000 00:00:00AA,"0,000.00","AAA0A00000A","AAAA" +"00,000",,"aaa000@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00000A","AAAA" +"000,000",,"aaaaaaaaa@aaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000000","AAAA" +"000,000",,"aaaaaaaaaa@aaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000000","AAAA" +"00,000",,"aaaaa.a.aaaaa@aaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A0AAA00","AAAA" +"00,000",,"Aaaaaaa.Aaaaaaaa@aaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A0AAA00","AAAA" +"00,000","000,000","Aaaaaa.Aaaaaaaa@aaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A0AAA00","AAAAAA AAAA AAAAA" +"000,000","000,000","aaaaaaaaaaa000@aaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA00AA0A0","AAAAAAAA" +"00,000",,"Aaaaa00000@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A000A0A","AAAA" +"00,000","00,000","aaaaaaaaa@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA000A0A","AAAAAAAA" +"000,000","00,000","aaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000A00","AAAAAAAA" +"000,000",,"aaaaaaa@aaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000000A","AAAA" +"00,000",,"aaaaaaa@aaaaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA00A00AA","AAAA" +"000,000","000,000","Aaaaaa0@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00AA0A","AAAAAAAA AAA AAAAAAA" +"00,000","0,000","aaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000AA00","AAAAAAAA" +"000,000","000,000","aaaaaaaaa@aaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A000000","AAAAAAAA AAA AAAAAAA" +"000,000",,"aaaaaa.aaaaaaaaa@aaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA00A0000","AAAA" +"000,000",,"aaaaa.aaaaaaaa@aaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA00A0000","AAAA" +"000,000","000,000","aaaaaaa.aaaaa@aaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA00A0000","AAAAAAAA" +"000,000",,"aaaaaa.aaaaaa@aaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA00A0000","AAAA" +"000,000",,"aaaaaaa.aaaaa@aaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA00A0000","AAAA" +"000,000",,"Aaaaaaa@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA00A0000","AAAA" +"000,000",,"Aaaaaa_0@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA00A0000","AAAA" +"000,000",,"aaaaaaa@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA00A0000","AAAA" +"000,000",,"aaaaaaa@aaaaaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA00A0000","AAAA" +"000,000",,"aaaaaa00@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA00A0000","AAAA" +"00,000","000,000","aaaaa_aaaaaa00@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000A00","AAAAAAAA" +"00,000",,"aaaaaaa@aaa.aa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000A00","AAAA" +"00,000",,"aaaaaaaa@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA00AA00","AAAA" +"000,000",,"aaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA00A0000","AAAA" +"000,000",,"aaaaaaaa.aaaaaaa@aaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA00A0000","AAAA" +"000,000",,"aaaaaaa.aaaaaa@aaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA00A0000","AAAA" +"0,000",,"Aaaa000@aaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000A00","AAAA" +"0,000",,"Aaaaaaa_aaaaaa@aaaa.aaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000A00","AAAA" +"00,000",,"Aaaaaaa@aaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00A00A","AAAA" +"00,000",,"aaaaaaa_aaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000A00","AAAA" +"00,000",,"aaaaaaaaaaa@aaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000A00","AAAA" +"000,000",,"a.aaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA00AAA00","AAAA" +"00,000",,"aaaa@aaaaaa.aa",00/00/0000 0:00:00AA,"0,000.00","AAA0000A00A","AAAA" +"000,000",,"aaaaaa@aaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000A0A","AAAA" +"000,000",,"aaaa@aaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000A0A","AAAA" +"000,000",,"aaaa.Aaaaaaaaaaaa@aaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000000","AAAA" +"000,000","000,000","aaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000A00","AAAAAAAA" +"0,000",,"aaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000000","AAAA" +"000,000",,"aaaaaa0000@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000A0A","AAAA" +"000,000",,"aaaaaaaaa.aaaaaa@aaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaa.a.aaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAA" +"000,000",,"aaaaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAA" +"00,000","00,000","aaaaaaaa@aaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000AA00","AAAAAAAA" +"00,000",,"aaaaaaaa.aaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000AA00","AAAA" +"00,000",,"aaaaaa.aaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000AA00","AAAA" +"00,000","000,000","aaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000AA00","AAAAAAAA" +"00,000","000,000","aaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000AA00","AAAAAAAA" +"00,000",,"aaaa@aaaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000A00","AAAA" +"000,000",,"aaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000000","AAAA" +"00,000",,"aaaaaaa00@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000A0A","AAAA" +"00,000",,"aaaaaaaaaa_0000@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAA" +"00,000",,"aaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000A000","AAAA" +"00,000",,"aaaaa000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000A000","AAAA" +"00,000","0,000","aaaaaaaa00@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAAAAAA AAA AAAAAAA" +"0,000","000,000","aaaaaaa000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAAAAAA" +"0,000","000,000","aaaaa00@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAAAAAA" +"0,000","000,000","aaaaa_a@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAAAAAA" +"0,000",,"aaaaaa_aaaa00@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"0,000",,"aaaaaaaaaaaaa_00@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"0,000","00,000","aaaaaaa_aaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAAAAAA" +"0,000",,"aaaa.aaaa00@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"00,000",,"aaaaaaaaaaa@aaaaa.aaa.aa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAA" +"000,000",,"aaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000000","AAAA" +"000,000","00,000","aaaaa@aaaaaaaa.aa",00/00/0000 00:00:00AA,"0,000.00","AAA0A000A00","AAAAAAAA" +"00,000","00,000","aaaaa_aaaaaa@aaa.aa",00/00/0000 00:00:00AA,"0,000.00","AAAAA000000","AAAAAAAA" +"00,000","000,000","aaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA000000","AAAAAAAA" +"00,000",,"aaaaa_aaaaaa@aaa.aa",00/00/0000 00:00:00AA,"0,000.00","AAAAA000000","AAAA" +"000,000","00,000","aaaaaaaaaaaaaaaa00@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA000A0A00","AAAAAAAA" +"000,000","00,000","aaaaa_aaaaaa@aaa.aa",00/00/0000 00:00:00AA,"0,000.00","AAA0000A000","AAAAAA AAAA AAAAA" +"00,000",,"Aaaaaaaaaaa@aaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA000A0A0A","AAAA" +"00,000","00,000","Aaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA0A","AAAAAAAA" +"0,000","000,000","aaa0000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000A00A","AAAAAAAA AAA AAAAAAA" +"000,000",,"aaa000@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAA" +"000,000","00,000","aaaaaaa_00@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAAAAAA" +"000,000",,"aaaaaaaaaaaaaa@aaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00A00A","AAAA" +"000,000","000,000","aaaaaa.aaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000A00","AAAAAAAA" +"000,000",,"aaaa_aaaaaa_000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000A00","AAAA" +"000,000",,"aaaaaaa@aaaaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000A00","AAAA" +"000,000",,"aaaaaaaaaaa00@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000A00","AAAA" +"00,000",,"aaaaaa@aaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000A00","AAAA" +"000,000","000,000","aaaaaaaaaa000@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000AA00","AAAAAAAA" +"000,000","000,000","aaaaaaaa.aaaaa@aaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000AA00","AAAAAAAA" +"000,000","000,000","aaaaaaaaaaa000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAAAAAA AAA AAAAAAA" +"000,000",,"aaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA00AA00","AAAA" +"000,000",,"aaaaaaaa@aaaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000AAA0A","AAAA" +"000,000",,"aaaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaaaaa000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A0A0A0A","AAAA" +"00,000","0,000","aaa@aaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00000A","AAAAAAAA" +"000,000",,"aaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A000A0A","AAAA" +"000,000",,"aaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000A00","AAAA" +"00,000",,"aaaaaaaaa00@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00AA0A","AAAA" +"00,000",,"aaaaaa_0000@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00AA0A","AAAA" +"00,000",,"000000000@aa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000000","AAAA" +"00,000","00,000","aaaaaaaaa@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA00000A","AAAAAAAA" +"00,000",,"a.aaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000000","AAAA" +"00,000","000,000","aaaaaaaa00@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA0A00A0","AAAAAAAA" +"00,000",,"aaaaaaaaa000@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA000AA00A","AAAA" +"000,000",,"aaaaaaaa@aaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00A00A","AAAA" +"0,000",,"aaaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000A0A","AAAA" +"00,000",,"aaaaa.aaaa@aaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA00A00A0","AAAA" +"000,000",,"aaaaaa.aaaaa@aaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A0AA000","AAAA" +"000,000","00,000","aaaa.aaa.00@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA000A0A0A","AAAAAAAA" +"00,000",,"aaaaaaa00@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000000A","AAAA" +"00,000",,"aaaa.aaaaaaa@aaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA0A00A0","AAAA" +"000,000",,"Aaaaaaaa0@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA00AA00","AAAA" +"00,000",,"aaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00A000","AAAA" +"00,000","0,000","aaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00A000","AAAAAAAA" +"00,000","000,000","aaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00A000","AAAAAAAA AAA AAAAAAA" +"00,000",,"aaaaaa00@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaaaaa@aaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA00AA0A0","AAAA" +"0,000","000,000","aaaaaa.aaaaaaaa@aaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A0A000A","AAAAAAAA" +"000,000",,"aaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000A000","AAAA" +"000,000","00,000","aaaaaaaa@aaaaa.aa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000A00","AAAAAAAA" +"00,000",,"aaaa-aaaa.aaaa@aaaaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A0AA0AA","AAAA" +"00,000","0,000","aaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA000000","AAAAAAAA" +"00,000",,"aaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA000000","AAAA" +"00,000",,"aaaaaaaaa@aaaaaaaaaaaaaa.aa",00/00/0000 00:00:00AA,"0,000.00","AAA0A000A00","AAAA" +"00,000","000,000","aaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000A000","AAAAAAAA" +"00,000",,"aaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA00A0AAA","AAAA" +"000,000",,"aaaaaaa@aaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000AA00","AAAA" +"00,000","000,000","aaaaaa.aaaaaa@aa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000000A","AAAAAAAA" +"00,000",,"aaaa.aaaaaaa@aa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000000A","AAAA" +"00,000",,"Aaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000000A","AAAA" +"00,000",,"aaaaaaa.aaaaaaaa@aa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000000A","AAAA" +"000,000","000,000","aaaaaa.aaaaaa@aaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000000A","AAAAAAAA" +"000,000",,"aaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA00AA00","AAAA" +"00,000","00,000","aaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA00A000","AAAAAAAA AAA AAAAAAA" +"00,000",,"aaaaa@aaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAA" +"000,000",,"Aaaaaaaa.A.Aaaaaaa@aaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000000A","AAAA" +"000,000",,"Aaaaaaa.A.Aaaa@aaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000000A","AAAA" +"0,000",,"aa_aaa00@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000A00A","AAAA" +"00,000","00,000","aaaaaaa.aaaaaa@aa.aa.aa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000000","AAAAAAAA" +"00,000",,"aaaaaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000000","AAAA" +"00,000",,"aaaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000000","AAAA" +"00,000",,"aaaaaaaaaaaa@aaaaa.aa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000000","AAAA" +"000,000",,"aaa_aaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000A00A0","AAAA" +"000,000",,"aaaaaa.aaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000A0A0A","AAAA" +"00,000","000,000","aaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAAAAAA" +"00,000","000,000","aaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA00A000","AAAAAAAA AAA AAAAAAA" +"00,000","00,000","aaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA00A000","AAAAAAAA AAA AAAAAAA" +"000,000",,"aaaaaaaa@aaaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000AAA0A","AAAA" +"000,000",,"aaaa.00@aaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000A0A","AAAA" +"00,000",,"aaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000A000","AAAA" +"000,000",,"aaa.aaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000AA00","AAAA" +"000,000",,"aaaaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000000","AAAA" +"00,000",,"aaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000A000","AAAA" +"000,000",,"a_aaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaa0aaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aa0aa_aaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaaaa_aaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaaaaa@aaaa.aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000","0,000","aaaaaaa000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAAAAAA" +"000,000",,"aaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaa00@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaaaaaaaaa00@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaa00a@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaa_00000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaaaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaa0000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaa000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aa_aaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaa_aaaaaa00@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaaa00@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaa_aaaaaa0000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaa00@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaa00@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"00,000","00,000","aaaaaa@aaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000A00","AAAAAAAA" +"00,000","000,000","aaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000A00","AAAAAAAA" +"00,000",,"aaaaa_aaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000A00A","AAAA" +"00,000","000,000","aaaaa_aaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAAAAAA" +"000,000","000,000","aaaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000000","AAAAAAAA" +"00,000",,"aaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A000A0A","AAAA" +"000,000","000,000","aaaaaaaa000@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000000","AAAAAA AAAA AAAAA" +"000,000","000,000","aaaaaaa@aaa.aa.aa",00/00/0000 00:00:00AA,"0,000.00","AAA00000000","AAAAAAAA" +"000,000",,"aaaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000AA00","AAAA" +"000,000",,"aaaaaaa@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000000","AAAA" +"000,000",,"aaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00AA00","AAAA" +"000,000","00,000","aaaaa000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000A00A","AAAAAAAA" +"00,000",,"Aaaaaa.Aaaaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000A0A00","AAAA" +"000,000",,"aaa.aaa000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAA" +"00,000",,"aaaaaaaaa@aaaaa.aa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000A0A","AAAA" +"000,000",,"aaa.aaaaaaa.0000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAA" +"000,000",,"aaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA00000A","AAAA" +"0,000",,"aaaaa00@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000A0A","AAAA" +"0,000",,"aaaaaa@aaa.aa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000A0A","AAAA" +"000,000","000,000","aaa00@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000A0A","AAAAAAAA" +"00,000",,"aaaaaaaaaaaaa@aaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000A0A00","AAAA" +"00,000",,"aaaaaaaaaaaaaa@aaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000A0A00","AAAA" +"00,000",,"aaaaaaa00@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"0,000","000,000","aaaaaa@aaaaaa.aaa.aa",00/00/0000 00:00:00AA,"0,000.00","AAA00000000","AAAAAAAA AAA AAAAAAA" +"000,000",,"aaaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000A00","AAAA" +"000,000",,"aaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000A00A","AAAA" +"000,000",,"aaaaaaaaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000A00A","AAAA" +"000,000",,"aaaaaaa000000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000A00A","AAAA" +"00,000",,"aaaaa_aaa0000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA00A0000","AAAA" +"00,000",,"a.aaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000000","AAAA" +"000,000",,"aaaaaaa000@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000A00","AAAA" +"000,000","00,000","aaaaaa0@aaaaaaaa.aa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000000","AAAAAAAA" +"000,000","000,000","aaaaaaaa@000aaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000A00","AAAAAAAA" +"000,000",,"aaaaaaaaaaa00@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000A00","AAAA" +"000,000",,"aaaaaaaa00@aaaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000A00","AAAA" +"000,000","00,000","aaa0000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000000","AAAAAAAA" +"000,000","00,000","aaaaaaaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000000","AAAAAAAA" +"000,000",,"aaaaa.a00@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00A00A","AAAA" +"00,000",,"aaaaaaaaa0000@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000000","AAAA" +"00,000","000,000","aaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000A000","AAAAAAAA" +"000,000",,"aaaaa000@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000A00","AAAA" +"000,000",,"aaaaaaaa00@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000A00","AAAA" +"000,000",,"aaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000A00","AAAA" +"000,000",,"aaaaaaaaaaaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00000A","AAAA" +"00,000",,"aaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAA" +"000,000",,"Aaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA0AAA0A","AAAA" +"000,000","00,000","aaaaaaaaaaaa@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA00A000","AAAAAAAA" +"000,000",,"aaaaaaa0@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A000000","AAAA" +"000,000","000,000","aaaaaaaaaa@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00000A","AAAAAAAA" +"00,000","00,000","aaaaaaaaaa000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000AA00","AAAAAAAA AAA AAAAAAA" +"0,000",,"AAAAAA0000@AAA.AAA",00/00/0000 0:00:00AA,"0,000.00","AAA0A000A00","AAAA" +"000,000",,"aaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000000","AAAA" +"000,000",,"aaaaaaaaaaaaaa@aaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000000","AAAA" +"000,000",,"aaaaaaaa@aaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000000","AAAA" +"000,000",,"aaa.aaaa00000@aaaaa.aa.aa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000000","AAAA" +"000,000",,"aaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00A00A","AAAA" +"000,000",,"aaaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00A00A","AAAA" +"000,000",,"aaa.aaaaaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00A00A","AAAA" +"000,000","000,000","aaaaa00@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000000","AAAAAAAA" +"000,000",,"aaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000000","AAAA" +"000,000",,"aaaaaaaa.aaaa@Aaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000A00","AAAA" +"000,000",,"aaaaaaa.aaaaaaaaa@Aaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000A00","AAAA" +"000,000","000,000","aaaaaaaa000@Aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000A00","AAAAAAAA" +"000,000",,"aaa000@aaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000A00","AAAA" +"00,000",,"aaaaaaaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAA" +"0,000","000,000","aaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A0A000A","AAAAAAAA" +"000,000","000,000","aaaa.aaaaaaa@aaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000000","AAAAAAAA AAA AAAAAAA" +"000,000",,"aaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaa@aaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaaaaaa00@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaaa00@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaaaaaa.aaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000","00,000","aaaaaaaa@aaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAAAAAA" +"000,000",,"aaaaaa0000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaaaaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaaaa@aaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaa00@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaa000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaa0@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"a_aaaaa00@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaaa0@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaaaa000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaa.aaaaaaaa@aaaaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaaaaaaaaa000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaaaaa@aaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaa00@aaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaaa_aaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaaaaaa0@aaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaaaaaaaa00@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaaa@aaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaa0@aaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaaaaaaa00@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaa.aaaaaaa@aaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaa.aaaaaa@aaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaaa@aaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaaaaaaaaaaaa@aaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaa_aaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaa0000@aaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaaaaa0000@aaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaa00@aaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaaaa00@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaa.aaaaaa00@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaaaaaa00@aaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaaa@aaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaa.aaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaaaaaa0000@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaaaa.aaaaaaaa@aaaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaaaaaa@aaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaa0000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaa00@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"a_aaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaaa.aaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaa0000@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaaaaaaa@aaaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaaa00000@aaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaaaaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaaaa00@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"a0000@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaa00@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaaa.aaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaaa0000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaa@aaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000","00,000","aaaaa_a00@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA00000A","AAAAAAAA" +"00,000","00,000","aaaaaaaaaaaaa@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A0A0000","AAAAAAAA AAA AAAAAAA" +"000,000","000,000","aaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000000","AAAAAAAA" +"000,000",,"aaaaaaaaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA0A","AAAA" +"000,000",,"aaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000A0A","AAAA" +"000,000",,"aaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000A0A","AAAA" +"00,000",,"aaaa00@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00A000","AAAA" +"00,000","00,000","aaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000000","AAAAAAAA" +"000,000","00,000","aaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAAAAAA" +"000,000",,"aaaaaaa00@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"00,000",,"aaaaaaaa00@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000A0A","AAAA" +"00,000","000,000","aaaaaa0000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00AA00","AAAAAA AAAA AAAAA" +"00,000",,"aaaaaaa0000@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A0AA000","AAAA" +"00,000",,"aaaaaaaaa00@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A0AA000","AAAA" +"00,000","000,000","aaaaa0000@aaaa.aa",00/00/0000 00:00:00AA,"0,000.00","AAA0A0AA000","AAAAAAAA" +"00,000",,"aaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A0AA000","AAAA" +"000,000",,"aaaaaaaaaa00@aaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000A000","AAAA" +"000,000","00,000","aaaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000AA00","AAAAAAAA" +"000,000",,"aaaaaa-a@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00A000","AAAA" +"000,000",,"aaaaaaa000@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000AA00","AAAA" +"000,000","000,000","aaaaaa0000@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000A000","AAAAAAAA" +"00,000",,"aaaa.aaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA00000A","AAAA" +"000,000",,"aaaaaaaaaaaa0@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA000A00","AAAA" +"000,000","00,000","aaaaaa.aaaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000A000","AAAAAAAA" +"000,000",,"aaaaaaaa.aaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000A00","AAAA" +"000,000",,"aaaaa@aaaaaaaaaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000A00","AAAA" +"000,000","00,000","aaaaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000A00","AAAAAAAA" +"000,000",,"aaaaa@aaaaaaaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000A00","AAAA" +"000,000",,"aaaaaaaaaa.aaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000A00","AAAA" +"000,000",,"aaa0000@aaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000A00","AAAA" +"000,000",,"aaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000A00","AAAA" +"000,000",,"aaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000A00","AAAA" +"000,000",,"aaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000A00","AAAA" +"000,000",,"aaaaaa.a.aaaaa@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000A00","AAAA" +"000,000",,"aaaaa0000@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000A00","AAAA" +"000,000",,"aaaaaa@aaaa.a00.aa.aa",00/00/0000 00:00:00AA,"0,000.00","AAA00000A00","AAAA" +"000,000",,"aaaaaaa00@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000A00","AAAA" +"000,000","000,000","aaaaaaaa0@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000A00","AAAAAAAA" +"000,000","000,000","aaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000A00","AAAAAAAA" +"000,000",,"aaa.aaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000A00","AAAA" +"000,000",,"aa-aaaaa@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000A00","AAAA" +"000,000",,"aaaaaaaa@aa.aaaaaaaaa.aa.aa",00/00/0000 00:00:00AA,"0,000.00","AAA00000A00","AAAA" +"00,000","0,000","aaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000AA00","AAAAAAAA" +"000,000",,"aaaaaaa00@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA000A00","AAAA" +"000,000",,"aaaaaaa0@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA000000","AAAA" +"000,000",,"aaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA000000","AAAA" +"00,000","00,000","aaaa.aaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00000A","AAAAAAAA AAA AAAAAAA" +"000,000",,"aaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA000000","AAAA" +"000,000",,"aaaaaaaa0000@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA000000","AAAA" +"000,000",,"aaaaaaa0aaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA000000","AAAA" +"000,000",,"aaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA000000","AAAA" +"000,000",,"aaaaaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA000000","AAAA" +"000,000",,"aaaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA000000","AAAA" +"000,000",,"aaaaa_aa000@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA000000","AAAA" +"000,000",,"aaaaaaaa0000@aaaaa.aa",00/00/0000 00:00:00AA,"0,000.00","AAAAA000000","AAAA" +"000,000",,"aaaaaaaa0000@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA000000","AAAA" +"000,000",,"aaaaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA000000","AAAA" +"000,000",,"aaaaaaaaaa00@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA000000","AAAA" +"000,000",,"aaaaaaaa00@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA000000","AAAA" +"000,000",,"aaaaaaaaaaaaa@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA000000","AAAA" +"000,000",,"aaaaaaa00@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA000000","AAAA" +"000,000",,"aaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA000000","AAAA" +"000,000",,"aaaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA000000","AAAA" +"000,000",,"aaaaaa.aaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA000000","AAAA" +"000,000",,"aaaaaaa_aaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA000000","AAAA" +"000,000",,"aaaaaaaaaaaaaa@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA000000","AAAA" +"000,000",,"aaaa@aaaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA000000","AAAA" +"000,000",,"aaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA000000","AAAA" +"000,000",,"aaaaaaaaaaa00@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA000000","AAAA" +"000,000",,"aaaaaa_aaaaa_aaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA000000","AAAA" +"000,000",,"aaaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA000000","AAAA" +"000,000",,"aaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA000000","AAAA" +"000,000",,"aaaaaa.aaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA000000","AAAA" +"000,000",,"aaaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA000000","AAAA" +"000,000",,"aaa0000@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA000000","AAAA" +"000,000",,"aaaaaaa0000@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA000000","AAAA" +"000,000",,"aaaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA000000","AAAA" +"000,000",,"aaa.aaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA000000","AAAA" +"000,000","00,000","aaaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA000000","AAAAAAAA" +"000,000",,"aaaaaaaaaaa0@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA000000","AAAA" +"000,000",,"aaaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA000000","AAAA" +"000,000",,"aaaaaaaaa@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA000000","AAAA" +"000,000",,"aaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA000000","AAAA" +"000,000",,"aaaaaaa@aaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA000000","AAAA" +"000,000",,"aaaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA000000","AAAA" +"000,000",,"aaaaa_aaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA000000","AAAA" +"000,000",,"aaaaaaaaaa0@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA000000","AAAA" +"000,000",,"aaaaaaa@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA000000","AAAA" +"000,000",,"aaaa_aaa_00@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA000000","AAAA" +"000,000",,"aaaaaaaaaaaaa0000@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA000000","AAAA" +"000,000",,"aaaaaaaa@aaaaaaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA000000","AAAA" +"000,000",,"aaaaaaaa.aaaaaaa@aaaaaaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA000000","AAAA" +"000,000",,"aaaaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA000000","AAAA" +"000,000",,"aaaaaaaaaa@aaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA000000","AAAA" +"000,000",,"aaaaaaaaaaaa@aaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA000000","AAAA" +"000,000",,"aaaaaa00000@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA000000","AAAA" +"000,000",,"aaaaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA000000","AAAA" +"000,000",,"aaaaaaaa@aaaaaaaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA000000","AAAA" +"000,000",,"aaaa0000@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA000000","AAAA" +"000,000",,"aaaaaaaa00@aaaaa.aa.aa",00/00/0000 00:00:00AA,"0,000.00","AAAAA000000","AAAA" +"000,000",,"aaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA000000","AAAA" +"000,000",,"aaaaaaaa0000@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA000000","AAAA" +"000,000",,"aaaaaa@aaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA000000","AAAA" +"000,000",,"aaaaaaaaaaaa00@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA000000","AAAA" +"000,000","000,000","aaaaa.aaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA000000","AAAAAAAA" +"000,000",,"aaaaaa0000@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA000000","AAAA" +"000,000",,"aaaaaaa00@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA000000","AAAA" +"000,000",,"aaaaaaa00@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA000000","AAAA" +"000,000",,"aaaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA000000","AAAA" +"000,000",,"aaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA000000","AAAA" +"000,000",,"aaaaaa_aaa_00@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA000000","AAAA" +"000,000",,"aaaaaaaa@aa000.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA000000","AAAA" +"000,000",,"aaaaaa@aaaaa-a.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000000","AAAA" +"000,000",,"aaaaaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000000","AAAA" +"000,000",,"aaaaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000000","AAAA" +"000,000",,"aaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000000","AAAA" +"00,000",,"Aaaaaaaa.aaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000000","AAAA" +"000,000","00,000","Aaaaaaaaa@aaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000A00","AAAAAAAA" +"000,000",,"aaaaaaaaaaaa@aaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000A00","AAAA" +"000,000",,"aaaaaaaaaa@aaaaaaa.aaa.aaa.aa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000A00","AAAA" +"000,000",,"aaaaaa@aaaaaaa.aaa.aaa.aa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000A00","AAAA" +"000,000","000,000","AAAAAA@AAAAA.AAA",00/00/0000 0:00:00AA,"0,000.00","AAAA000000A","AAAAAAAA" +"00,000","00,000","aaaaaaaaa00@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAAAAAA" +"000,000","00,000","aaaaaaaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAAAAAA AAA AAAAAAA" +"00,000","00,000","aaaaaaaaaa@aaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00A000","AAAAAAAA" +"000,000",,"aaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAA" +"00,000","00,000","aaaaaa0@aa.aa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000A00","AAAAAAAA" +"000,000","00,000","aaaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00A000","AAAAAAAA" +"000,000",,"aaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAA" +"00,000",,"aaaaaaaa00@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000A00","AAAA" +"00,000","000,000","aaaaaaaaaaa00@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000A00","AAAAAAAA" +"000,000","000,000","aaaaa@a0aaaaaa.aa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000000","AAAAAAAA" +"000,000","000,000","aaaaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000000","AAAAAA AAAA AAAAA" +"000,000","000,000","aaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000A0A","AAAAAA AAAA AAAAA" +"000,000","000,000","aaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000A0A","AAAAAA AAAA AAAAA" +"000,000","000,000","aaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000A00A","AAAAAAAA" +"000,000","00,000","aaaaaaaa@aaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000A00","AAAAAAAA" +"000,000",,"aaaaaaaaaaaaaa00@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000A00","AAAA" +"00,000",,"aaaaaaaa0000@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"00,000",,"aaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000A000","AAAA" +"00,000",,"aaa.aaaaaaaa@aaa.aa.aa",00/00/0000 0:00:00AA,"0,000.00","AAA00000A00","AAAA" +"000,000","00,000","Aaaaaaa.Aaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA00AA00","AAAAAAAA" +"000,000",,"aaaa.aaaaaa@aaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000A0A","AAAA" +"000,000",,"aaaaaa@aaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000A0A","AAAA" +"0,000","000,000","aaaaaaaaa@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA000AAA0A","AAAAAAAA" +"00,000","000,000","aaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000A0A","AAAAAAAA" +"000,000",,"aaaaaaa0@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000A00","AAAA" +"000,000",,"a.aaaaa@aaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000A00","AAAA" +"000,000",,"Aaaa.Aaaaa@aaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000A00A","AAAA" +"00,000",,"aaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000A000","AAAA" +"000,000","00,000","aaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA0A00AA","AAAAAAAA" +"000,000",,"aaaaaaaaaa@aaaaaaaaaaa.aa.aa",00/00/0000 0:00:00AA,"0,000.00","AAAAA0A00AA","AAAA" +"000,000",,"aaaaaaaaaa_00@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA0A00AA","AAAA" +"000,000",,"aaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAA" +"00,000",,"Aaa.Aaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA00","AAAA" +"000,000","00,000","aaaaaaaaaaaa@aaaa.aa",00/00/0000 0:00:00AA,"0,000.00","AAA0000A000","AAAAAAAA" +"00,000","000,000","aaaaaaa_a@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00A00A","AAAAAAAA" +"00,000","000,000","aaaaaaa000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000A00","AAAAAAAA" +"000,000","00,000","aaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000000A","AAAAAAAA" +"000,000",,"aaaaaaaaa.aaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA0A00AA","AAAA" +"00,000",,"aaaaaaaaa0000@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000A000","AAAA" +"00,000","000,000","aaaaaaa.aaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000000","AAAAAAAA" +"00,000",,"aaaaaa@aaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000AA00","AAAA" +"000,000",,"aaaaaa.aaaaa@aaa-aa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA000A00A0","AAAA" +"000,000",,"aaaa_00@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000A000","AAAA" +"000,000",,"aaaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000A000","AAAA" +"00,000","00,000","aaaaaaa.aaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000A0A","AAAAAAAA" +"000,000","000,000","aaaaaaaaa@aaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000A000","AAAAAAAA" +"000,000",,"aaaaaa.aaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000A00","AAAA" +"000,000",,"aaaaaaaa.aaaaa@aaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000A000","AAAA" +"000,000",,"aaaaaa.aaaaaaaa@aaaaaaaaaaaaaaaa.aa",00/00/0000 00:00:00AA,"0,000.00","AAAA000A000","AAAA" +"000,000",,"aaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000A00","AAAA" +"000,000",,"aaaaaaaa.aaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000A00","AAAA" +"00,000",,"aaaaaaa0@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000000A","AAAA" +"00,000",,"aaaaaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaaaa0@aaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA000AA0A0","AAAA" +"000,000",,"aaaaaaaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000A00","AAAA" +"000,000","00,000","AAaaaaaaaa@aaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000000","AAAAAAAA" +"000,000",,"aaaaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000A00","AAAA" +"000,000",,"aaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000A00","AAAA" +"000,000",,"aaa.aaaa@aaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000000","AAAA" +"00,000",,"aaaaaaa@aaaaaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000AA00","AAAA" +"00,000","000,000","aaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A000A0A","AAAAAAAA" +"000,000",,"aaaaaaa000@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA00000A","AAAA" +"00,000",,"aaaaaaa.aaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00000A","AAAA" +"00,000","000,000","aaaaaaaaa@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00A000","AAAAAAAA" +"0,000",,"aaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA000000","AAAA" +"0,000",,"aaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA000000","AAAA" +"000,000","000,000","aaa_aaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000000","AAAAAAAA AAA AAAAAAA" +"00,000","00,000","aaaaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000000","AAAAAAAA" +"00,000",,"aaaaaa.aaaaaa@aa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA00A000","AAAA" +"000,000",,"aaaaaa.aaaaaaa@aa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA000A00","AAAA" +"000,000",,"aaaaaaaa@aaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000A00","AAAA" +"00,000","000,000","aaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000A000","AAAAAAAA" +"000,000",,"aaaaa0aaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000A000","AAAA" +"000,000",,"aaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000A000","AAAA" +"000,000","000,000","aaaaa0000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000AA00","AAAAAAAA" +"000,000",,"aaaaa.aaaaaaa@aaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000000","AAAA" +"000,000",,"aaaaaaa.aaaaaaaa@aaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000000","AAAA" +"000,000",,"aaaaaa.aaaaa@aaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000000","AAAA" +"0,000","000,000","aaaaaaaaaaa@aaaaaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAAAAAA" +"000,000",,"aaaaaaa.aaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000A00","AAAA" +"00,000",,"aaaa.a.aaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000AA00","AAAA" +"00,000","00,000","aaaaaaaa.a.aaaaa@aaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00AA0A","AAAAAAAA" +"000,000",,"aaaaaaa.00@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000A00","AAAA" +"00,000","000,000","aaaaaaa0@aaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00A000","AAAAAAAA" +"00,000",,"aaaaaaa000@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A0AA000","AAAA" +"000,000",,"aaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAA" +"00,000","000,000","aaaaaaaaaaaaa@aaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000A0A","AAAAAAAA AAA AAAAAAA" +"0,000",,"aaaaaaaaa.aaaaaaa.a000000@aaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000A00","AAAA" +"000,000",,"aaaaaaaaaa000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA00AA00","AAAA" +"00,000","000,000","aaaaaa_aaaa_aaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000000","AAAAAAAA AAA AAAAAAA" +"000,000",,"aaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00A000","AAAA" +"000,000",,"aaaaaaaaaaaa@aaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA00A0000","AAAA" +"00,000",,"aaaaaa.aaaaaa@aaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA00A00A","AAAA" +"000,000",,"aaaaaaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA00A0000","AAAA" +"000,000",,"aaaa000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA00A0000","AAAA" +"000,000",,"aaaaaaaaaaa@aaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA00A0000","AAAA" +"000,000",,"aaaaaaa_aaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA00A0000","AAAA" +"000,000",,"aaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA00A0000","AAAA" +"000,000",,"aaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA00A0000","AAAA" +"000,000","000,000","aaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA00A0000","AAAAAAAA" +"000,000",,"aaaaa_aaaaaaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA00A0000","AAAA" +"000,000",,"aaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA00A0000","AAAA" +"000,000",,"aaaaaaaa.aaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA00A0000","AAAA" +"00,000",,"aaaa.aaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000A000","AAAA" +"00,000",,"aaaaaaaaa@aaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00000A","AAAA" +"00,000",,"aaaaaa.aaaaa@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00000A","AAAA" +"00,000",,"aaaaaaaa@aaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000A00A","AAAA" +"000,000",,"aaaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000A00","AAAA" +"00,000","00,000","a_a_aaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000000","AAAAAAAA" +"00,000","000,000","aaaaaaaaaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000000","AAAAAAAA" +"000,000","00,000","aaaaaaaa.aaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000A0A00","AAAAAAAA AAA AAAAAAA" +"000,000",,"aaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000A0A","AAAA" +"00,000",,"aaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000000A","AAAA" +"00,000","000,000","AaAaaaa@aaaa-aaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000000A","AAAAAAAA" +"00,000",,"aaaa.aaaaaaa@aaaaaaaa.aaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000000A","AAAA" +"00,000",,"aaaaa@aaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000000A","AAAA" +"000,000","000,000","aaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000A0A","AAAAAAAA" +"000,000",,"aaaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A0A0000","AAAA" +"000,000","00,000","aaaaaaaa000@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA000A00A0","AAAAAAAA" +"0,000","00,000","aaaaa.aa.aaaaaaa@aaaaaaaaaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA000A000A","AAAAAAAA" +"000,000","000,000","aaaaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A000A0A","AAAAAAAA" +"000,000","000,000","aaaa.aaaaaaa@aaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA000AA000","AAAAAAAA" +"000,000","00,000","aaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000000","AAAAAAAA" +"00,000",,"aaaaaaa@aaaaaa-aaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00000A","AAAA" +"00,000",,"aaaaaaaaaa00@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000000","AAAA" +"000,000","000,000","Aaaaaa.AaAaaaaa@aaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000A0A","AAAAAAAA" +"00,000",,"aaaa@aaaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00A000","AAAA" +"000,000",,"aaaaaaaaa00@aa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA00000A","AAAA" +"000,000","000,000","aaaaaaa@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A0A0AA0","AAAAAAAA AAA AAAAAAA" +"00,000",,"aaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A0AA000","AAAA" +"00,000",,"aaaa@aaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000AA00","AAAA" +"0,000",,"aaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000A00A","AAAA" +"000,000","00,000","aaaaaaaaaa@aa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA000AA000","AAAAAAAA" +"00,000","000,000","aaaaaaaa@aaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000A000","AAAAAAAA" +"000,000",,"AAAAA.AAAAAAA@AAA.AAA",00/00/0000 00:00:00AA,"0,000.00","AAA0A000000","AAAA" +"00,000",,"aaaaaaa@aaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00000A","AAAA" +"00,000","00,000","aaa.aaaaaaaa@aaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000AA00","AAAAAAAA" +"000,000",,"Aaaaaaa.Aaaaaaaaaaaa@aaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000000","AAAA" +"00,000",,"aaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000AA00","AAAA" +"00,000",,"aaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000AA00","AAAA" +"00,000",,"aaaa@aaaaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA00","AAAA" +"00,000",,"aaaaaaaaaaaaaaa@aaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000000","AAAA" +"00,000",,"aaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000000","AAAA" +"00,000",,"aaaaaaa.aaaaaaa@aaa.aa.aa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000000","AAAA" +"0,000","00,000","aaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000A000","AAAAAAAA" +"00,000","000,000","aaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA00","AAAAAA AAAA AAAAA" +"0,000",,"aaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000A00","AAAA" +"000,000","00,000","aaaaaaa@aaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00AA0A","AAAAAAAA" +"000,000",,"aaaaa@aaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00AA0A","AAAA" +"000,000","00,000","aaaaa000@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00AA0A","AAAAAAAA" +"000,000",,"aaaa0000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00A00A","AAAA" +"000,000","00,000","aaaaa0000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00A00A","AAAAAAAA" +"000,000",,"aaaaa_aaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA00AA0A","AAAA" +"00,000","000,000","aaaaa.aaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA00","AAAAAAAA" +"00,000",,"aaaaaaaa.a.aaaaaaaa@aaaa.aa",00/00/0000 0:00:00AA,"0,000.00","AAA0000AA0A","AAAA" +"000,000","00,000","aaaaaaaaaaaaaaa000@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000A00","AAAAAAAA" +"00,000","00,000","aaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAAAAAA" +"000,000",,"Aaaaaaaaaa00@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000000","AAAA" +"00,000","00,000","aaaaaa.aa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000AA0A","AAAAAAAA" +"00,000",,"aaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000A0A","AAAA" +"00,000",,"aaaaaaa.aaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000A000","AAAA" +"000,000",,"aaaaaaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000A00","AAAA" +"00,000",,"aaaaaaaaaaaaaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA00A000","AAAA" +"00,000","000,000","aaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000A0A","AAAAAAAA" +"00,000","000,000","aaaaaaa@aaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00A000","AAAAAA AAAA AAAAA" +"00,000","00,000","a.aaaaaa@aaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000A00A","AAAAAAAA" +"00,000",,"aaaaaaaa@aaaaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA00","AAAA" +"00,000",,"aaaaaaaa@aaaaaaaaa.aa",00/00/0000 0:00:00AA,"0,000.00","AAAA000A000","AAAA" +"000,000",,"a.aaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA00A000","AAAA" +"000,000",,"aaaaaaaaaaa.__@aaaaaaa.a",00/00/0000 0:00:00AA,"0,000.00","AAAAA00A000","AAAA" +"000,000",,"aaaaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA00A000","AAAA" +"000,000",,"AaaaAaaaa@aaa.aa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000000","AAAA" +"00,000",,"a@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000AA00","AAAA" +"000,000",,"aaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000000","AAAA" +"00,000",,"aaa.aaaaaaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000000","AAAA" +"00,000",,"aaaaaa00@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000000","AAAA" +"00,000",,"aaaaaaaa00@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000000","AAAA" +"00,000","00,000","aaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000000","AAAAAAAA" +"00,000",,"aaaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000000","AAAA" +"00,000",,"aaaaa_0@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000000","AAAA" +"00,000",,"aaaaaa000@aaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000000","AAAA" +"00,000",,"aaaaaaa@aaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000000","AAAA" +"00,000",,"aaaaaaa0000@aaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000000","AAAA" +"00,000",,"aaaaaaa0000@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000000","AAAA" +"00,000","00,000","aaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000000","AAAAAAAA" +"00,000",,"aaaa.aaaaaa@aaaaaa.aaaa.aa.aa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000000","AAAA" +"00,000",,"aaa.aaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000000","AAAA" +"00,000",,"aaaaaa_0000@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000000","AAAA" +"00,000",,"aaaa@aaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000000","AAAA" +"00,000",,"aaaaaaaaaa@aaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000000","AAAA" +"00,000","000,000","aaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000000","AAAAAAAA" +"00,000",,"aaaaa@aaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000000","AAAA" +"00,000",,"aaaaaa@aaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00A000","AAAA" +"00,000",,"aaaaaaaaa@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00A000","AAAA" +"00,000",,"aaaaaaaaaaaa@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00A000","AAAA" +"00,000","000,000","aaaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA00","AAAAAAAA" +"00,000",,"aaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000000","AAAA" +"00,000",,"aaaaaa000@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000A00","AAAA" +"00,000",,"aaaaaaaaa.aaaa@aa.aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA00000A","AAAA" +"00,000",,"aaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA00000A","AAAA" +"000,000",,"aaaaaa_aaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000A0A00","AAAA" +"00,000",,"aaaaaaaaaaaaaaa@aaaaaa.aa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00A000","AAAA" +"000,000","000,000","aaaaaaa.a.aaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA0AA0A0","AAAAAAAA" +"00,000",,"aaaa@aaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00A000","AAAA" +"000,000","00,000","aaaaa.aaaaaaaaa@aaa.aa",00/00/0000 0:00:00AA,"0,000.00","AAA00000A00","AAAAAAAA" +"000,000",,"aaaaaaa.aaaaaaaa@aaa.aa",00/00/0000 0:00:00AA,"0,000.00","AAA00000A00","AAAA" +"000,000",,"aaaaaa.aaaaaaaaa@aaa.aa",00/00/0000 0:00:00AA,"0,000.00","AAA00000A00","AAAA" +"00,000","00,000","aaaaaa@aaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA00","AAAAAAAA" +"00,000",,"aaaaaaa@aaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000AA00","AAAA" +"00,000",,"aaaaaaaaa@aaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000AA00","AAAA" +"000,000",,"aaaaa.aaaaaa@aaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000A000","AAAA" +"00,000","00,000","AaaaAaaA00@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000000A","AAAAAAAA" +"000,000",,"AAAAAA.AAAAAAAA@Aaaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA000000","AAAA" +"000,000",,"Aaaaaaa.aaaaaaaaa@aaaaaaaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00000A","AAAA" +"000,000",,"aaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA00A0000","AAAA" +"000,000",,"aaaaaa00@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA00A0000","AAAA" +"00,000","00,000","aaaaaa00@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000AA00","AAAAAAAA" +"000,000",,"aaaaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00A00A","AAAA" +"00,000",,"aaaaaaaaaa0000@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000000","AAAA" +"00,000",,"aaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA00AA0A","AAAA" +"00,000",,"aaaaaaaa.aaaaaaa.aaa0@aaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA0A00A0","AAAA" +"00,000",,"a.aaaa@aaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000AA0A","AAAA" +"00,000",,"aaaaaaaa00@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000000","AAAA" +"00,000","000,000","aaaaaaaa@aaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00A000","AAAAAAAA" +"00,000",,"aaaaaaaaaaaa00@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000000","AAAA" +"000,000",,"aaaaaaaaaaa00@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00A00A","AAAA" +"000,000",,"aaaaaaa000@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00A00A","AAAA" +"000,000",,"aaaaaaa.aaaaaaa@aa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A000000","AAAA" +"000,000",,"aaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A000000","AAAA" +"000,000","000,000","aaaaa.aaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00000A","AAAAAAAA" +"000,000",,"aaaaaaa@aaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA000000","AAAA" +"000,000",,"aaaaaaaaa@aaaaaaaa.a00.aa.aa",00/00/0000 00:00:00AA,"0,000.00","AAAAA000000","AAAA" +"00,000",,"aaaaaaa@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00A00A","AAAA" +"00,000","000,000","aaaaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000A00","AAAAAAAA" +"000,000",,"aaaaaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A000A0A","AAAA" +"000,000",,"aaaaaaaa0000@aaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000000A","AAAA" +"00,000",,"aaaaaa0000@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000A0A","AAAA" +"00,000","0,000","aaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000A0A","AAAAAAAA" +"000,000",,"aaaaaaaaaa@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00AA0A","AAAA" +"000,000",,"aaaaaa.aaaaaa@aaaaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00AA0A","AAAA" +"000,000",,"aaaaaa.aaa-aaaaaaa@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00AA0A","AAAA" +"000,000","000,000","aaa0000@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00AA00","AAAAAAAA AAA AAAAAAA" +"000,000",,"AAAAAAAAAA@AAAAA.AAA",00/00/0000 00:00:00AA,"0,000.00","AAA0A00AA00","AAAA" +"000,000",,"AAAAAAAAA000@AAA.AAA",00/00/0000 00:00:00AA,"0,000.00","AAA0A00AA00","AAAA" +"00,000","00,000","aaaaaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000000","AAAAAAAA" +"000,000",,"aaaaaa000@aaa.aaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000A00A","AAAA" +"000,000","000,000","aaaaa00@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A000A00","AAAAAA AAAA AAAAA" +"0,000",,"aaaaaa0000@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000A000","AAAA" +"0,000",,"aaaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000A000","AAAA" +"0,000",,"aaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000A000","AAAA" +"0,000",,"aaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000A000","AAAA" +"0,000",,"aaaaaaaaaa@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000A000","AAAA" +"00,000","000,000","aaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000AA00","AAAAAAAA" +"000,000","00,000","aaaaaaaa.aaaaaa@aaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000AA0A","AAAAAAAA" +"000,000",,"aaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A000A00","AAAA" +"0,000",,"aaaaaaaa@aaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000000A","AAAA" +"0,000","000,000","aaaa_aaaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000000A","AAAAAAAA" +"0,000","00,000","aaaaaaaaaaaaa@aaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A000A0A","AAAAAAAA" +"000,000",,"aaaaaaaa.a.aaaaaaa@aaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000A000","AAAA" +"00,000",,"Aaaaaa.Aaaaaaaa@aaaaaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"0,000",,"aaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA00000A","AAAA" +"000,000","000,000","aaaaaaa0@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000A0A","AAAAAAAA" +"00,000",,"aaaaaa@aaaaaaaaa.aa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000A00","AAAA" +"000,000",,"aaaaaa.aaaaaaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000000","AAAA" +"00,000","00,000","aaaaaaa00@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000000","AAAAAAAA" +"000,000",,"aaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000A0A","AAAA" +"00,000","000,000","aaaaaaaa@aaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000000","AAAAAAAA" +"000,000",,"a.aaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaaaa@aa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaa_aaaaaa@aaaa.aa",00/00/0000 0:00:00AA,"0,000.00","AAAAA00A000","AAAA" +"00,000",,"aaaaaaaaa0000@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000A00A","AAAA" +"000,000","00,000","aaaa0000@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000000A","AAAAAAAA" +"00,000",,"aaaa000@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000A0A","AAAA" +"00,000","00,000","aaaaa.aaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000A000","AAAAAAAA" +"000,000",,"aaaaaaaa.aaaaaaaaaaa@aaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"Aaaaaa.Aaaaaa@aaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaa.a.aaaaaa@aaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaa.a.aaaaaa@aaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaaaa.aaaaa@aaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaa.a.aaaaaa@aaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"AAAAAA.AAAAAAA@aaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaa.a.aaaaaaa@aaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"Aaaaaa.Aaaaaaaa@aaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaa@aaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaa0000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaaaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaa0@aaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaaaaa.aaaaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"a.aaaaa@aaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000","000,000","aaaaaaaaa.aaaaaaa@aaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAAAAAA" +"000,000",,"Aaaaaa000@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaa.aaaaaa@aaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaa@aaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaaaaa@aaaaa.aa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaa@Aaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaaaa_aaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaa00@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaa0000@aaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaa00@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaaa0@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaa000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00A000","AAAA" +"00,000",,"aaaaaaaaaaaa@aaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00AA00","AAAA" +"000,000",,"aaaaaaa.a.aaaaaa@aaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"AAAAAAAA@AAAAA.AAA",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaa00@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000A000","AAAA" +"00,000",,"aaaaaa.aaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000AA00","AAAA" +"00,000","00,000","aaaaaa0000@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA00AA00","AAAAAAAA" +"00,000","000,000","aaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA00A000","AAAAAAAA" +"00,000","000,000","aaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA00","AAAAAAAA" +"00,000","00,000","aaaa.aaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000A000","AAAAAAAA" +"00,000","00,000","aaaaaaaa_aaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA00A000","AAAAAAAA" +"000,000",,"aaaaaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000A000","AAAA" +"000,000",,"AAAAAA@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000000","AAAA" +"000,000",,"aaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000000","AAAA" +"000,000",,"aaaaaaaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000000","AAAA" +"00,000",,"aaaaaaaa@aaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00000A","AAAA" +"00,000",,"aaaaaaa000@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000000","AAAA" +"00,000",,"Aaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000A00","AAAA" +"000,000",,"AAAAAA0@AA.AA.AAA",00/00/0000 00:00:00AA,"0,000.00","AAA000AA000","AAAA" +"000,000","00,000","aaaaaa0@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000000A","AAAAAAAA" +"000,000",,"aaaaaaaaa00@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000A0A","AAAA" +"00,000",,"aaaaaaa.aaaaaaaaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000000","AAAA" +"00,000",,"aaaaaaaaa.aaaaaaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000000","AAAA" +"00,000",,"aaaaa.aaaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000000","AAAA" +"00,000",,"aaaaaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000A00A","AAAA" +"000,000",,"aaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000000","AAAA" +"00,000","00,000","aaaaaaaaa00@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000A00","AAAAAAAA" +"00,000",,"aaaaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000A00","AAAA" +"000,000","000,000","aaaa0000@000.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000A00","AAAAAAAA" +"00,000","00,000","aaaaaaaaa.a.aaaaaaa@aaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00AA0A","AAAAAAAA" +"000,000",,"aaaaaaaaaaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000000A","AAAA" +"00,000","000,000","aaaaaaa000@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA00AA0AA","AAAAAAAA" +"000,000",,"aaaaa_aaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000A0A","AAAA" +"000,000",,"aaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00A000","AAAA" +"00,000","0,000","aaa@aaaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000AA00","AAAAAAAA" +"000,000",,"aaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00A000","AAAA" +"00,000","000,000","aaaaa.aaaaaaa@aaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000000","AAAAAAAA" +"000,000","0,000","aaaaaa_000@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA00AA000","AAAAAAAA" +"000,000",,"aaaaaa00@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA00AA000","AAAA" +"000,000",,"aaaaaaaaaaa@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA00AA000","AAAA" +"000,000",,"aaaaaa0000@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA00AA000","AAAA" +"000,000",,"aaaaa0000@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA00AA000","AAAA" +"000,000","000,000","aaaaaaaa000@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA00AA000","AAAAAAAA" +"000,000",,"aaaaaaaa00@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA00AA000","AAAA" +"000,000","000,000","aaaaaa.aaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA00AA000","AAAAAAAA" +"000,000",,"aaaaaa@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA00AA000","AAAA" +"000,000",,"aaaaa_a@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA000000","AAAA" +"000,000","000,000","aaaaaa000@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA00AA00","AAAAAAAA" +"000,000","00,000","aaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA00AA00","AAAAAAAA" +"0,000",,"aaaaa.aaaaaaa@aaaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA00A00A0","AAAA" +"00,000","000,000","aaaaaaa.aaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000000A","AAAAAAAA" +"0,000",,"aaaaaaaa@aaa-aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000000A","AAAA" +"00,000","000,000","a.aaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000AA00","AAAAAAAA" +"00,000",,"aaaaaa@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A000000","AAAA" +"00,000",,"aaaaaa00000@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000AA00","AAAA" +"00,000",,"aaaaa.aaaaa@aaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA00000A","AAAA" +"00,000","00,000","aaaaaaa@aaaaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA00000A","AAAAAAAA AAA AAAAAAA" +"000,000",,"aaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00000A","AAAA" +"000,000",,"aaaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA00A000","AAAA" +"00,000",,"Aaaaaa.a.aaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000000","AAAA" +"000,000",,"aaaa.aaaaaaa00@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA00A0AA0","AAAA" +"0,000",,"aaaaaaa.aaaaaa@aaa.aa",00/00/0000 00:00:00AA,"0,000.00","AAA0A000000","AAAA" +"000,000","000,000","aaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000A00A","AAAAAAAA" +"0,000","000,000","aaaaaaa_aaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A000000","AAAAAAAA" +"00,000",,"aaaaaaaaaaaaaa@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA000A0A","AAAA" +"00,000",,"aaaaaaaaaaaa@aaaa.aa",00/00/0000 00:00:00AA,"0,000.00","AAAAA000000","AAAA" +"000,000","00,000","aaaaa.a.aaaaaaa@aaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000000A","AAAAAAAA" +"000,000",,"aaa0000@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000","0,000","aaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000A0A","AAAAAAAA" +"00,000",,"aaaaaaaaa@a0aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000AA00","AAAA" +"00,000","000,000","aaaaaaa000@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000000","AAAAAAAA" +"0,000","000,000","aaaaaaaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000000","AAAAAAAA" +"000,000",,"AAAAAAAAA@AAAAA.AAA",00/00/0000 00:00:00AA,"0,000.00","AAA00000A00","AAAA" +"000,000","00,000","aaaaaaaaaa0000@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00A00A","AAAAAAAA AAA AAAAAAA" +"000,000",,"aaaaaaaa_aaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00A00A","AAAA" +"000,000","00,000","aaaaaaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA000A0A00","AAAAAAAA" +"000,000","000,000","aaaaaa_aaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA000A00A0","AAAAAA AAAA AAAAA" +"0,000","00,000","aaaaaaa-aaa@aaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000A00","AAAAAAAA" +"0,000",,"aaaaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000A00","AAAA" +"000,000",,"aaaaaaaaaaaaa@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA00A0AA0","AAAA" +"00,000","00,000","aaaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000A0A","AAAAAAAA" +"00,000",,"aaaaaaaaa@aaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000A0A","AAAA" +"00,000","000,000","aaa00aaa@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00A000","AAAAAAAA" +"00,000",,"aaaaaaaaa@aaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000A0A","AAAA" +"000,000","00,000","aaaaaaaaaa00@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000A000","AAAAAAAA" +"00,000",,"aaaaaaaaa.a.aaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA000A00","AAAA" +"00,000",,"aaaaaaaa.a.aaaaaa@aaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA00A0000","AAAA" +"00,000","000,000","aaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00A000","AAAAAAAA AAA AAAAAAA" +"00,000","000,000","aaaaaaa0000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A0AAA0A","AAAAAAAA" +"00,000","00,000","aaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00A00A","AAAAAAAA AAA AAAAAAA" +"000,000",,"aaaaaaaaaaaa@aaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000000","AAAA" +"000,000",,"aaaaa0000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000AA00","AAAA" +"00,000","000,000","aaaaa.aaaaa0@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000A0A","AAAAAAAA AAA AAAAAAA" +"00,000","000,000","aaaa0aaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000A0A","AAAAAA AAAA AAAAA" +"000,000",,"aaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000A00","AAAA" +"000,000",,"aaaa.aaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000A00","AAAA" +"000,000",,"aaaaa.aaaaaa@aaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000000","AAAA" +"000,000",,"aaaaa@aaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000AAAA0","AAAA" +"000,000",,"aaaaaa@aaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000AAAA0","AAAA" +"000,000",,"aaaaaaaa0000@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000AAAA0","AAAA" +"00,000","000,000","aaaa000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00A000","AAAAAAAA" +"00,000",,"aaaaaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00A000","AAAA" +"00,000","00,000","aaaaaaa.aaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00A000","AAAAAAAA" +"00,000","00,000","aaaaa000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000A000","AAAAAAAA" +"000,000",,"aaaaaa_aaaaaa@aaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA00000A","AAAA" +"0,000",,"aaaaaaa000a@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000A000","AAAA" +"00,000","000,000","aaaaaaaaaaaaaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000000","AAAAAAAA" +"000,000",,"aaaaa_aaaa000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAA" +"00,000","00,000","aaaaaaaa@aaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAAAAAA" +"00,000","00,000","aaaaaa.aaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAAAAAA" +"000,000",,"aaaaaaaaa@aaaaaa-aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA00A00A","AAAA" +"000,000",,"aaaaaaaaaaaaa@aaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA00A00A","AAAA" +"000,000",,"Aaaaaaa.Aaaaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000A00","AAAA" +"00,000",,"aaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000","000,000","Aaaaaa.Aaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000A0A","AAAAAAAA" +"00,000",,"aaaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000A00","AAAA" +"000,000",,"aaaaa.aaaaaaaa@aaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000000","AAAA" +"000,000","000,000","aaaa0aaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00000A","AAAAAAAA" +"0,000",,"aaaaa.aaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000AAA00","AAAA" +"0,000",,"aaaaaaa.aa00@aaaa.aa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000A0A","AAAA" +"0,000","000,000","aaaaaaaaaaa@aaaaaaa.aa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000A0A","AAAAAAAA" +"0,000",,"aaaa@aaaaaaaaa.aa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000A0A","AAAA" +"0,000","00,000","aaa00@aaaaaaa.aa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000A0A","AAAAAAAA" +"0,000","000,000","aaaaaaaaaa@aaaa.aa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000A0A","AAAAAAAA" +"00,000","00,000","aaaaaa0000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000AA00","AAAAAAAA" +"000,000","000,000","aaaaaa.aaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A000000","AAAAAAAA" +"000,000","000,000","aaaa_aaaaa@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000A0A","AAAAAAAA" +"00,000",,"aaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000A00","AAAA" +"000,000",,"aaaaa_aaaaa00@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00AA00","AAAA" +"000,000",,"aaaaaaaaa00@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000A0A","AAAA" +"000,000",,"aaaaaaaa_00@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00AA00","AAAA" +"000,000",,"aaaaaaa0000@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00AA00","AAAA" +"000,000",,"aaaaaaaa00@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00AA00","AAAA" +"000,000","00,000","aaaaaa.aaaaaaa@aaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA000000","AAAAAAAA" +"00,000",,"aaaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000000","AAAA" +"000,000",,"aaaaaa_aaaaaa@aaaa.aa",00/00/0000 00:00:00AA,"0,000.00","AAA000A0A00","AAAA" +"00,000",,"Aaaaaaaaa@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA0A0A0A","AAAA" +"00,000",,"aaaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA0A0A0A","AAAA" +"000,000",,"aaaaa0000@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00AA00","AAAA" +"00,000",,"aaaaaaaa@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000000","AAAA" +"00,000",,"Aaaaaaaa@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000A0A","AAAA" +"00,000","000,000","Aaaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000A0A","AAAAAAAA" +"00,000",,"aaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000A0A","AAAA" +"000,000",,"aaaaaaaaaaa00000@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000000","AAAA" +"00,000","00,000","aaaaaaaaaaa00@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA000AA0A0","AAAAAAAA" +"00,000","00,000","aaaaaaaaaa0000@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA000AA0A0","AAAAAAAA" +"00,000",,"aaaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA000AA0A0","AAAA" +"00,000",,"aaaaaaaaa_aaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA000AA0A0","AAAA" +"000,000",,"aaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000A00A","AAAA" +"00,000","00,000","aaaaa_aaaaaa@aa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000A00A","AAAAAAAA" +"000,000","000,000","aaaaaa0000@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000A00A","AAAAAAAA" +"000,000",,"aaaaaaaaaaaa@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000AA00","AAAA" +"000,000",,"aaaaaaaaaaaaaa@aaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000AA00","AAAA" +"000,000",,"aaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000AA00","AAAA" +"000,000",,"aaaaaaa@aaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000AA00","AAAA" +"000,000",,"aaaaaaaa0@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000AA00","AAAA" +"000,000","00,000","aaaaa@aaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000AA00","AAAAAAAA" +"000,000",,"aaaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000AA00","AAAA" +"000,000",,"aa_aaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000AA00","AAAA" +"000,000",,"aaaaaa@aaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000AA00","AAAA" +"000,000",,"aaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000AA00","AAAA" +"000,000",,"Aaaaa.Aaaaa@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000000","AAAA" +"000,000",,"aaaaaa.aaaaaaaa@aaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000000","AAAA" +"000,000",,"aaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000000","AAAA" +"000,000",,"aaaaaaaaaa@aaaaaaaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000000","AAAA" +"000,000","00,000","aaaa@aaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000A000","AAAAAAAA AAA AAAAAAA" +"000,000",,"aaaa@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000000","AAAA" +"000,000",,"AAAAAAA@AAA.AAA",00/00/0000 00:00:00AA,"0,000.00","AAA000A0000","AAAA" +"000,000",,"AAAAA@AAAAAAAAAA.AAA",00/00/0000 00:00:00AA,"0,000.00","AAA000A0000","AAAA" +"000,000","000,000","aaaaaaaaa@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA00000A","AAAAAAAA AAA AAAAAAA" +"000,000",,"aaaaa_aaaaaa@aaaa.aa",00/00/0000 00:00:00AA,"0,000.00","AAAAA00A000","AAAA" +"000,000",,"aaaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA00A00A","AAAA" +"000,000","000,000","aaaaaa_aaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000AA0A","AAAAAAAA" +"000,000",,"aaaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000A00A","AAAA" +"000,000",,"aaaaa.a.aaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000A00","AAAA" +"000,000",,"Aaaaaaa@aaaaaaaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000A0A","AAAA" +"00,000","00,000","aaaaaaa.aaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000A00","AAAAAAAA" +"000,000",,"aaaaaaaaaaa000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000A0A","AAAA" +"000,000","00,000","aaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000A000","AAAAAAAA" +"000,000","000,000","aa0000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000A000","AAAAAAAA" +"000,000","000,000","a.aaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000A000","AAAAAAAA" +"000,000","000,000","aaaaaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000A000","AAAAAA AAAA AAAAA" +"000,000",,"aaaaaa0000@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00000A","AAAA" +"000,000","0,000","aaaaaaaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00000A","AAAAAAAA" +"000,000","000,000","a.aaaaaaaaa@aaaaaaaaa.aa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAAAAAA" +"000,000",,"aaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000AA00","AAAA" +"00,000","00,000","aaa0000@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000000","AAAAAAAA AAA AAAAAAA" +"000,000",,"aaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000000","AAAA" +"00,000","00,000","aaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000000","AAAAAAAA" +"0,000","000,000","aaaaaaa00@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000A000","AAAAAAAA" +"000,000","00,000","aaa000000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000A00","AAAAAAAA" +"00,000",,"aaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000A00","AAAA" +"000,000",,"aaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000000","AAAA" +000,,"aaaaaa0000@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000000","AAAA" +"000,000",,"0000000000@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000A00","AAAA" +"000,000",,"aaaaa_aaaaaa@aaaaa.aa",00/00/0000 0:00:00AA,"0,000.00","AAA0000A000","AAAA" +"000,000","000,000","Aaaaaaa_aaaa0000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAAAAAA" +"000,000","00,000","aaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA00A00A","AAAAAAAA" +"000,000","000,000","aaaaa@aa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000000","AAAAAAAA" +"000,000","000,000","aaaa@aaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000000","AAAAAAAA AAA AAAAAAA" +"000,000","00,000","aaaaaaaaa@aaaaaaaaa.aa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000000","AAAAAAAA AAA AAAAAAA" +"00,000","00,000","aaaa000@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAAAA AAAA AAAAA" +"00,000",,"aaaaaaaaa.aa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAA" +"000,000",,"aaaaaa@aaaaaaaaa.aa",00/00/0000 0:00:00AA,"0,000.00","AAA00000A0A","AAAA" +"00,000","000,000","aaaaaaa_aaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAAAAAA" +"00,000","000,000","aaaaaaaaaaaa0000@aaaaa.aa",00/00/0000 0:00:00AA,"0,000.00","AAAA000000A","AAAAAA AAAA AAAAA" +"00,000",,"aaaaa_a_aaaaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000000A","AAAA" +"000,000",,"aaaaaaa.aaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"00,000","000,000","aa0000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000000A","AAAAAAAA AAA AAAAAAA" +"00,000",,"aaaaaaa0000@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A0AA000","AAAA" +"00,000",,"aaaaaaaaaaaa00@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA00","AAAA" +"00,000",,"aaaaaaaaa0000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA00","AAAA" +"000,000","00,000","aaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000A00A","AAAAAAAA" +"000,000","000,000","aaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00A000","AAAAAAAA" +"000,000",,"aaaaa.aaaaaaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA0A00AA","AAAA" +"00,000","00,000","aaaaaaa_aaaaa0000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000000A","AAAAAAAA" +"00,000",,"aaaaaa@aaaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000A00A","AAAA" +"00,000","000,000","aaa-aaaa@aaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000A0A","AAAAAAAA" +"00,000","000,000","aaaaaaaaa0000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000A00","AAAAAAAA" +"000,000","000,000","aaa_aaa0@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAAAAAA" +"000,000",,"aaaa@aaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA00","AAAA" +"00,000","000,000","aaaa_aaaa_aaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000000","AAAAAAAA" +"000,000","000,000","aaa@aaaaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAAAAAA AAA AAAAAAA" +"000,000",,"aaaaaaaaaaaa@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000","00,000","aaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000A0A","AAAAAAAA" +"000,000",,"aaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000AA00","AAAA" +"00,000",,"aaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000AA0A","AAAA" +"00,000",,"aaaaaa000000@aaaaa.aaa.aa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000A00","AAAA" +"000,000",,"aaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000000","AAAA" +"00,000","000,000","Aaaaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAAAAAA" +"000,000",,"Aaaaaaaa.Aaaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00A000","AAAA" +"00,000",,"aaaaaaaaaa@aaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00AA0A","AAAA" +"00,000","000,000","aaaaaa.aaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA00A00A","AAAAAAAA" +"000,000",,"aaaaa0000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000A000","AAAA" +"000,000","0,000","aaaaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000A000","AAAAAAAA" +"000,000",,"aaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA00000A","AAAA" +"000,000",,"aaaaaaaaa@aaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA00000A","AAAA" +"000,000",,"aaaaa.aaaaa@aaaaaaaa-aaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA00000A","AAAA" +"000,000","000,000","aaaaaaaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA00000A","AAAAAAAA" +"000,000",,"aaaaaaa0@aaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA00000A","AAAA" +"000,000",,"aaaaaaaaaaaaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA00000A","AAAA" +"000,000",,"aaaaaaaaaa@aaaaaaa.aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA00000A","AAAA" +"000,000","000,000","aaaaaa00000@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA00000A","AAAAAAAA AAA AAAAAAA" +"000,000",,"aaaaa@aaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA00000A","AAAA" +"000,000","0,000","aaaaa00@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA00000A","AAAAAAAA" +"000,000",,"aaaaaa@aaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA00000A","AAAA" +"000,000",,"aaaaaaaaaaaa@aaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA00000A","AAAA" +"000,000","000,000","aaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA00000A","AAAAAAAA" +"000,000",,"aaa00000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA00000A","AAAA" +"000,000",,"aaaaaaaaa@aaaaaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA00000A","AAAA" +"000,000",,"aaaaaa.aaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA00000A","AAAA" +"000,000",,"aaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA00000A","AAAA" +"000,000",,"aaaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA00000A","AAAA" +"000,000",,"aaaaaa000@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000A00A","AAAA" +"00,000",,"aaaaaaaaa0@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000AA00","AAAA" +"00,000",,"aaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAA" +"00,000",,"aaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAA" +"00,000",,"aaaaaaaa0000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000AAAAA","AAAA" +"000,000",,"Aaaa@aaaaaaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000A000","AAAA" +"000,000","00,000","aaaaaa@aaaaaaaaa.aa",00/00/0000 00:00:00AA,"0,000.00","AAAA000A000","AAAAAAAA" +"00,000","000,000","aaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000000A","AAAAAA AAAA AAAAA" +"00,000",,"aaaaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA000AAAAA","AAAA" +"00,000",,"aaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA00AA0A","AAAA" +"00,000",,"aaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA00AA0A","AAAA" +"00,000",,"aaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA00AA0A","AAAA" +"00,000",,"aaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA00AA0A","AAAA" +"00,000",,"aaaaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA00AA0A","AAAA" +"00,000",,"aaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA00AA0A","AAAA" +"00,000","00,000","aaaaa.aaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA00AA0A","AAAAAAAA" +"00,000",,"aaaaaaaaa.aaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA00AA0A","AAAA" +"00,000","000,000","aaaaaa.a.aaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA00AA0A","AAAAAAAA" +"00,000","000,000","aaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA00AA0A","AAAAAAAA" +"000,000",,"aaaaaaaa@aa.aa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"aaaaa@aaaa.aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000000A","AAAA" +"000,000",,"aaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000A00A","AAAA" +"000,000",,"aaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000A00A","AAAA" +"000,000",,"aaaaa0@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000A00A","AAAA" +"000,000","00,000","aaaaaa00@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000A00A","AAAAAAAA" +"000,000",,"aaaaaa0000@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000A00A","AAAA" +"000,000","00,000","aaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000A00A","AAAAAAAA" +"000,000",,"aaaaaa000@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000A00A","AAAA" +"00,000",,"aaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000",,"Aaaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000AA00","AAAA" +"000,000",,"aaaaaaaaaaaa@aaaa.aa",00/00/0000 00:00:00AA,"0,000.00","AAA0000AA0A","AAAA" +"00,000",,"aaaaa.a.aaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000A0A","AAAA" +"00,000","000,000","aaaaa.aaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAAAAAA" +"00,000","00,000","a0aa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000A000","AAAAAAAA AAA AAAAAAA" +"00,000","000,000","aaaaaa@aaaaaaaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00A00A","AAAAAAAA" +"000,000",,"aaaaaaaaa00@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000A00","AAAA" +"00,000",,"aaaaaaaa@aaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000AA00","AAAA" +"00,000",,"aaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA00A00A","AAAA" +"000,000",,"aaaaaaaaaaaaaaaaa0000@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000A0A","AAAA" +"000,000","00,000","aaaaaaaaaa0000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000A0A","AAAAAAAA" +"000,000","000,000","aaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000A000","AAAAAAAA" +"000,000","000,000","aaaaaaaa@aaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000000","AAAAAAAA" +"000,000","00,000","aaaaaaaaaaaaa@aa.aaaaaaaaa.aa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000000","AAAAAAAA" +"00,000",,"aaaaaaaaaaaaaaa@aaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000000","AAAA" +"00,000","000,000","aaaaaa_aaaa_aaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000000","AAAAAAAA AAA AAAAAAA" +"00,000",,"aaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000000","AAAA" +"000,000",,"aaaaa@aaaaaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAA" +"000,000",,"aaaaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000000","AAAA" +"000,000","000,000","aaaaaaa@aaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000000","AAAAAAAA" +"000,000",,"aaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000000","AAAA" +"00,000","00,000","aaaaaaaa.aaaaaaaa@aaaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA00000A","AAAAAAAA" +"00,000",,"aaaaaaaa@aaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000A000","AAAA" +"00,000",,"aaaaaaaa0@aaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000A000","AAAA" +"000,000",,"aaaaaaaaa@aaaaaaaaaaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA00A000","AAAA" +"00,000",,"aaaaaaaaa0@aaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000A000","AAAA" +"00,000",,"aaaa@aaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000A000","AAAA" +"00,000",,"aaaaaaaaa@aaaaaaaaaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000000","AAAA" +"00,000",,"aaaaaaaa@aaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000A000","AAAA" +"00,000",,"aaaaaaa@aaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000A000","AAAA" +"00,000",,"aaaaaaaaaa@aaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000A000","AAAA" +"00,000",,"aaaaaaaaaa@aaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000A000","AAAA" +"00,000",,"aaaaaa@aaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000A000","AAAA" +"00,000",,"aaaaaaa@aaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000A000","AAAA" +"00,000",,"aaaaaaa0@aaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000A000","AAAA" +"00,000",,"aaaa@aaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000A000","AAAA" +"00,000","0,000","aaaaaaa@aaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00A00A","AAAAAA AAAA AAAAA" +"000,000",,"aaaa000aaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000000","AAAA" +"000,000","00,000","aaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000A00A","AAAAAAAA" +"00,000",,"aaaaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000000A","AAAA" +"000,000","00,000","aaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAAAA AAAA AAAAA" +"000,000",,"aaaaaaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000000","AAAA" +"000,000","00,000","aaaaaaaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000000","AAAAAAAA" +"00,000","00,000","aaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00000A","AAAAAAAA" +"00,000",,"aaaaaaaaa0000@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA00A000","AAAA" +"00,000","00,000","aaaaaaaa00@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00000A","AAAAAAAA" +"000,000",,"aaaaaaa0@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000A00","AAAA" +"000,000",,"aaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000A00","AAAA" +"000,000","000,000","aaaaa.aaaaaa@aa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAAAA AAAA AAAAA" +"000,000","000,000","aaaaaa00@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000000","AAAAAAAA" +"000,000",,"aaaaa00@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000000","AAAA" +"000,000",,"aaaaaaaa00@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000000","AAAA" +"000,000",,"aaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000000","AAAA" +"000,000",,"aaaaaaa.aaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A0AA0A0","AAAA" +"000,000","00,000","aaaaaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000000","AAAAAAAA AAA AAAAAAA" +"000,000",,"aaaaaaa@aaaaaaaaaaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA00","AAAA" +"000,000",,"aaaaaa.aaaaaa@aaaaaaaa-aaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000A00AA","AAAA" +"000,000",,"aaaaaa.aaaa@aaaaaaaa-aaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000A00AA","AAAA" +"000,000",,"aaaaaaaa@aaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000A0A00","AAAA" +"00,000",,"aaaaa.aaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA00000A","AAAA" +"000,000",,"aaaaaaaaaaaaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000000","AAAA" +"000,000",,"aaaaaaaaa00@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000A0A","AAAA" +"000,000","00,000","aaaaa0000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA00AA00","AAAAAAAA AAA AAAAAAA" +"000,000","000,000","aaaaaaaa@aaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA00AA00","AAAAAA AAAA AAAAA" +"000,000","00,000","aaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000000A","AAAAAAAA AAA AAAAAAA" +"000,000",,"aaaaaa.aaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAA" +"00,000",,"Aaaaa.Aaaaa-Aaaa@aaaaaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000A00","AAAA" +"000,000","000,000","aaaaaa.aaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAAAAAA" +"00,000",,"aaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000A00","AAAA" +"00,000",,"aaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000A0A","AAAA" +"000,000","0,000","aaaaaaaaa.aaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00A00A","AAAAAAAA" +"00,000","000,000","aaaaaa@aaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000A00","AAAAAAAA AAA AAAAAAA" +"00,000","000,000","aaaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA00A00A","AAAAAAAA" +"000,000",,"a_aaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA00A00A0","AAAA" +"00,000",,"Aaaaaaaa@aaaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000000","AAAA" +"00,000","00,000","aaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA000AA00A","AAAAAAAA" +"00,000",,"aaaaaaa.aaaaaaa@aaaaaa.aa",00/00/0000 00:00:00AA,"0,000.00","AAA000AA00A","AAAA" +"00,000","000,000","aaaaaa.aaaaaaaaaa@aaaaaa.aa",00/00/0000 00:00:00AA,"0,000.00","AAA000AA00A","AAAAAAAA AAA AAAAAAA" +"00,000","00,000","Aaaaaaaaa.Aaaaaaaa@aaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA000AA00A","AAAAAAAA AAA AAAAAAA" +"00,000",,"aaaaa.aaaaaaaa@aaaaaa.aa",00/00/0000 00:00:00AA,"0,000.00","AAA000AA00A","AAAA" +"00,000",,"aaaaaaa_aaaaa00@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA000AA00A","AAAA" +"00,000",,"aaaaaaa@aaaaaaaaaaaa.aa",00/00/0000 00:00:00AA,"0,000.00","AAA000AA00A","AAAA" +"00,000",,"aaaaaaaaa000@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA000AA00A","AAAA" +"00,000",,"AAAaaaaaa@aaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000A000","AAAA" +"00,000",,"aaaaaa@aaaaaaa-aaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A000A00","AAAA" +"00,000",,"aaaaaaa@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00A00A","AAAA" +"00,000",,"aaa0aaaaaa@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00A00A","AAAA" +000,,"aaaaaa.aaa@aa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000A000","AAAA" +000,,"aaaaa.aaaaaaaaa@aa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000A000","AAAA" +"00,000",,"aaaaaa00@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00AA0A","AAAA" +"00,000",,"aaaaaa@aaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA00A00A","AAAA" +"000,000","0,000","aaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A000A00","AAAAAA AAAA AAAAA" +"000,000",,"aaaaaaa_aaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000000","AAAA" +"00,000","000,000","AAAAAAAA@AAA.AAA",00/00/0000 00:00:00AA,"0,000.00","AAA0A00A000","AAAAAAAA" +"00,000","000,000","aaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000A000","AAAAAAAA" +"00,000",,"aaaa.aaaaaaa@aaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000000A","AAAA" +"00,000","00,000","aaaaaaaa.aaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000A00","AAAAAAAA" +"0,000",,"aaaaaaaa.a@aaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA0A0A0A","AAAA" +"0,000","000,000","aaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA0A0A0A","AAAAAAAA" +"0,000",,"aaa_aaa_aaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00A000","AAAA" +"0,000","000,000","aaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA000A0000","AAAAAAAA" +"000,000",,"aaaaa_a@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00A000","AAAA" +"00,000",,"Aaaaaaa@aaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00A00A","AAAA" +"00,000",,"aaaaaaaaaaaaaa@aaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A000A00","AAAA" +"00,000","00,000","aaaaa000@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA000A00","AAAAAAAA" +"00,000","00,000","aaaaaaaaaaaaaa@aaaaaaaaa.aa",00/00/0000 00:00:00AA,"0,000.00","AAA0A000A00","AAAAAA AAAA AAAAA" +"00,000",,"aaaaaaa.aaaaaaaaaa@aa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000A000","AAAA" +"000,000","00,000","aaaaaa00000@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000000","AAAAAAAA" +"000,000",,"aaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000000","AAAA" +"000,000","000,000","aaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000000","AAAAAAAA" +"000,000",,"aaaaaaaa.aaaaaaaaa@aaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000000","AAAA" +"000,000",,"aaaaa000000@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000000","AAAA" +"0,000","0,000","aaaaa.aaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000A00","AAAAAAAA" +"000,000",,"Aaaaaaaaaaaa@aaaa.aa",00/00/0000 00:00:00AA,"0,000.00","AAA0A0A000A","AAAA" +"000,000",,"aaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000000","AAAA" +"00,000",,"aaaaaaa_00@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000000","AAAA" +"00,000","00,000","aaaaaaaaa000@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00A000","AAAAAAAA" +"00,000",,"aaaaaaaaa@aaaaaaaaaa.aa",00/00/0000 0:00:00AA,"0,000.00","AAA000A0A0A","AAAA" +"000,000",,"aaaaa.aaaaaa@aaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000","00,000","aaaaaa0_aa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00000A","AAAAAAAA" +"000,000","000,000","aaaaaaaa@aaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00000A","AAAAAAAA" +"000,000","000,000","Aaaaaa.Aaaaaaaaa@aaaaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00000A","AAAAAAAA" +"000,000",,"aaaaaaaaaaaaaaa@aaaaaaa.aa.aa",00/00/0000 0:00:00AA,"0,000.00","AAAA00AAA0A","AAAA" +"000,000",,"aaaaaaaa.aaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00000A","AAAA" +"000,000",,"aaa000@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00000A","AAAA" +"00,000",,"aaaa0@aaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000A000","AAAA" +"000,000",,"aaaaaaaa00@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00000A","AAAA" +"000,000","000,000","aaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00000A","AAAAAAAA" +"000,000",,"aaaaaaa@aaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00000A","AAAA" +"000,000",,"aaaaaaaa.aaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00000A","AAAA" +"000,000",,"aaaaaaaa.aaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00000A","AAAA" +"000,000",,"aaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00000A","AAAA" +"000,000",,"aaaaaaaa0000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00000A","AAAA" +"000,000",,"aaaaaaaa.aaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00000A","AAAA" +"000,000",,"aaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00000A","AAAA" +"000,000",,"aaaaaaaaaa0@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00000A","AAAA" +"000,000",,"aaaaaaa@aa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00000A","AAAA" +"000,000",,"aaaaaaaaaa0000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00000A","AAAA" +"000,000",,"aaaaaa_aaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00000A","AAAA" +"00,000",,"aaaa0@aaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000A000","AAAA" +"000,000",,"aaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00000A","AAAA" +"000,000",,"aaaaaa@aaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00000A","AAAA" +"000,000",,"aaaaaaa.aaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00000A","AAAA" +"000,000",,"aaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAA" +"000,000","000,000","aaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000000A","AAAAAAAA" +"00,000","000,000","aaaaaaaa000@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000A00","AAAAAAAA" +"000,000","000,000","aaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000A0A00","AAAAAAAA" +"000,000","000,000","aaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAAAAAA" +"000,000",,"aaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000A0A","AAAA" +"000,000",,"aaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000A0A","AAAA" +"000,000",,"aaaaaaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA00","AAAA" +"00,000",,"aaaaa0@aaaaaaaaa.aa",00/00/0000 0:00:00AA,"0,000.00","AAAAA00000A","AAAA" +"00,000",,"aaaa0@aaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000A000","AAAA" +"000,000",,"Aaa_Aa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00000A","AAAA" +"000,000",,"aaaaa@aaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000AA000","AAAA" +"000,000",,"aaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA00AA0A","AAAA" +"000,000",,"a.aaaa00@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA00AA0A","AAAA" +"00,000",,"aaaaaaaaaa.aaaaaa@aaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A0A00AA","AAAA" +000,"00,000","aaaaaaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000000","AAAAAAAA" +"00,000",,"aaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000A00","AAAA" +"000,000",,"aaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00000A","AAAA" +"00,000",,"aaaaaaaa.a.aaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA00AA00","AAAA" +"00,000","000,000","aaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00AA0A","AAAAAAAA" +"000,000","00,000","aaaaaaa0@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00A000","AAAAAAAA AAA AAAAAAA" +"0,000",,"aaaa00@aaaaaa.aa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000A0A","AAAA" +"0,000","0,000","aaaaaaaaa@aaaaaa.aa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000A0A","AAAAAAAA" +"0,000","000,000","aaaaaa@aaaaaa.aa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000A0A","AAAAAAAA" +"00,000",,"AaaaaAaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000A0A","AAAA" +"00,000","00,000","Aaaaa.Aaaaaa@aaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000A0A","AAAAAAAA" +"00,000","000,000","aaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000A00","AAAAAAAA" +"000,000","00,000","aaa.aaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00A00A","AAAAAAAA" +"00,000","00,000","aaaaaa.aaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAAAAAA" +"00,000",,"aaaaaaaa00@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000A00","AAAA" +"00,000",,"aaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000A00","AAAA" +"00,000",,"aaa0000@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000AA00","AAAA" +"000,000",,"aaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000A00","AAAA" +"000,000",,"aaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000A00","AAAA" +"000,000","00,000","aaa00@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000A00","AAAAAAAA" +"000,000",,"AAaaa@a0a.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000A00","AAAA" +"000,000",,"aaaaaaa0@aaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000A00","AAAA" +"000,000","000,000","aaaaaaaaaaa@aaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000A00","AAAAAAAA" +"00,000",,"aaaa0@aaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000A00A","AAAA" +"00,000",,"aaaa0@aaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000A00A","AAAA" +"00,000",,"aaaa0@aaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000A00A","AAAA" +"00,000",,"aaaa0@aaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000A00A","AAAA" +"00,000",,"aaaa0@aaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000A000","AAAA" +"000,000","0,000","aaaaaaaaaa-aaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000A0A00","AAAAAAAA" +"000,000",,"aaaaaaaa@aaaaaaaaa.aa",00/00/0000 0:00:00AA,"0,000.00","AAA000A0A00","AAAA" +"000,000",,"aaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000A0A00","AAAA" +"00,000",,"aaaa0@aaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000A000","AAAA" +"00,000",,"aaaaaa@aaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000A000","AAAA" +"00,000",,"aaaaaaaaaa@aaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000A000","AAAA" +"000,000",,"aaaaaaaa@aaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA0000000","AAAA" +"000,000","00,000","aaaa.aaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000AA0A","AAAAAAAA" +"000,000",,"aaaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000AA0A","AAAA" +"000,000",,"aaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000AA0A","AAAA" +"000,000","00,000","aaaaaaaa.aaaaaaaaa@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000AA0A","AAAAAAAA" +"000,000",,"aaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000AA0A","AAAA" +"000,000","00,000","aaaaa.aaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000AA0A","AAAAAAAA" +"000,000",,"aaaaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000AA0A","AAAA" +"000,000",,"aaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000AA0A","AAAA" +"00,000",,"aaaaa@aaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000A000","AAAA" +"00,000",,"aaaaaa.aaaaaaaa@aaaa-aaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00A000","AAAA" +"00,000",,"aaaaaaaa@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000A0A","AAAA" +"000,000",,"aaaaaaa00@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA000A0000","AAAA" +"0,000",,"aaaaaa@aaaaaaaaaaaaaaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA00000A","AAAA" +"00,000","000,000","aaaaaaa_aaaa@aaaaa.aa",00/00/0000 00:00:00AA,"0,000.00","AAA0000A000","AAAAAAAA" +"00,000",,"aaaaa@aaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA00","AAAA" +"000,000",,"aaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000A0A","AAAA" +"00,000",,"aaaaa.aaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAAA000000","AAAA" +"000,000",,"Aaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000A00","AAAA" +"00,000",,"aaaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000A0000","AAAA" +"00,000",,"aaaaa.aaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A00A000","AAAA" +"00,000","00,000","aaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000000","AAAAAAAA AAA AAAAAAA" +"00,000","000,000","aaaaaa.aaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA00000000","AAAAAAAA" +"000,000",,"aaaa_aaa_@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000A0A00","AAAA" +"000,000","000,000","aaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000000A","AAAAAA AAAA AAAAA" +"00,000",,"aaaaaa@aaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000A000","AAAA" +"00,000",,"aaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0000A000","AAAA" +"00,000","00,000","aaaaaaaaaaaaaa@aaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA0A000A0A","AAAAAAAA" +"00,000",,"Aaaa.Aaaaaaaa@aaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA00","AAAA" +"00,000",,"aaaaaaa00@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA0A","AAAA" +"00,000","000,000","aaaaaaa0000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAAA000AA0A","AAAAAAAA" +"00,000",,"aaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000A0A00","AAAA" +"00,000",,"aaaaa00@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000A0A00","AAAA" +"00,000",,"aaaa_aaaaaa@aaaaaaaaaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000A0A00","AAAA" +"00,000",,"aaaa.aaaaaa@aaaaaaaaa.aa",00/00/0000 0:00:00AA,"0,000.00","AAA000A0A00","AAAA" +"00,000",,"aaaa@aaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000A0A00","AAAA" +"00,000",,"aaaaaaaa@aaa.aa",00/00/0000 0:00:00AA,"0,000.00","AAA000A0A00","AAAA" +"00,000",,"aa_aaaaa@aaaaaaaaa.aaa.aa",00/00/0000 0:00:00AA,"0,000.00","AAA000A0A00","AAAA" +"00,000",,"aaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000A0A00","AAAA" +"00,000",,"aaaaaaa@aaaaaaaaaaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000A0A00","AAAA" +"00,000",,"aaaaaa_a@aaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000A0A00","AAAA" +"00,000",,"aaaaaaa.aaaaa@aaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000A0A00","AAAA" +"00,000",,"aaaaaa@aaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000A0A00","AAAA" +"00,000",,"aa@aaaaaaaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000A0A00","AAAA" +"00,000",,"aaaa@aaaaaaaaaaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000A0A00","AAAA" +"00,000",,"aaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000A0A00","AAAA" +"00,000",,"aaaaaaa@aaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000A0A00","AAAA" +"00,000",,"aaa@aaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000A0A00","AAAA" +"00,000",,"aaaaaaaaa0@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000A0A00","AAAA" +"00,000",,"aaaaaaa@aaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000A0A00","AAAA" +"00,000",,"aaaaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000A0A00","AAAA" +"00,000",,"aaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000A0A00","AAAA" +"00,000",,"aaa_aaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000A0A00","AAAA" +"00,000",,"aaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000A0A00","AAAA" +"00,000",,"aaaaaa_aaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000A0A00","AAAA" +"00,000",,"aaaaaa@aaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000A0A00","AAAA" +"00,000",,"aaaaaaaaaa@aaaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000A0A00","AAAA" +"00,000","00,000","aaaaaa@aaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000A0A00","AAAAAAAA" +"00,000",,"aaaaaaaaaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000A0A00","AAAA" +"00,000",,"aaaaaa0@aaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000A0A00","AAAA" +"00,000",,"aaaaaaaaaa@aaaaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000A0A00","AAAA" +"00,000",,"aaaaaa@aaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000A0A00","AAAA" +"00,000",,"aaaaaa_aaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000A0A00","AAAA" +"00,000",,"aaaaaaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000A0A00","AAAA" +"00,000",,"aaaaaa.aaaaaaaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000A0A00","AAAA" +"00,000",,"aaaaa.aaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000A0A00","AAAA" +"00,000",,"aaaaaa000@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000A0A00","AAAA" +"00,000",,"aaaaaaaaaaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000A0A00","AAAA" +"00,000",,"aaaaaaaaaaa@aaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000A0A00","AAAA" +"00,000",,"aaaaaaaaaaa@aaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000A0A00","AAAA" +"00,000",,"aaaaaaaaaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000A0A00","AAAA" +"00,000",,"aaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000A0A00","AAAA" +"00,000",,"aaaaaaaa@aaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000A0A00","AAAA" +"00,000",,"aaa_a_aaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000A0A00","AAAA" +"00,000",,"aaaaaaa00@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000A0A00","AAAA" +"00,000",,"aaaaaaa0@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000A0A00","AAAA" +"00,000",,"aaaaaaaaaaaaaaaaa@aaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000A0A00","AAAA" +"00,000",,"aaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000A0A00","AAAA" +"00,000",,"aaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000A0A00","AAAA" +"00,000",,"aaaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000A0A00","AAAA" +"00,000",,"aaaaaaaa@aaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000A0A00","AAAA" +"00,000",,"aaaaaaa00@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000A0A00","AAAA" +"00,000",,"aaaaaaa0000@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000A0A00","AAAA" +"00,000",,"aaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000A0A00","AAAA" +"00,000",,"aaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000A0A00","AAAA" +"00,000",,"aaaaaa00@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000A0A00","AAAA" +"00,000",,"aaaaaaaa@aaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000A0A00","AAAA" +"00,000",,"aaaaaaa@aaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000A0A00","AAAA" +"00,000",,"aaaaaa@aaaaaaaaaaaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000A0A00","AAAA" +"00,000",,"aaaaaaaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000A0A00","AAAA" +"00,000",,"aaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000A0A00","AAAA" +"00,000",,"aaaaaa0000@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000A0A00","AAAA" +"00,000","000,000","aaaaaaaaaa00@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000A0A00","AAAAAAAA" +"00,000",,"aaaaaaa00@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000A0A00","AAAA" +"00,000",,"aaaaaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000A0A00","AAAA" +"00,000",,"aaa_aaaaaaa00@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000A0A00","AAAA" +"00,000",,"aaaaaaa@aaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000A0A00","AAAA" +"00,000",,"aaaa@aaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000A0A00","AAAA" +"00,000",,"aaaaaaa@aaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000A0A00","AAAA" +"00,000",,"aaaaaaa.aaaaaa@aaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000A0A00","AAAA" +"00,000",,"aaaaaaa@aaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000A0A00","AAAA" +"00,000",,"aaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000A0A00","AAAA" +"00,000",,"aaaa_aaaa@aaaaaaaaa.aa",00/00/0000 0:00:00AA,"0,000.00","AAA000A0A00","AAAA" +"00,000",,"aaaaaaaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000A0A00","AAAA" +"00,000",,"aaaaaaa@aa.aaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000A0A00","AAAA" +"00,000",,"aaa0000@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000A0A00","AAAA" +"00,000",,"aaaaa_aaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000A0A00","AAAA" +"00,000",,"aaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000A0A00","AAAA" +"00,000",,"aaaaaa@aaaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000A0A00","AAAA" +"00,000",,"aaaaaa@aaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000A0A00","AAAA" +"00,000",,"aaaaaa@aaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000A0A00","AAAA" +"00,000",,"aa.aaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000A0A00","AAAA" +"00,000",,"aaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000A0A00","AAAA" +"00,000",,"aaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000A0A00","AAAA" +"00,000",,"aaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000A0A00","AAAA" +"00,000",,"aaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000A0A00","AAAA" +"00,000",,"aaaaaa@aaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000A0A00","AAAA" +"00,000",,"aaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000A0A00","AAAA" +"00,000",,"aaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000A0A00","AAAA" +"00,000",,"aaaaa@aaaaaaaaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000A0A00","AAAA" +"00,000",,"aaaa_aaaaaa_@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000A0A00","AAAA" +"00,000",,"aaaaa@aaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000A0A00","AAAA" +"00,000",,"aaaaaaa@aaaaaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000A0A00","AAAA" +"00,000",,"aaaaaaa@aaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000A0A00","AAAA" +"00,000",,"aa@aaaaaaaaaaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000A0A00","AAAA" +"00,000",,"aaaaaaaa00@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000A0A00","AAAA" +"00,000",,"aaaa_aaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000A0A00","AAAA" +"00,000",,"aaaaaaa0@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000A0A00","AAAA" +"00,000",,"aaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000A0A00","AAAA" +"00,000",,"aaaa@aaa.aaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000A0A00","AAAA" +"00,000",,"aaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000A0A00","AAAA" +"00,000",,"aaaaaaa.aaaaaa@aaaaaa.aa",00/00/0000 0:00:00AA,"0,000.00","AAA000A0A00","AAAA" +"00,000",,"aaaaaaa@aaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000A0A00","AAAA" +"00,000",,"aaaaaaaaaa000@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000A0A00","AAAA" +"00,000",,"aaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000A0A00","AAAA" +"00,000",,"aaaaaaaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000A0A00","AAAA" +"00,000",,"aaaaaa_aaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000A0A00","AAAA" +"00,000",,"aaaaaaa@aaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000A0A00","AAAA" +"00,000",,"aaaaaaa@aaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000A0A00","AAAA" +"00,000",,"aaaa@aaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000A0A00","AAAA" +"00,000",,"aaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000A0A00","AAAA" +"00,000",,"aaaaaaaa000@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000A0A00","AAAA" +"00,000",,"aaaaa@aaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000A0A00","AAAA" +"00,000",,"aaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000A0A00","AAAA" +"00,000",,"aaaaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000A0A00","AAAA" +"00,000",,"aaaaa@aaaaaaaaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000A0A00","AAAA" +"00,000",,"aaaaaaa@aaaaaaaa.aa",00/00/0000 0:00:00AA,"0,000.00","AAA000A0A00","AAAA" +"00,000",,"aaaaa.aaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000A0A00","AAAA" +"00,000",,"aaaaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000A0A00","AAAA" +"00,000",,"aaaaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000A0A00","AAAA" +"00,000",,"aaaaaaaaa@aaaaaaaaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000A0A00","AAAA" +"00,000",,"aaaaaaaaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000A0A00","AAAA" +"00,000",,"aaaaaa@aaaaaaaaaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000A0A00","AAAA" +"00,000",,"aaaaaaaa_@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000A0A00","AAAA" +"00,000",,"aaaaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000A0A00","AAAA" +"00,000",,"aaaaaaa@aaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000A0A00","AAAA" +"00,000",,"aaa@aaaaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000A0A00","AAAA" +"00,000",,"aaaaa_aaaaaaa@aaaaaaa.aaa",00/00/0000 0:00:00AA,"0,000.00","AAA000A0A00","AAAA" +"000,000",,"aaa0a@aaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00000A","AAAA" +"00,000","00,000","aaaaa@AAAAAAAAAAA.AAA",00/00/0000 00:00:00AA,"0,000.00","AAA0A000A0A","AAAAAAAA AAA AAAAAAA" +"000,000","000,000","aaaa0000@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA00AAAAA","AAAAAAAA" +"000,000",,"aaaaaa_aaaa@aaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA000A000A","AAAA" +"00,000","000,000","aaa.aaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000000A","AAAAAAAA" +"00,000","00,000","aaaaaaaaaaaaaaaaaaa@aaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA000AA0A0","AAAAAAAA AAA AAAAAAA" +"00,000",,"aaaaaaaaaa@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA000A0A00","AAAA" +"00,000","00,000","aaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA000A0A00","AAAAAAAA" +"000,000","0,000","Aaa00a@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA00A000","AAAAAAAA" +"000,000",,"aaaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000A00","AAAA" +"000,000","00,000","aaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA000AA000","AAAAAAAA" +"00,000",,"aaaaaaa@aaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000000A","AAAA" +"0,000",,"Aaaaaaa.Aaaaaaaaa@Aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA00AA0A","AAAA" +"000,000",,"aaaaa.a.aaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000A00","AAAA" +"000,000",,"aaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA000AA0A0","AAAA" +"00,000",,"aaaaaaaaaaa00@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000000A","AAAA" +"00,000","000,000","aaaaaaaaaaaa@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000A00","AAAAAAAA" +"00,000",,"aaaaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA000A0000","AAAA" +"000,000","000,000","aaaaaaaaaa0@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000A00","AAAAAAAA" +"00,000","00,000","aaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000000A","AAAAAAAA" +"0,000",,"Aaaaaaa_Aaaaaaaa@aaaaaaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA00AA0A","AAAA" +"00,000",,"aaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA000A0000","AAAA" +"00,000",,"AAAAAA@AAAAAAAAAA.AAA",00/00/0000 00:00:00AA,"0,000.00","AAA0000A000","AAAA" +"00,000","00,000","aaaaa_aaaaaaaaaa@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A000000","AAAAAAAA" +"000,000",,"aaaaaaa00@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000A00","AAAA" +"000,000",,"aaaaaaaaaaaaa@aaaaa.aa",00/00/0000 00:00:00AA,"0,000.00","AAA0A000000","AAAA" +"00,000",,"AAAA@AAAAAAAA.AAA",00/00/0000 00:00:00AA,"0,000.00","AAA0000A000","AAAA" +"000,000",,"aaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA000AA0A0","AAAA" +"00,000",,"aaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000AA0A","AAAA" +"000,000",,"aaaaaa000@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000A00","AAAA" +"00,000",,"aaaaaaa.aaaaa00@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000000","AAAA" +"00,000",,"aaaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00AA00","AAAA" +"000,000",,"aaaaa.aaaaaa@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000A0A","AAAA" +"00,000",,"aaa00@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000AA0A","AAAA" +"000,000",,"aaaaaaaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA0000A00","AAAA" +"00,000","000,000","aaaaaaaaa@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA000A0000","AAAAAAAA" +"00,000",,"Aaaaaa0000@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000A000","AAAA" +"000,000",,"aaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA00AA0A","AAAA" +"0,000","00,000","aaaaaaaaa.aaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA00AA0A","AAAAAAAA" +"00,000",,"aaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000000","AAAA" +"000,000",,"aaaaa.aaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000AA0A","AAAA" +"000,000","000,000","aaaa0000@aaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000A00","AAAAAAAA" +"00,000","00,000","aaa@aaaaaaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000A000","AAAAAAAA" +"00,000",,"aaaaaaaaaaaaaa000@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000A000","AAAA" +"00,000","000,000","aaaaa.aaaaa@aaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A000A0A","AAAAAAAA" +"00,000","00,000","aaaaaaaa000@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000AA00","AAAAAAAA" +"000,000",,"aaaaaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000A000","AAAA" +000,,"aaaaaa@aaaaaa-aaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA0AAA00","AAAA" +000,,"aaaaaaaa@aaaaaa-aaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA0AAA00","AAAA" +"00,000",,"aaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00000A","AAAA" +000,"000,000","aaaaaaa@aaaaaa-aaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA0AAA00","AAAAAAAA" +000,,"aaaaaaa@aaaaaa-aaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA0AAA00","AAAA" +000,,"aaaaaaa@aaaaaa-aaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA0AAA00","AAAA" +000,,"aaaaaaaa@aaaaaa-aaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA0AAA00","AAAA" +000,,"aaaaaaa@aaaaaa-aaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA0AAA00","AAAA" +"000,000",,"aaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000000","AAAA" +"00,000",,"aaaaaaa.aaaaa@aa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00000A","AAAA" +"000,000",,"Aaaaaaa@aaaaaaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000A000","AAAA" +"00,000","000,000","aaaaaaaa.aaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0A00000A","AAAAAAAA" +"00,000","000,000","aaaaaa.aaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000000","AAAAAAAA" +"000,000",,"aaaaaaaaaa@aaaaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAAA00AA0A","AAAA" +"00,000",,"aaa.aaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAAA000AA00","AAAA" +"000,000","000,000","aaaaaaa.aaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA0000A000","AAAAAAAA" +"00,000",,"aaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA000A00AA","AAAA" +"00,000","000,000","a_aaaaaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA000A00AA","AAAAAAAA" +"000,000","000,000","aaaaaa.aaaaaa@aaaaa.aaa",00/00/0000 00:00:00AA,"0,000.00","AAA00000000","AAAAAAAA" diff --git a/vfs/filter_streams.cc b/vfs/filter_streams.cc index 5b0989fc9..5cd9e58c3 100644 --- a/vfs/filter_streams.cc +++ b/vfs/filter_streams.cc @@ -36,432 +36,6 @@ using namespace std; namespace MLDB { -#if 0 - -#define MLDB_ABORT_UNIMPLEMENTED() \ - cerr << "Unimplemented: " << __FILE__ << ":" << __LINE__ << " " << __PRETTY_FUNCTION__ << endl; \ - abort(); - -template void close_stream(Stream& stream) { stream.close(); } -inline void close_stream(std::istream & stream) { /* nothing to do */ } -inline void flush_stream(std::ostream & stream) { stream.flush(); } -inline void flush_stream(std::istream & stream) { /* nothing to do */ } -template void flush_stream(Stream& stream) { MLDB_ABORT_UNIMPLEMENTED(); } - -template -ssize_t write_stream(std::ostream& stream, const char * data, size_t len) -{ - stream.write(data, len); - if (!stream) - throw Exception("unable to write data"); - return len; -} - -template ssize_t write_stream(Stream& stream, const char * data, size_t len) { return stream.write(data, len); } -template ssize_t read_stream(Stream& stream, char * data, size_t len) { return stream.read(data, len); } - - -/*****************************************************************************/ -/* FILTER STREAM CLASSES */ -/*****************************************************************************/ - -// Similar interface to boost::iostreams, except that these: -// a) don't use boost -// b) can map extra space at the end of a memory mapped file, allowing for -// algorithms that require specific alignment to work efficiently - -struct filter_streambuf: public std::streambuf { - virtual ~filter_streambuf() = default; - virtual void close() = 0; // should ensure that nothing more is written to the output - void set_output(std::streambuf * sb) { output_ = sb; } - bool has_output() const { return output_; } - std::streambuf * require_output() const { ExcCheck(output_, "Attempt to use non-capped filter_streambuf"); return output_; } - std::streamsize write(const char* s, std::streamsize n) { return require_output()->sputn(s, n); } - std::streamsize read(char* s, std::streamsize n) { return require_output()->sgetn(s, n); } - void flush() { require_output()->pubsync(); } -private: - std::streambuf * output_ = nullptr; -}; - -template -struct filtering_stream: public IOStream { - using IOStream::rdbuf; - filtering_stream() : IOStream(nullptr) - { - } - - virtual ~filtering_stream() - { - MLDB_EAT_EXCEPTIONS(flush_stream((IOStream&)*this)); - rdbuf(nullptr); - for (auto & filter: filters_) MLDB_EAT_EXCEPTIONS(filter->close()); - if (cap_) MLDB_EAT_EXCEPTIONS(cap_->close()); - } - - void push(std::streambuf & sb) { check_not_capped(); push_streambuf(sb); } - - bool empty() const { return filters_.empty() && !cap_ && !rdbuf(); } - bool capped() const { return rdbuf() && (filters_.empty() || filters_.back()->has_output()); } - -protected: - void check_not_capped() const { ExcCheck(!cap_, "Attempt to push a second sink into a filtering_stream"); } - void push_streambuf(std::streambuf & sb) { cerr << "adding streambuf " << (void *)(&sb) << " to " << filters_.size() << " filters and " << (bool)rdbuf() << "rdbuf set" << endl; if (!rdbuf()) { rdbuf(&sb); } else filters_.back()->set_output(&sb); } - template void push_cap(Cap cap) { check_not_capped(); push_streambuf(*(cap_ = std::make_unique(std::move(cap)))); } - template void push_filter(Filter filter) - { - check_not_capped(); - filters_.emplace_back(std::make_unique(std::move(filter))); - push_streambuf(*filters_.back()); - } -private: - std::vector> filters_; - std::unique_ptr cap_; -}; - - -/*****************************************************************************/ -/* FILTER OSTREAM CLASSES */ -/*****************************************************************************/ - -struct buffered_ostreambuf: public filter_streambuf { - buffered_ostreambuf(size_t buffer_size = 4096) : buffer_(buffer_size) { reset_buffer(); } -protected: - std::vector buffer_; - virtual ssize_t flush_sink() = 0; - virtual int sync() override { return (flush_buffer() == EOF || flush_sink() == EOF) ? EOF : 0; } - virtual int overflow(int c) override { cerr << "overflow"; if (flush_buffer() == EOF) return EOF; return sputc(c); } - virtual std::streamsize xsputn(const char * s, std::streamsize n) override { cerr << "xsputn" << endl; return (flush_buffer() == EOF || sink_write_all(s, n) == EOF) ? EOF : n; } - ssize_t flush_buffer() - { - auto res = sink_write_all(buffer_.data(), pptr() - buffer_.data()); - reset_buffer(); - return res; - } - template ssize_t sink_write_impl(const char * s, size_t n, Sink & sink, Args&&... args) { return sink.write(std::forward(args)..., s, n); } - virtual ssize_t sink_write(const char * s, size_t n) = 0; - ssize_t sink_write_all(const char * s, size_t n) - { - cerr << "writing " << n << " chars to sink in " << typeid(*this).name() << endl; - size_t n2 = n; - while (n) { - auto res = sink_write(s, n); - if (res == EOF) return EOF; - n -= res; - s += res; - } - return n2; - } - void reset_buffer() { setp(buffer_.data(), buffer_.data() + buffer_.size()); } -}; - -template -struct sink_ostreambuf: public buffered_ostreambuf { - using base_type = buffered_ostreambuf; - sink_ostreambuf(Sink sink, size_t buffer_size = 4096) : base_type(buffer_size), sink_(std::move(sink)) {} - virtual ~sink_ostreambuf() = default; - const Sink & sink() const { return sink_; } - Sink & sink() { return sink_; } - virtual void close() override { flush_buffer(); sink_.flush(); sink_.close(); } -protected: - virtual ssize_t flush_sink() override { sink_.flush(); return 0; } - virtual ssize_t sink_write(const char * s, size_t n) override { return sink_write_impl(s, n, sink_); } -private: - Sink sink_; -}; - -template -struct filtering_ostreambuf: public buffered_ostreambuf { - using base_type = buffered_ostreambuf; - filtering_ostreambuf(Filter filter, size_t buffer_size = 4096) : base_type(buffer_size), filter_(std::move(filter)) {} - virtual ~filtering_ostreambuf() = default; - const Filter & filter() const { return filter_; } - Filter & filter() { return filter_; } - //virtual std::streamsize xsputn(const char * s, std::streamsize n) override { return filter_.write(*this, s, n); } - //virtual int sync() override { filter_.flush(*this); return 0; } - virtual void close() override { flush_buffer(); filter_.flush(*this); filter_.close(*this); } -protected: - virtual ssize_t flush_sink() override { filter_.flush(*this); return 0; } - virtual ssize_t sink_write(const char * s, size_t n) override { return sink_write_impl(s, n, filter_, *this); } -private: - Filter filter_; -}; - -struct filtering_ostream: public filtering_stream { - using filtering_stream::push; - template void push(Sink sink, typename Sink::is_sink::type = {}) { push_cap>(std::move(sink)); } - template void push(Filter filter, typename Filter::is_filter::type = {}) { push_filter>(std::move(filter)); } -}; - - -/*****************************************************************************/ -/* FILTER ISTREAM CLASSES */ -/*****************************************************************************/ - -struct buffered_istreambuf: public filter_streambuf { - buffered_istreambuf(size_t buffer_size = 4096) : buffer_(buffer_size) {} - virtual int underflow() override { buf_fill(); ExcAssert((eof() && buf_empty()) || !buf_empty()); return eof() ? EOF : *gptr(); } - -#if 1 - virtual std::streamsize xsgetn(char * s, std::streamsize n) override - { - // First get any buffered characters - cerr << "xsgetn of " << n << " characters" << endl; - size_t done = std::min(n, egptr() - gptr()); - std::copy_n(gptr(), done, s); - gbump(done); // results in gptr() == egptr() if done == n - cerr << "done = " << done << endl; - while (!eof() && done < n) { - auto nread = source_read(s + done, n - done); - if (nread == EOF) break; - done += nread; - } - cerr << "end of xsgetn: done = " << done << " eof = " << eof() << endl; - ExcAssert(done > 0 || eof()); - return done ? done : EOF; - } -#endif - virtual std::streampos seekoff(std::streamoff off, std::ios_base::seekdir way, std::ios_base::openmode which) override - { - if (which != std::ios_base::in || way != std::ios_base::cur || off != 0) return EOF; - return pos_ + gptr() - eback(); - } - bool eof() const { return eof_; } - -protected: - std::vector buffer_; - ssize_t pos_ = 0; - bool eof_ = false; - bool buf_empty() const { return gptr() == egptr(); } - void require_empty() { ExcAssert(buf_empty()); } - void buf_fill() - { - require_empty(); - auto n = source_read(buffer_.data(), buffer_.size()); - if (n != EOF) setg(buffer_.data(), buffer_.data(), buffer_.data() + n); - } - virtual ssize_t source_read(char * s, size_t n) = 0; - template ssize_t do_source_read(char * s, size_t n, Source & source, Args&&... args) - { - if (eof_) return EOF; - auto res = source.read(std::forward(args)..., s, n); - eof_ = res == EOF; - pos_ += (res == EOF ? 0 : res); - return res; - } -}; - -template -struct source_istreambuf: public buffered_istreambuf { - using base_type = buffered_istreambuf; - source_istreambuf(Source source, size_t buffer_size = 4096) : base_type(buffer_size), source_(std::move(source)) {} - virtual ~source_istreambuf() = default; - const Source & source() const { return source_; } - Source & source() { return source_; } - virtual void close() override {} -protected: - virtual ssize_t source_read(char * s, size_t n) override { return do_source_read(s, n, source_); } - Source source_; -}; - -template -struct filtering_istreambuf: public buffered_istreambuf { - using base_type = buffered_istreambuf; - filtering_istreambuf(Filter filter, size_t buffer_size = 4096) : base_type(buffer_size), filter_(std::move(filter)) {} - virtual ~filtering_istreambuf() = default; - const Filter & filter() const { return filter_; } - Filter & filter() { return filter_; } - virtual void close() override {} -protected: - virtual ssize_t source_read(char * s, size_t n) override { return do_source_read(s, n, filter_, *this); } - Filter filter_; -}; - -struct filtering_istream: public filtering_stream { - using filtering_stream::push; - template void push(Source source, typename Source::is_source::type = {}) { push_cap>(std::move(source)); } - template void push(Filter filter, typename Filter::is_filter::type = {}) { push_filter>(std::move(filter)); } -}; - -template -struct stream_buffer: public source_istreambuf { - stream_buffer(Source source, size_t /*buffer_size*/ = 4096): source_istreambuf(std::move(source)) {} -}; - -struct mapped_file_params { - std::string filename; - int fd = -1; - size_t offset = 0; - ssize_t size = -1; - ssize_t extra_capacity = MAPPING_EXTRA_CAPACITY; -}; - -struct mapped_file_source { - using is_source = std::true_type; - mapped_file_source(mapped_file_params params) - { - Scope_Exit(if (params.fd != -1) ::close(params.fd)); - if (params.fd == -1) { - params.fd = open(params.filename.c_str(), O_RDONLY); - if (params.fd == -1) - throw Exception(errno, "open"); - } - if (params.size == -1) { - struct stat st; - if (fstat(params.fd, &st) == -1) - throw Exception(errno, "fstat"); - params.size = st.st_size; - } - size_t offset = roundDownToPageSize(params.offset); - size_t skip = params.offset - offset; - size_t capacity = roundUpToPageSize(params.size + params.extra_capacity - offset); - size_t capacityWithoutGuardPage = roundUpToPageSize(params.size - offset); - cerr << "capacity = " << capacity << " capacityWithoutGuardPage = " << capacityWithoutGuardPage << endl; - cerr << "skip = " << skip << endl; - cerr << "offset = " << offset << endl; - - cerr << "mapping " << capacity << " of " << params.size << " bytes from " << params.filename << " at offset " << params.offset << endl; - cerr << "skipping " << skip << " bytes" << endl; - - auto check_mmap = [&] (void * p) { - if (p == MAP_FAILED) - throw Exception(errno, "mmap"); - }; - - std::shared_ptr addr; - if (capacity == capacityWithoutGuardPage) { - // No extra page - addr = std::shared_ptr - (mmap(nullptr, capacity, - PROT_READ, MAP_PRIVATE, params.fd, params.offset), - [=] (void * p) { munmap(p, page_size); }); - check_mmap(addr.get()); - } - else { - // Firstly, make an anonymous zero-filled mapping - addr = std::shared_ptr - (mmap(nullptr, capacity, PROT_READ, MAP_PRIVATE | MAP_ANON, -1, 0), - [=] (void * p) { munmap(p, page_size); }); - check_mmap(addr.get()); - - // Now remap the file on all but the last page - void * addr2 = mmap(addr.get(), capacity - page_size, PROT_READ, MAP_PRIVATE | MAP_FIXED, params.fd, params.offset); - if (addr2 == MAP_FAILED) - throw Exception(errno, "mmap"); - if (addr2 != addr.get()) - throw Exception("mmap: remapped to different address"); - } - - data_ = (const char *)addr.get() + skip; - ptr_ = data_; - size_ = params.size - params.offset; - capacity_ = capacity - skip; - region_ = std::move(addr); - - cerr << "data_ = " << (void *)data_ << endl; - cerr << "ptr_ = " << (void *)ptr_ << endl; - cerr << "size_ = " << size_ << endl; - cerr << "capacity_ = " << capacity_ << endl; - cerr << "region_ = " << (void *)region_.get() << endl; - } - - const char * data() const { return data_; } - size_t size() const { return size_; } - size_t avail() const { return data_ + size_ - ptr_; } - size_t capacity() const { return capacity_; } - size_t extra_capacity() const { return capacity_ - size_; } - - ssize_t read(char * s, size_t n) - { - cerr << "reading " << n << " bytes from mapped file" << endl; - size_t left = avail(); - if (left == 0) - return EOF; - n = std::min(n, left); - memcpy(s, ptr_, n); - ptr_ += n; - cerr << "read " << n << " bytes from mapped file" << endl; - return n; - } - - int fd_ = -1; - std::shared_ptr region_; - const char * data_ = nullptr; - const char * ptr_ = nullptr; - size_t size_ = 0; - size_t capacity_ = 0; -}; - -enum close_handle { - never_close_handle = false, - always_close_handle = true -}; -struct file_descriptor_sink { - using is_sink = std::true_type; - file_descriptor_sink(int fd, close_handle close_handle = never_close_handle) - : fd_(fd), close_handle_(close_handle) - { - cerr << "initializing fd sink with fd " << fd << endl; - } - - // Disable copying - file_descriptor_sink(const file_descriptor_sink &) = delete; - file_descriptor_sink & operator = (const file_descriptor_sink &) = delete; - - file_descriptor_sink(file_descriptor_sink && other) - : fd_(other.fd_), close_handle_(other.close_handle_) - { - other.fd_ = -1; - } - - void swap(file_descriptor_sink & other) - { - std::swap(fd_, other.fd_); - std::swap(close_handle_, other.close_handle_); - } - - file_descriptor_sink & operator = (file_descriptor_sink && other) - { - swap(other); - return *this; - } - - ~file_descriptor_sink() - { - cerr << "destroying fd sink" << endl; - close(); - } - - void close() - { - if (fd_ != -1) { - cerr << "closing fd " << fd_ << " with close_handle_ " << close_handle_ << endl; - if (close_handle_ == always_close_handle) - ::close(fd_); - fd_ = -1; - } - } - - void flush() - { - cerr << "flushing fd sink" << endl; - // fsync? - } - - ssize_t write(const char * data, size_t len) - { - cerr << "writing " << len << " bytes to fd sink" << endl; - auto res = ::write(fd_, data, len); - cerr << "res = " << res << endl; - if (res == -1) - throw Exception(errno, "write"); - return res; - } - - int fd_ = -1; - close_handle close_handle_ = never_close_handle; -}; - -#endif /*****************************************************************************/ /* URI HANDLING */ @@ -1081,12 +655,13 @@ void filter_ostream:: close() { - if (stream) { - flush_stream(*stream); + if (rdbuf()) { + flush_stream(*rdbuf()); + close_stream(*rdbuf()); } stream.reset(); exceptions(ios::goodbit); - rdbuf(0); + rdbuf(nullptr); sink.reset(); options.clear(); if (deferredExcPtr) { diff --git a/vfs/gzip.cc b/vfs/gzip.cc index d3f8dc4c6..f4310664e 100644 --- a/vfs/gzip.cc +++ b/vfs/gzip.cc @@ -42,8 +42,6 @@ struct ZlibStreamCommon: public z_stream { int flushLevel) { if (finished) { - if (len != 0) - MLDB_THROW_LOGIC_ERROR("pumping data after finished"); return 0; } diff --git a/vfs/http_streambuf.cc b/vfs/http_streambuf.cc index e8d015c3c..6a41c2783 100644 --- a/vfs/http_streambuf.cc +++ b/vfs/http_streambuf.cc @@ -322,7 +322,7 @@ struct HttpStreamingDownloadSource { dataQueue.enqueue(""); - } catch (const std::exception & exc) { + } MLDB_CATCH_ALL { lastExc = std::current_exception(); dataQueue.enqueue(""); if (!headerSet.exchange(true)) { diff --git a/vfs/testing/filter_streams_test.cc b/vfs/testing/filter_streams_test.cc index 41080664f..195561ea8 100644 --- a/vfs/testing/filter_streams_test.cc +++ b/vfs/testing/filter_streams_test.cc @@ -465,7 +465,7 @@ struct ExceptionSource { return n; } - void close(ios::openmode which) + void close() { if (throwType_ == ThrowType::ThrowOnClose) { onException_(exception_ptr()); @@ -489,6 +489,18 @@ struct RegisterExcHandlers { return UriHandler(handler.get(), handler, info); } + static UriHandler + getExceptionSink(const OnUriHandlerException & onException, + ExceptionSource::ThrowType throwType) + { + shared_ptr handler; + + handler.reset(new sink_ostreambuf(ExceptionSource(onException, throwType), 1)); + FsObjectInfo info; + info.exists = true; + return UriHandler(handler.get(), handler, info); + } + static UriHandler getExcOnReadHandler(const std::string & scheme, const Utf8String & resource, @@ -506,7 +518,7 @@ struct RegisterExcHandlers { const std::map & options, const OnUriHandlerException & onException) { - return getExceptionSource(onException, ExceptionSource::ThrowOnWrite); + return getExceptionSink(onException, ExceptionSource::ThrowOnWrite); } static UriHandler @@ -516,7 +528,7 @@ struct RegisterExcHandlers { const std::map & options, const OnUriHandlerException & onException) { - return getExceptionSource(onException, ExceptionSource::ThrowOnClose); + return getExceptionSink(onException, ExceptionSource::ThrowOnClose); } void registerBuckets() From 389fbf61e74b3709d8c73ef0eb29177c8e638451 Mon Sep 17 00:00:00 2001 From: Jeremy Barnes Date: Sat, 18 Jan 2025 13:24:10 -0500 Subject: [PATCH 22/39] SQUASH filter_streams, for_each_line (4) --- plugins/textual/importtext_procedure.cc | 8 +- plugins/textual/json_importer.cc | 4 +- utils/for_each_line.cc | 104 ++++--- utils/for_each_line.h | 15 +- utils/testing/for_each_line_test.cc | 348 ++++++++++++++++++++++-- utils/testing/testing.mk | 2 +- 6 files changed, 405 insertions(+), 76 deletions(-) diff --git a/plugins/textual/importtext_procedure.cc b/plugins/textual/importtext_procedure.cc index ced4bcc5c..8b1b451b2 100644 --- a/plugins/textual/importtext_procedure.cc +++ b/plugins/textual/importtext_procedure.cc @@ -1013,7 +1013,7 @@ struct ImportTextProcedureWorkInstance PerThreadAccumulator accum; - auto startChunk = [&] (int64_t chunkNumber, size_t lineNumber) + auto startChunk = [&] (int64_t chunkNumber, size_t lineNumber, int64_t numLinesInChunk) { auto & threadAccum = accum.get(); threadAccum.threadRecorder = recorder.newChunk(chunkNumber); @@ -1024,7 +1024,7 @@ struct ImportTextProcedureWorkInstance return true; }; - auto doneChunk = [&] (int64_t chunkNumber, size_t lineNumber) + auto doneChunk = [&] (int64_t chunkNumber, size_t lineNumber, int64_t numLinesInChunk) { auto & threadAccum = accum.get(); ExcAssert(threadAccum.threadRecorder.get()); @@ -1323,7 +1323,7 @@ struct ImportTextProcedureWorkInstance // we get an error that probably is caused by a multi- // line string, we concat the current line with the next // one and try again. - startChunk(0, 0); + startChunk(0, 0, -1 /* numLinesInChunk; unused */); string line; string t_line; @@ -1349,7 +1349,7 @@ struct ImportTextProcedureWorkInstance break; } - doneChunk(0, lineNum); + doneChunk(0, lineNum, -1 /* numLinesInChunk */); } // Accumulate any from the end diff --git a/plugins/textual/json_importer.cc b/plugins/textual/json_importer.cc index 00b2f123e..0b8fd87e9 100644 --- a/plugins/textual/json_importer.cc +++ b/plugins/textual/json_importer.cc @@ -292,14 +292,14 @@ struct JSONImporter: public Procedure { PerThreadAccumulator accum; - auto startChunk = [&] (int64_t chunkNumber, size_t lineNumber) + auto startChunk = [&] (int64_t chunkNumber, size_t lineNumber, int64_t numLinesInChunk) { auto & threadAccum = accum.get(); threadAccum.threadRecorder = recorder.newChunk(chunkNumber); return true; }; - auto doneChunk = [&] (int64_t chunkNumber, size_t lineNumber) + auto doneChunk = [&] (int64_t chunkNumber, size_t lineNumber, int64_t numLinesInChunk) { auto & threadAccum = accum.get(); ExcAssert(threadAccum.threadRecorder.get()); diff --git a/utils/for_each_line.cc b/utils/for_each_line.cc index 94b564546..80220989f 100644 --- a/utils/for_each_line.cc +++ b/utils/for_each_line.cc @@ -255,20 +255,18 @@ forEachLineStr(const std::string & filename, /* FOR EACH LINE BLOCK (ISTREAM) */ /*****************************************************************************/ -void forEachLineBlock(std::istream & stream, +bool forEachLineBlock(std::istream & stream, std::function onLine, int64_t maxLines, int maxParallelism, - std::function startBlock, - std::function endBlock, + std::function startBlock, + std::function endBlock, + ssize_t defaultBlockSize, const BlockSplitter & splitter) { - //static constexpr int64_t BLOCK_SIZE = 100000000; // 100MB blocks - //static constexpr int64_t BLOCK_SIZE = 20000000; // 20MB blocks - int64_t BLOCK_SIZE = 20000000; static constexpr int64_t READ_SIZE = 200000; // read&scan 200kb to fit in cache std::atomic doneLines(0); //number of lines processed but not yet returned @@ -291,12 +289,16 @@ void forEachLineBlock(std::istream & stream, // nullptr if it's not possible to memory map this stream. std::tie(mapped, mappedSize, mappedCapacity) = fistream->mapped(); auto info = fistream->info(); - if (info.size > 0) { - BLOCK_SIZE = std::max(1000000, info.size / maxParallelism); - BLOCK_SIZE = std::min(BLOCK_SIZE, 20000000); + if (info.size > 0 && defaultBlockSize == -1) { + defaultBlockSize = std::max(1000000, info.size / maxParallelism); + defaultBlockSize = std::min(defaultBlockSize, 20000000); } } + ExcCheckGreater(defaultBlockSize, 0, "defaultBlockSize must be > 0"); + + //cerr << "defaultBlockSize = " << defaultBlockSize << endl; + //cerr << "mapped = " << (void *)mapped << endl; //cerr << "mappedSize = " << mappedSize << endl; //hex_dump(mapped, mappedSize, mappedSize); @@ -311,6 +313,7 @@ void forEachLineBlock(std::istream & stream, std::shared_ptr nextBlock; size_t nextBlockSize = 0; size_t nextBlockUsed = 0; + std::atomic stop = false; std::function doBlock = [&] () { @@ -322,17 +325,23 @@ void forEachLineBlock(std::istream & stream, bool lastBlock = false; size_t myChunkNumber = 0; + if (stop.load(std::memory_order_relaxed)) + return; + try { //MLDB-1426 if (mapped) { std::streamsize pos = stream.tellg(); + + //cerr << "memory mapped for each line at pos " << pos << " of " << mappedSize << endl; + if (mappedSize == 0 || pos == EOF) return; // EOF, so nothing to read... probably empty const char * start = mapped + pos; const char * current = start; const char * end = mapped + mappedSize; - while (current && current < end && (current - start) < BLOCK_SIZE + while (current && current < end && (current - start) < defaultBlockSize && (maxLines == -1 || doneLines < maxLines)) { //stop processing new line when we have enough) std::tie(current, splitterState) = splitter.nextBlock(current, end - current, nullptr, 0, @@ -344,6 +353,9 @@ void forEachLineBlock(std::istream & stream, break; ++current; } + + if (stop.load(std::memory_order_relaxed)) + return; } if (current) @@ -372,30 +384,33 @@ void forEachLineBlock(std::istream & stream, // How far through our block are we? std::shared_ptr block = nextBlock; - size_t blockSize = nextBlockSize; + size_t thisBlockSize = nextBlockSize; size_t blockUsed = nextBlockUsed; if (!block) { - block = std::shared_ptr(new char[BLOCK_SIZE], [] (char * c) { delete[] c; }); - blockSize = BLOCK_SIZE; + block = std::shared_ptr(new char[defaultBlockSize], [] (char * c) { delete[] c; }); blockUsed = 0; + thisBlockSize = defaultBlockSize; } blockOut = block; size_t offset = blockUsed; // First line starts at offset 0 + //cerr << "starting block with istream: eof = " << stream.eof() << " offset = " << offset << " blockUsed " << blockUsed << " thisBlockSize " << thisBlockSize << endl; while (stream && !stream.eof() && (maxLines == -1 || doneLines < maxLines) //stop processing new line when we have enough - && (offset < blockSize)) { + && (offset < thisBlockSize)) { stream.read((char *)block.get() + offset, - std::min(READ_SIZE, blockSize - offset)); + std::min(READ_SIZE, thisBlockSize - offset)); // Check how many bytes we actually read size_t bytesRead = stream.gcount(); + //cerr << "read " << bytesRead << " characters" << endl; + offset += bytesRead; // Scan for the end of the block @@ -436,8 +451,8 @@ void forEachLineBlock(std::istream & stream, // block. nextBlockUsed = offset - lineOffsets.back(); if (lineOffsets.size() == 1) - nextBlockSize = blockSize + nextBlockUsed; - else nextBlockSize = BLOCK_SIZE + nextBlockUsed; + nextBlockSize = thisBlockSize + nextBlockUsed; + else nextBlockSize = defaultBlockSize + nextBlockUsed; nextBlock = std::shared_ptr(new char[nextBlockSize], [] (char * c) { delete[] c; }); @@ -445,27 +460,27 @@ void forEachLineBlock(std::istream & stream, nextBlock.get()); } - myChunkNumber = chunkNumber++; + bool emptyBlock = lineOffsets.size() == 1; + myChunkNumber = emptyBlock ? -1 : chunkNumber++; - if (stream && !stream.eof() - && (maxLines == -1 || doneLines < maxLines)) // don't schedule a new block if we have enough lines - { - // Ready for another chunk - tp.add(doBlock); - } else if (stream.eof()) { - lastBlock = true; - } + // don't schedule a new block if we have enough lines + if (stream && !stream.eof() && (maxLines == -1 || doneLines < maxLines)) { + // Ready for another chunk + tp.add(doBlock); + } else if (stream.eof()) { + lastBlock = true; } int64_t chunkLineNumber = startLine; size_t lastLineOffset = lineOffsets[0]; - if (startBlock) - if (!startBlock(myChunkNumber, chunkLineNumber)) - return; + if (!emptyBlock && startBlock && !startBlock(myChunkNumber, chunkLineNumber, lineOffsets.size() - 1)) { + stop = true; + return; + } for (unsigned i = 1; i < lineOffsets.size() && (maxLines == -1 || returnedLines++ < maxLines); ++i) { - if (hasExc.load(std::memory_order_relaxed)) + if (stop.load(std::memory_order_relaxed)) return; const char * line = blockOut.get() + lastLineOffset; size_t len = lineOffsets[i] - lastLineOffset; @@ -473,26 +488,30 @@ void forEachLineBlock(std::istream & stream, auto fixedup = splitter.fixupBlock({line, len}); // if we are not at the last line - if (!lastBlock || fixedup.size() != 0 || i != lineOffsets.size() - 1) - if (!onLine(fixedup.data(), fixedup.size(), chunkNumber, chunkLineNumber++)) + if (!lastBlock || fixedup.size() != 0 || i != lineOffsets.size() - 1) { + if (!onLine(fixedup.data(), fixedup.size(), myChunkNumber, chunkLineNumber++)) { + stop = true; return; + } + } lastLineOffset = lineOffsets[i]; - } - if (endBlock) - if (!endBlock(myChunkNumber, chunkLineNumber)) + if (!emptyBlock && endBlock && !endBlock(myChunkNumber, chunkLineNumber, lineOffsets.size())) { + stop = true; return; - + } + } } MLDB_CATCH_ALL { if (hasExc.fetch_add(1) == 0) { exc = std::current_exception(); + stop = true; } } }; - // Run the first block, which will enqueue the second before exiting + // Run the first block, which will enqueue the second before exiting, and so on doBlock(); // Wait for all to be done @@ -503,6 +522,8 @@ void forEachLineBlock(std::istream & stream, if (hasExc) { std::rethrow_exception(exc); } + + return stop; } /*****************************************************************************/ @@ -519,9 +540,10 @@ void forEachLineBlock(std::shared_ptr content, int maxParallelism, std::function startBlock, + uint64_t numLinesInBlock)> startBlock, std::function endBlock, + int64_t lineNumber, + uint64_t numLinesInBlock)> endBlock, size_t blockSize, const BlockSplitter & splitter) { @@ -826,7 +848,7 @@ void forEachLineBlock(std::shared_ptr content, } if (endBlock) - if (!endBlock(chunkNumber, chunkLineNumber)) + if (!endBlock(chunkNumber, chunkLineNumber, numLines)) return false; } MLDB_CATCH_ALL { @@ -855,7 +877,7 @@ void forEachLineBlock(std::shared_ptr content, // last chunk with single last line is in the last queue entry if (!hasExc && !queues.empty()) { - cerr << "last one; queues.size() = " << queues.size() << endl; + //cerr << "last one; queues.size() = " << queues.size() << endl; size_t chunkNumber = queues.size() - 1; doBlock(chunkNumber, -1 /* offset */, FrozenMemoryRegion()); diff --git a/utils/for_each_line.h b/utils/for_each_line.h index d8f8046ad..069d260ce 100644 --- a/utils/for_each_line.h +++ b/utils/for_each_line.h @@ -212,20 +212,26 @@ forEachLineStr(const std::string & filename, the processing thread, at the beginning and end of the block respectively. + Returns true if and only if it was stopped by a lambda returning false. + In that case, the process will be stopped once all previous lambdas + have finished executing without any guarantees as to which lambdas + will be started in the meantime. + This is the second fastest way to parse a text file. */ -void forEachLineBlock(std::istream & stream, +bool forEachLineBlock(std::istream & stream, std::function onLine, int64_t maxLines = -1, int maxParallelism = 8, - std::function startBlock + std::function startBlock = nullptr, - std::function endBlock + std::function endBlock = nullptr, + ssize_t blockSize = -1, const BlockSplitter & splitter = newLineSplitter); /** Run the given lambda over every line read from the file, with the @@ -256,7 +262,8 @@ void forEachLineBlock(std::shared_ptr content, uint64_t numLines)> startBlock = nullptr, std::function endBlock + int64_t lineNumber, + uint64_t numLinesInBlock)> endBlock = nullptr, size_t blockSize = 20'000'000, const BlockSplitter & splitter = newLineSplitter); diff --git a/utils/testing/for_each_line_test.cc b/utils/testing/for_each_line_test.cc index feae0d5d4..fd599cce2 100644 --- a/utils/testing/for_each_line_test.cc +++ b/utils/testing/for_each_line_test.cc @@ -6,22 +6,21 @@ Test for_each_line */ -#define BOOST_TEST_MAIN -#define BOOST_TEST_DYN_LINK - #include #include #include #include -#include +#include #include "mldb/arch/exception.h" #include "mldb/utils/string_functions.h" #include "mldb/utils/vector_utils.h" #include "mldb/utils/for_each_line.h" #include "mldb/vfs/filter_streams.h" #include "mldb/block/content_descriptor.h" +#include "catch2/catch_all.hpp" using namespace std; +using namespace std::placeholders; using namespace MLDB; @@ -50,11 +49,11 @@ void testForEachLineBlock(const std::string & data, string url = "mem://testdata" + std::to_string(++testNumber); - cerr << endl; - cerr << "test " << testNumber << " with " - << splitLines.size() << " lines, " << startOffset << " start offset and " - << maxLines << " max lines" << endl; - cerr << "test has " << data.size() << " characters" << endl; + //cerr << endl; + //cerr << "test " << testNumber << " with " + // << splitLines.size() << " lines, " << startOffset << " start offset and " + // << maxLines << " max lines" << endl; + //cerr << "test has " << data.size() << " characters" << endl; { filter_ostream stream(url); @@ -80,7 +79,7 @@ void testForEachLineBlock(const std::string & data, return true; }; - auto onEndBlock = [&] (int64_t blockNumber, int64_t lineNumber) -> bool + auto onEndBlock = [&] (int64_t blockNumber, int64_t lineNumber, size_t numLinesInBlock) -> bool { ++numBlocksFinished; return true; @@ -89,12 +88,12 @@ void testForEachLineBlock(const std::string & data, auto onLine = [&] (const char * line, size_t length, int64_t blockNumber, int64_t lineNumber) -> bool { - BOOST_CHECK_EQUAL(lineNumber, numLines); - BOOST_CHECK_LT(lineNumber, splitLines.size()); + CHECK(lineNumber == numLines); + CHECK(lineNumber < splitLines.size()); if (lineNumber < splitLines.size()) { if (splitLines[lineNumber] != string(line, length)) cerr << "error on line " << lineNumber << endl; - BOOST_CHECK_EQUAL(splitLines[lineNumber], string(line, length)); + CHECK(splitLines[lineNumber] == string(line, length)); } ++numLines; return true; @@ -105,15 +104,15 @@ void testForEachLineBlock(const std::string & data, forEachLineBlock(content, startOffset, onLine, maxLines, maxParallelism, onStartBlock, onEndBlock, blockSize); - BOOST_CHECK_EQUAL(numLines, splitLines.size()); + CHECK(numLines == splitLines.size()); if (maxLines == -1) - BOOST_CHECK_EQUAL(numLinesInBlockTotal, numLines); - BOOST_CHECK_EQUAL(numBlocksStarted, numBlocksFinished); + CHECK(numLinesInBlockTotal == numLines); + CHECK(numBlocksStarted == numBlocksFinished); - cerr << "did " << numBlocksStarted << " blocks" << endl; + //cerr << "did " << numBlocksStarted << " blocks" << endl; } -BOOST_AUTO_TEST_CASE(test_forEachLineBlock) +TEST_CASE("test_forEachLineBlock") { /* 1 */ testForEachLineBlock("", 1 /* blockSize */, 0 /* startOffset */); /* 2 */ testForEachLineBlock("\n", 1 /* blockSize */, 0 /* startOffset */); @@ -147,7 +146,7 @@ vector dataStrings{"line1", "line2", "", "line forty 2"}; } -BOOST_AUTO_TEST_CASE( test_forEachLine_data ) +TEST_CASE(" test_forEachLine_data ") { vector expected(dataStrings); expected.emplace_back(""); @@ -165,10 +164,10 @@ BOOST_AUTO_TEST_CASE( test_forEachLine_data ) auto logger = getMldbLog("test"); forEachLine(stream, processLine, logger); - BOOST_CHECK_EQUAL(result, expected); + CHECK(result == expected); } -BOOST_AUTO_TEST_CASE( test_forEachLineStr_data ) +TEST_CASE(" test_forEachLineStr_data ") { vector expected(dataStrings); expected.emplace_back(""); @@ -186,10 +185,10 @@ BOOST_AUTO_TEST_CASE( test_forEachLineStr_data ) auto logger = getMldbLog("test"); forEachLineStr(stream, processLine, logger); - BOOST_CHECK_EQUAL(result, expected); + CHECK(result == expected); } -BOOST_AUTO_TEST_CASE( test_forEachLine_throw ) +TEST_CASE(" test_forEachLine_throw ") { string data; for (int i = 0; i < 1000; i++) { @@ -206,6 +205,307 @@ BOOST_AUTO_TEST_CASE( test_forEachLine_throw ) }; auto logger = getMldbLog("test"); - BOOST_CHECK_THROW(forEachLineStr(stream, processLine, logger), MLDB::Exception); + CHECK_THROWS(forEachLineStr(stream, processLine, logger)); +} + +TEST_CASE("split newlines") +{ + return; + const auto & splitter = newLineSplitter; + + for (auto filename: { "file://mldb/testing/MLDB-1043-bucketize-data.csv"}) { + filter_istream stream(filename); + + std::vector lines; + std::string withNewLines; + std::string withDosNewLines; + + while (stream) { + std::string line; + std::getline(stream, line); + lines.push_back(line); + withNewLines += line + "\n"; + withDosNewLines += line + "\r\n"; + } + + // Make sure the block padding is respected + withNewLines.reserve(withNewLines.size() + splitter.requiredBlockPadding()); + withDosNewLines.reserve(withDosNewLines.size() + splitter.requiredBlockPadding()); + + auto testSplitter = [&] (size_t blockSize, const char * data, const char * end) + { + int lineNum = 0; + auto checkLine = [&] (const std::string & line) + { + CHECK(line == lines[lineNum]); + ++lineNum; + }; + + const char * p = data; + + auto currentState = splitter.newState(); + //const char * lineStart = p; + //const char * blockStart = p; + std::string currentBlock; + + for (; p < end; p += blockSize) { + const char * e = p + blockSize; + if (e > end) e = end; + + std::string nextBlock(p, e); + + bool isLastBlock = e == end; + auto [newline_pos, newState] = splitter.nextBlock(currentBlock.c_str(), currentBlock.size(), nextBlock.c_str(), nextBlock.size(), + isLastBlock, currentState); + currentState = std::move(newState); + + std::string line; + if (newline_pos == 0) { + // No newline, we need a new block + currentBlock += nextBlock; + continue; + } + else if (newline_pos >= currentBlock.c_str() && newline_pos < currentBlock.c_str() + currentBlock.size()) { + // newline is in the current block + CHECK(*newline_pos == '\n'); + line = std::string(currentBlock.c_str(), newline_pos); + currentBlock = std::string(currentBlock, newline_pos - currentBlock.c_str() + 1); + } + else if (newline_pos >= nextBlock.c_str() && newline_pos < nextBlock.c_str() + nextBlock.size()) { + // Newline is in the next block + CHECK(*newline_pos == '\n'); + line = currentBlock + std::string(nextBlock.c_str(), newline_pos); + currentBlock = std::string(nextBlock, newline_pos - nextBlock.c_str() + 1); + } + else { + REQUIRE(false); + } + + checkLine(line); + } + }; + + for (auto blockSize: { 1, 5, 8, 11, 17, 231, 1024 }) { + SECTION("blockSize " + std::to_string(blockSize)) { + SECTION("Unix line endings") { + testSplitter(blockSize, withNewLines.c_str(), withNewLines.c_str() + withNewLines.size()); + } + SECTION("DOS line endings") { + testSplitter(blockSize, withDosNewLines.c_str(), withDosNewLines.c_str() + withDosNewLines.size()); + } + } + } + } } +struct ForEachLineTester { + ForEachLineTester() + : splitter(new NewlineSplitter()) + { + } + + bool debug = false; + bool blocked = true; + + std::unique_ptr splitter; + + atomic lineCount = 0; + + struct LineInfo { + std::string contents; + bool found = false; + }; + + struct BlockInfo { + int64_t blockNumber = -1; + int64_t firstLineNumber = -1; + uint64_t numLines = 0; + std::vector lines; + bool ended = false; + + LineInfo & getLineInfo(int64_t lineNum, bool blocked) + { + if (!blocked) { + static std::mutex linesMutex; // for unblocked only + REQUIRE(firstLineNumber == 0); + std::lock_guard guard(linesMutex); + if (lines.size() <= lineNum) { + lines.resize(lineNum + 1); + } + return lines[lineNum]; + } + else { + CHECK(lineNum >= firstLineNumber); + CHECK(lineNum < firstLineNumber + numLines); + REQUIRE(lineNum - firstLineNumber < lines.size()); + } + return lines[lineNum - firstLineNumber]; + } + }; + + // Call the first time we see a block + BlockInfo & addBlockInfo(int64_t blockNumber) + { + //CHECK(blockNumber < 50); + std::lock_guard guard(blockInfoMutex); + if (blocks.size() <= blockNumber) + blocks.resize(blockNumber + 1); + CHECK(blocks[blockNumber].blockNumber == -1); + return blocks[blockNumber]; + }; + + // Call after we've seen a block + BlockInfo & getBlockInfo(int64_t blockNumber) + { + std::lock_guard guard(blockInfoMutex); + + if (!blocked) { + CHECK(blockNumber == 0); + if (blocks.empty()) { + blocks.resize(1); + blocks[0].firstLineNumber = 0; + } + return blocks[0]; + } + + REQUIRE(blockNumber < blocks.size()); + CHECK(blocks[blockNumber].ended == false); + CHECK(blocks[blockNumber].blockNumber == blockNumber); + return blocks[blockNumber]; + }; + + std::mutex blockInfoMutex; + std::vector blocks; + + void processUsingBlockedStream(const std::string & filename, ssize_t blockSize = -1, ssize_t maxLines = -1, int maxParallelism = 0) + { + filter_istream stream(filename); + + forEachLineBlock(stream, + std::bind(&ForEachLineTester::processLine, this, _1, _2, _3, _4), + maxLines, maxParallelism, + std::bind(&ForEachLineTester::startBlock, this, _1, _2, _3), + std::bind(&ForEachLineTester::endBlock, this, _1, _2, _3), + blockSize, + *splitter); + } + + void processUsingBlockedMappedStream(const std::string & filename, ssize_t blockSize = -1, ssize_t maxLines = -1, int maxParallelism = 0) + { + filter_istream stream(filename, { { "mapped", "true" } } ); + + forEachLineBlock(stream, + std::bind(&ForEachLineTester::processLine, this, _1, _2, _3, _4), + maxLines, maxParallelism, + std::bind(&ForEachLineTester::startBlock, this, _1, _2, _3), + std::bind(&ForEachLineTester::endBlock, this, _1, _2, _3), + blockSize, + *splitter); + } + + void processUsingLineByLine(const std::string & filename, ssize_t maxLines = -1, int maxParallelism = 0) + { + this->blocked = false; + filter_istream stream(filename); + + forEachLine(stream, + std::bind(&ForEachLineTester::processLine, this, _1, _2, 0, _3), + getMldbLog("test"), + maxParallelism, + false /* ignore exceptions */, + maxLines); + } + + void processUsingContentDescriptor(const std::string & filename) + { + } + + bool processLine(const char * line, size_t length, int64_t blockNumber, int64_t lineNum) + { + if (debug) + cerr << "got line " << lineNum << " with length " << length << " at " << lineNum << " of block " << blockNumber << endl; + BlockInfo & blockInfo = getBlockInfo(blockNumber); + LineInfo & lineInfo = blockInfo.getLineInfo(lineNum, blocked); + lineInfo.contents = std::string(line, line + length); + lineInfo.found = true; + ++lineCount; + return true; + } + + bool startBlock(int64_t blockNumber, int64_t lineNumber, int64_t numLines) + { + if (debug) + cerr << "startBlock " << blockNumber << " with " << numLines << " lines from " << lineNumber << endl; + + BlockInfo & blockInfo = addBlockInfo(blockNumber); + blockInfo.blockNumber = blockNumber; + blockInfo.firstLineNumber = lineNumber; + blockInfo.numLines = numLines; + blockInfo.lines.resize(numLines); + + //REQUIRE(blockNumber < 5); + //return blockNumber < 5; + + return true; + } + + bool endBlock(int64_t blockNumber, int64_t lineNumber, int64_t numLines) + { + if (debug) + cerr << "endBlock " << blockNumber << " at " << lineNumber << endl; + BlockInfo & blockInfo = getBlockInfo(blockNumber); + blockInfo.ended = true; + return true; + } + + void validate() + { + for (auto & block: blocks) { + if (blocked) REQUIRE(block.ended); + for (auto & line: block.lines) { + REQUIRE(line.found); + } + } + } +}; + + +TEST_CASE("for_each_line newline splitter") +{ + for (auto blockSize: { -1 , 1, 2, 3, 5, 17, 1000000 }) { + SECTION("blockSize " + std::to_string(blockSize)) { + + SECTION("blocked stream") { + ForEachLineTester tester; + tester.processUsingBlockedStream("file://mldb/testing/MLDB-1043-bucketize-data.csv", blockSize); + tester.validate(); + } + + SECTION("blocked mapped stream") { + ForEachLineTester tester; + tester.processUsingBlockedMappedStream("file://mldb/testing/MLDB-1043-bucketize-data.csv", blockSize); + tester.validate(); + } + + SECTION("blocked gzip stream") { + ForEachLineTester tester; + tester.processUsingBlockedMappedStream("file://mldb/mldb_test_data/reviews_Digital_Music_5.json.zstd", blockSize, 100000 /* maxLines */); + tester.validate(); + } + + SECTION("line by line") { + ForEachLineTester tester; + tester.processUsingLineByLine("file://mldb/mldb_test_data/reviews_Digital_Music_5.json.zstd", blockSize, 1000 /* maxLines */); + tester.validate(); + }; + } + } + +#if 0 + SECTION("blocked filter stream") { + ForEachLineTester tester; + tester.processUsingBlockedStream("file://mldb/testing/MLDB-1043-bucketize-data.csv"); + tester.validate(); + } +#endif +} diff --git a/utils/testing/testing.mk b/utils/testing/testing.mk index 335ee1031..d4e1cb172 100644 --- a/utils/testing/testing.mk +++ b/utils/testing/testing.mk @@ -34,7 +34,7 @@ $(eval $(call test,environment_test,utils arch base,boost)) $(eval $(call test,string_functions_test,arch utils,boost)) $(eval $(call test,csv_parsing_test,arch utils base,boost)) $(eval $(call test,round_test,,boost)) -$(eval $(call test,for_each_line_test,utils log arch base block types value_description vfs,boost)) +$(eval $(call test,for_each_line_test,utils log arch base block types value_description vfs,catch2)) $(eval $(call test,floating_point_test,utils log arch base,boost)) $(eval $(call test,string_algorithm_test,base utils arch base value_description,catch2)) $(eval $(call test,lexical_cast_test,arch types value_description,catch2)) From 5872ffa92540af9b608b54ba51f12b2efac19f82 Mon Sep 17 00:00:00 2001 From: Jeremy Barnes Date: Sun, 19 Jan 2025 21:27:45 -0500 Subject: [PATCH 23/39] SQUASH for_each_line testing/fixes (5) --- arch/atomic_min_max.h | 33 ++++ block/content_descriptor.cc | 18 +- block/content_descriptor.h | 3 + block/testing/content_descriptor_test.cc | 13 +- plugins/behavior/mutable_behavior_domain.cc | 25 +-- utils/for_each_line.cc | 194 +++++++++++++++----- utils/testing/for_each_line_test.cc | 110 ++++++++--- 7 files changed, 297 insertions(+), 99 deletions(-) create mode 100644 arch/atomic_min_max.h diff --git a/arch/atomic_min_max.h b/arch/atomic_min_max.h new file mode 100644 index 000000000..0a5ec9a80 --- /dev/null +++ b/arch/atomic_min_max.h @@ -0,0 +1,33 @@ +// public domain + +#pragma once + +#include + +namespace MLDB { + +template +void atomic_min(std::atomic & val, T2 other) +{ + T current = val.load(std::memory_order_relaxed); + for (;;) { + if (other >= current) + return; + if (val.compare_exchange_weak(current, other, std::memory_order_relaxed)) + return; + } +} + +template +void atomic_max(std::atomic & val, T2 other) +{ + T current = val.load(std::memory_order_relaxed); + for (;;) { + if (other <= current) + return; + if (val.compare_exchange_weak(current, other, std::memory_order_relaxed)) + return; + } +} + +} // namespace MLDB \ No newline at end of file diff --git a/block/content_descriptor.cc b/block/content_descriptor.cc index a2b9bb8a7..d854bf008 100644 --- a/block/content_descriptor.cc +++ b/block/content_descriptor.cc @@ -123,6 +123,15 @@ DEFINE_VALUE_DESCRIPTION_NS(ContentHashes, ContentHashesDescription); /* CONTENT DESCRIPTOR */ /*****************************************************************************/ + +void +ContentDescriptor:: +addUrl(Utf8String url) +{ + ContentHash hash{"url", std::move(url)}; + content.emplace_back(std::move(hash)); +} + Url ContentDescriptor:: getUrl() const @@ -374,6 +383,8 @@ forEachBlockParallel(uint64_t startOffset, int maxParallelism, std::function fn) const { + constexpr bool debug = false; + if (debug) cerr << "ContentHandler foreachblockparallel" << endl; size_t offset = startOffset; std::atomic finished(false); @@ -389,6 +400,8 @@ forEachBlockParallel(uint64_t startOffset, std::tie(startOffset, region) = getRangeContaining(offset, requestedBlockSize); + if (debug) cerr << "startOffset = " << startOffset << " region = " << (bool)region << endl; + if (!region) break; @@ -396,6 +409,9 @@ forEachBlockParallel(uint64_t startOffset, ExcAssertEqual(toSkip, 0); size_t myBlockNumber = blockNumber++; + if (debug) cerr << "doing block " << myBlockNumber << " at offset " + << startOffset << " len " << region.length() << endl; + auto processBlock = [myBlockNumber, startOffset, region, &fn, &finished] () { @@ -403,7 +419,7 @@ forEachBlockParallel(uint64_t startOffset, finished = true; }; - if (maxParallelism == 1) + if (maxParallelism == 0) processBlock(); else tp.add(std::move(processBlock)); diff --git a/block/content_descriptor.h b/block/content_descriptor.h index db64c9d2e..ec18a8dce 100644 --- a/block/content_descriptor.h +++ b/block/content_descriptor.h @@ -80,6 +80,9 @@ PREDECLARE_VALUE_DESCRIPTION(ContentHashes); struct ContentDescriptor { ContentHashes content; + // Add a single (non-hashed) URL to enable it to be used in place of legacy URLs + void addUrl(Utf8String url); + Url getUrl() const; Utf8String getUrlString() const; std::u8string getUrlStringUtf8() const; diff --git a/block/testing/content_descriptor_test.cc b/block/testing/content_descriptor_test.cc index 4f91610e0..857ee8552 100644 --- a/block/testing/content_descriptor_test.cc +++ b/block/testing/content_descriptor_test.cc @@ -1,4 +1,4 @@ -/* filter_streams_test.cc +/* content_descriptor_test.cc Jeremy Barnes, 29 June 2011 Copyright (c) 2011 mldb.ai inc. Copyright (c) 2011 Jeremy Barnes. @@ -13,6 +13,7 @@ #include "mldb/block/content_descriptor.h" #include "mldb/types/value_description.h" #include "mldb/types/json.h" +#include "mldb/arch/atomic_min_max.h" #include @@ -154,15 +155,15 @@ BOOST_AUTO_TEST_CASE( test_parallel_decompress_zstd ) ContentDescriptor descriptor = jsonDecode("file://" + input_file); std::shared_ptr handler = getDecompressedContent(descriptor); - std::atomic numBlocks{0}, totalLength{0}, numParallel{0}, maxNumParallel{0}; + std::atomic numBlocks{0}, totalLength{0}, numParallel{0}, maxNumParallel{0}, minBlock(10000000), maxBlock(0); auto onBlock = [&] (size_t blockNum, uint64_t blockOffset, FrozenMemoryRegion block) { auto par = numParallel.fetch_add(1) + 1; - auto mnp = maxNumParallel.load(); - while (par > mnp && !maxNumParallel.compare_exchange_weak(mnp, std::max(mnp, par))) - ; + atomic_max(maxNumParallel, par); + atomic_min(minBlock, blockNum); + atomic_max(maxBlock, blockNum); numBlocks.fetch_add(1); totalLength.fetch_add(block.length()); @@ -183,4 +184,6 @@ BOOST_AUTO_TEST_CASE( test_parallel_decompress_zstd ) BOOST_CHECK_EQUAL(totalLength, 88964528); BOOST_CHECK_EQUAL(numParallel, 0); BOOST_CHECK_GT(maxNumParallel, 1); + BOOST_CHECK_EQUAL(minBlock, 0); + BOOST_CHECK_EQUAL(maxBlock, 678); } diff --git a/plugins/behavior/mutable_behavior_domain.cc b/plugins/behavior/mutable_behavior_domain.cc index 4362aaee9..c87b75101 100644 --- a/plugins/behavior/mutable_behavior_domain.cc +++ b/plugins/behavior/mutable_behavior_domain.cc @@ -15,35 +15,12 @@ #include "mldb/types/value_description.h" #include "mldb/base/parallel_merge_sort.h" #include "mldb/utils/possibly_dynamic_buffer.h" +#include "mldb/arch/atomic_min_max.h" using namespace std; namespace MLDB { -template -void atomic_min(std::atomic & val, T other) -{ - T current = val.load(std::memory_order_relaxed); - for (;;) { - if (other >= current) - return; - if (val.compare_exchange_weak(current, other, std::memory_order_relaxed)) - return; - } -} - -template -void atomic_max(std::atomic & val, T other) -{ - T current = val.load(std::memory_order_relaxed); - for (;;) { - if (other <= current) - return; - if (val.compare_exchange_weak(current, other, std::memory_order_relaxed)) - return; - } -} - void atomic_min(std::atomic & val, Date other) { atomic_min(val, other.secondsSinceEpoch()); diff --git a/utils/for_each_line.cc b/utils/for_each_line.cc index 80220989f..07091e129 100644 --- a/utils/for_each_line.cc +++ b/utils/for_each_line.cc @@ -13,6 +13,7 @@ #include #include #include "mldb/ext/concurrentqueue/blockingconcurrentqueue.h" +#include #include "mldb/vfs/filter_streams.h" #include "mldb/base/thread_pool.h" #include "mldb/base/exc_assert.h" @@ -21,6 +22,9 @@ #include "mldb/base/hex_dump.h" #include "mldb/block/content_descriptor.h" #include "mldb/arch/spinlock.h" +#include "mldb/arch/atomic_min_max.h" +#include "mldb/base/scope.h" +#include "mldb/utils/scoreboard.h" using namespace std; using moodycamel::BlockingConcurrentQueue; @@ -201,21 +205,20 @@ forEachLineStr(std::istream & stream, int64_t maxLines) { Processing processing; + if (numThreads == -1) + numThreads = numCpus(); - std::vector threads; - for (unsigned i = 0; i < numThreads; ++i) - threads.emplace_back(std::bind(parseLinesThreadStr, - std::ref(processing), - std::ref(processLine), - logger)); + ThreadPool tp(ThreadPool::instance(), numThreads); + + for (unsigned i = 0; i == 0 || i < numThreads; ++i) + tp.add(std::bind(parseLinesThreadStr, std::ref(processing), std::ref(processLine), logger)); size_t result = readStream(stream, processing, logger, ignoreStreamExceptions, maxLines); processing.shutdown = true; - for (auto & t: threads) - t.join(); + tp.waitForAll(); if (processing.hasException()) { std::rethrow_exception(processing.excPtr); @@ -276,6 +279,8 @@ bool forEachLineBlock(std::istream & stream, ThreadPool tp(ThreadPool::instance(), maxParallelism); + constexpr bool debug = false; + // Memory map if possible const char * mapped = nullptr; size_t mappedSize = 0; @@ -328,12 +333,14 @@ bool forEachLineBlock(std::istream & stream, if (stop.load(std::memory_order_relaxed)) return; + if (debug) cerr << "starting block at " << startLine << endl; + try { //MLDB-1426 if (mapped) { std::streamsize pos = stream.tellg(); - //cerr << "memory mapped for each line at pos " << pos << " of " << mappedSize << endl; + if (debug) cerr << "memory mapped for each line at pos " << pos << " of " << mappedSize << endl; if (mappedSize == 0 || pos == EOF) return; // EOF, so nothing to read... probably empty @@ -381,6 +388,8 @@ bool forEachLineBlock(std::istream & stream, [] (const char *) {}); } else { // not memory mapped + if (debug) cerr << "block is not memory mapped" << endl; + // How far through our block are we? std::shared_ptr block = nextBlock; @@ -397,7 +406,7 @@ bool forEachLineBlock(std::istream & stream, size_t offset = blockUsed; // First line starts at offset 0 - //cerr << "starting block with istream: eof = " << stream.eof() << " offset = " << offset << " blockUsed " << blockUsed << " thisBlockSize " << thisBlockSize << endl; + if (debug) cerr << "starting block with istream: eof = " << stream.eof() << " offset = " << offset << " blockUsed " << blockUsed << " thisBlockSize " << thisBlockSize << endl; while (stream && !stream.eof() && (maxLines == -1 || doneLines < maxLines) //stop processing new line when we have enough @@ -409,7 +418,7 @@ bool forEachLineBlock(std::istream & stream, // Check how many bytes we actually read size_t bytesRead = stream.gcount(); - //cerr << "read " << bytesRead << " characters" << endl; + if (debug) cerr << "read " << bytesRead << " characters" << endl; offset += bytesRead; @@ -417,7 +426,7 @@ bool forEachLineBlock(std::istream & stream, const char * current = block.get() + lineOffsets.back(); const char * end = block.get() + offset; - while (current && current < end) { + while (current && current < end && (maxLines == -1 || doneLines < maxLines)) { std::tie(current, splitterState) = splitter.nextBlock(current, end - current, nullptr, 0, stream.eof(), splitterState); @@ -474,12 +483,27 @@ bool forEachLineBlock(std::istream & stream, int64_t chunkLineNumber = startLine; size_t lastLineOffset = lineOffsets[0]; + size_t numLinesInBlock = lineOffsets.size() - 1; + if (maxLines != -1) + ExcAssertLessEqual(numLinesInBlock + startLine, maxLines); + if (!emptyBlock && startBlock && !startBlock(myChunkNumber, chunkLineNumber, lineOffsets.size() - 1)) { stop = true; return; } - for (unsigned i = 1; i < lineOffsets.size() && (maxLines == -1 || returnedLines++ < maxLines); ++i) { + if (debug) + cerr << "passing on " << lineOffsets.size() - 1 << " lines in chunk " << myChunkNumber << endl; + + size_t returnedLinesAtStart = returnedLines; + size_t returnedLinesFromThisBlock = 0; + + for (unsigned i = 1; i < lineOffsets.size() && (maxLines == -1 || returnedLines < maxLines); ++i) { + + if (debug && myChunkNumber == 88) { + cerr << "maxLines = " << maxLines << " returnedLines = " << returnedLines << " lastBlock = " << lastBlock << endl; + } + if (stop.load(std::memory_order_relaxed)) return; const char * line = blockOut.get() + lastLineOffset; @@ -489,15 +513,32 @@ bool forEachLineBlock(std::istream & stream, // if we are not at the last line if (!lastBlock || fixedup.size() != 0 || i != lineOffsets.size() - 1) { + ++returnedLines; + ++returnedLinesFromThisBlock; + if (debug && myChunkNumber == 88) { + cerr << "line " << i << " of " << lineOffsets.size() << " in chunk " << myChunkNumber << endl; + //cerr << " line is " << string(line, len) << endl; + //cerr << " fixedup is " << string(fixedup.data(), fixedup.size()) << endl; + } if (!onLine(fixedup.data(), fixedup.size(), myChunkNumber, chunkLineNumber++)) { + if (debug && myChunkNumber == 88) + cerr << " STOPPING" << endl; stop = true; return; } + if (debug && myChunkNumber == 88) cerr << " CONTINUING" << endl; + + } else { + cerr << "*** skipped line " << returnedLines << " with lastBlock = " << lastBlock << " and fixedup size = " << fixedup.size() << endl; } lastLineOffset = lineOffsets[i]; } + //cerr << "returnedLines was " << returnedLinesAtStart << " now " << returnedLines << " from this block " << returnedLinesFromThisBlock << endl; + //cerr << "compared to " << returnedLines - returnedLinesAtStart << " from this block" << endl; + ExcAssertEqual(returnedLines, returnedLinesAtStart + returnedLinesFromThisBlock); + if (!emptyBlock && endBlock && !endBlock(myChunkNumber, chunkLineNumber, lineOffsets.size())) { stop = true; return; @@ -559,31 +600,57 @@ void forEachLineBlock(std::shared_ptr content, std::any splitterState; }; - // Set of queues, one per block, that grows with the amount of data - // TODO: make this a deque so we can remove early entries - Spinlock queuesMutex; - std::vector > > queues; - queues.reserve(1024); - queues.emplace_back(new BlockingConcurrentQueue()); - - auto getQueues = [&] (size_t blockNumber) - -> std::pair >, - std::shared_ptr > > - { - std::unique_lock guard(queuesMutex); - while (blockNumber + 1 >= queues.size()) - queues.emplace_back(new BlockingConcurrentQueue()); - return { queues[blockNumber], queues[blockNumber + 1] }; - }; + constexpr bool debug = false; + constexpr bool debug_lines = debug && false; + + // Set of promises, one per block, for the previous block to use to pass information + // to the next block. We use a map so that we can remove early entries. Each block gets + // information from the promise blockNum and writes its output information to the + // promise blockNum + 1. Each block is responsible for removing its input promise from + // the map once it's done with it. + + Spinlock promisesMutex; + std::map> promises; + auto getPromises = [&] (size_t blockNumber) -> std::pair, std::promise *> + { + if (debug) { + cerr << "getting promises for block " << blockNumber << endl; + cerr << " current exists: " << promises.count(blockNumber) << endl; + cerr << " next exists: " << promises.count(blockNumber + 1) << endl; + } + std::unique_lock guard(promisesMutex); + //ExcAssert(promises.count(blockNumber)); + //ExcAssert(!promises.count(blockNumber + 1)); + auto future = promises[blockNumber].get_future(); + ExcAssert(future.valid()); + return { std::move(future), &promises[blockNumber + 1] }; + }; + auto doneBlock = [&] (size_t blockNumber) + { + std::unique_lock guard(promisesMutex); + promises.erase(blockNumber); + }; + + std::atomic highestChunkNumber(-1); + auto doBlock - = [&hasExc,&exc,maxLines,&onLine,&startBlock,&endBlock,&getQueues, &splitter] + = [&hasExc,&exc,maxLines,&onLine,&startBlock,&endBlock,&getPromises, &splitter, &doneBlock, &highestChunkNumber] (int chunkNumber, uint64_t offset, FrozenMemoryRegion mem) -> bool { - //cerr << "chunk " << chunkNumber << " with " << mem.length() << " bytes" << endl; + atomic_max(highestChunkNumber, chunkNumber); + if (debug) { + cerr << "processing chunk " << chunkNumber << " with " << mem.length() << " bytes" << endl; + std::string data(mem.data(), mem.data() + mem.length()); + if (data.length() > 100) { + data.resize(100); + data += "..."; + } + cerr << " mem is " << data << endl; + } // Contains the full first line of our block, which is made up // of whatever was leftover from the previous block plus @@ -599,10 +666,10 @@ void forEachLineBlock(std::shared_ptr content, // What we got from the last block PassToNextBlock fromPrev; - std::shared_ptr > - fromPrevQueue, toNextQueue; - std::tie(fromPrevQueue, toNextQueue) = getQueues(chunkNumber); - + auto [fromPrevFuture, toNextPromise] = getPromises(chunkNumber); + + if (debug) cerr << " got promises" << endl; + // Call this to tell the next block that it should bail out. It's // safe to call at any time, including before the next block has // been launched and after the next block has already been told to @@ -611,7 +678,7 @@ void forEachLineBlock(std::shared_ptr content, { PassToNextBlock toNext; toNext.bail = true; - toNextQueue->enqueue(std::move(toNext)); + toNextPromise->set_value(std::move(toNext)); }; if (splitter.isStateless()) { @@ -688,8 +755,15 @@ void forEachLineBlock(std::shared_ptr content, bailNextBlock(); return false; } - - fromPrevQueue->wait_dequeue(fromPrev); + + if (debug) cerr << " waiting for previous queue..." << endl; + + //fromPrevFuture.wait(); + fromPrev = fromPrevFuture.get(); + if (debug) cerr << " done waiting for previous queue..." << endl; + + // We no longer need the entry in the promises map + doneBlock(chunkNumber); // Do we bail out? If our previous block says it has bailed, // then we should too. @@ -700,6 +774,17 @@ void forEachLineBlock(std::shared_ptr content, FrozenMemoryRegion leftoverFromPreviousBlock = std::move(fromPrev.leftoverFromPreviousBlock); + + if (debug) { + cerr << " had " << leftoverFromPreviousBlock.length() << " bytes leftover from previous block" << endl; + std::string leftoverStr(leftoverFromPreviousBlock.data(), leftoverFromPreviousBlock.length()); + if (leftoverStr.length() > 100) { + leftoverStr.resize(100); + leftoverStr += "..."; + } + cerr << " " << leftoverStr << endl; + } + int64_t startLine = fromPrev.doneLines; std::any splitterState = std::move(fromPrev.splitterState); @@ -715,6 +800,8 @@ void forEachLineBlock(std::shared_ptr content, FrozenMemoryRegion firstRecord; bool noMoreData = mem.length() == 0; // We signal the last block by sending over a null block + if (debug) cerr << " noMoreData = " << noMoreData << endl; + //cerr << "leftoverFromPreviousBlock.length() = " << leftoverFromPreviousBlock.length() << endl; //cerr << "mem.length() = " << mem.length() << endl; @@ -742,6 +829,8 @@ void forEachLineBlock(std::shared_ptr content, current = 0; } + if (debug) cerr << " lengths: prev block = " << end1 - start1 << ", this block = " << end2 - start2 << endl; + // Scan the combined leftover and new blocks, normally it should only be once // to complete the partial last record. while (current && current >= start1 && current < end1) { @@ -749,6 +838,7 @@ void forEachLineBlock(std::shared_ptr content, //cerr << "doing current line" << endl; auto [newCurrent, newState] = splitter.nextBlock(current, end1 - current, start2, end2 - start2, noMoreData, splitterState); if (!newCurrent) { + if (debug) cerr << " *** no break in the whole block, continuing" << endl; // No break in the whole lot... it's all a partial record leftover = FrozenMemoryRegion::combined(leftoverFromPreviousBlock, mem); current = nullptr; @@ -756,6 +846,8 @@ void forEachLineBlock(std::shared_ptr content, } if (newCurrent >= start1 && newCurrent < end1) { + if (debug_lines) cerr << " *** got line in first block at position " << newCurrent - start1 << endl; + if (debug_lines) cerr << " adding line " << string(current, newCurrent - start1) << endl; lines.emplace_back(current, newCurrent - current); } else { @@ -770,16 +862,28 @@ void forEachLineBlock(std::shared_ptr content, ExcAssertGreaterEqual((const void *)newCurrent, (const void *)start2); ExcAssertLessEqual((const void *)newCurrent, (const void *)end2); //cerr << "doing combined" << endl; + if (debug_lines) cerr << " *** got line in the second block at position " << newCurrent - start2 << endl; + if (debug_lines) { + cerr << "combining " << string(leftoverFromPreviousBlock.data(), 0, leftoverFromPreviousBlock.length()) + << " with " << string(current, end1) + << " and " << string(start2, newCurrent) << endl; + } firstRecord = FrozenMemoryRegion::combined(leftoverFromPreviousBlock, mem.rangeAtStart(newCurrent - start2)); lines.emplace_back(firstRecord.data(), firstRecord.length()); + if (debug_lines) cerr << " adding line " << string(firstRecord.data(), firstRecord.length()) << endl; } //cerr << "got first line " << string(lines.back().data(), lines.back().size()) << endl; current = newCurrent; splitterState = std::move(newState); } + if (debug) cerr << " got " << lines.size() << " lines" << endl; + // Scan the current block while (current && current >= start2 && current < end2) { + if (startLine + lines.size() >= maxLines) + break; + auto [newCurrent, newState] = splitter.nextBlock(current, end2 - current, nullptr, 0, noMoreData, splitterState); if (!newCurrent) { // We've gotten all we can @@ -803,6 +907,7 @@ void forEachLineBlock(std::shared_ptr content, } uint64_t doneLines = startLine + lines.size(); + if (debug) cerr << " doneLines = " << doneLines << endl; if (maxLines == -1 || doneLines < maxLines) { // What we pass on to the next block @@ -810,7 +915,7 @@ void forEachLineBlock(std::shared_ptr content, toNext.leftoverFromPreviousBlock = std::move(leftover); toNext.doneLines = doneLines; toNext.splitterState = std::move(splitterState); - toNextQueue->enqueue(std::move(toNext)); + toNextPromise->set_value(std::move(toNext)); } else { bailNextBlock(); @@ -871,14 +976,17 @@ void forEachLineBlock(std::shared_ptr content, PassToNextBlock pass; pass.doneLines = 0; pass.splitterState = splitter.newState(); - queues[0]->enqueue(std::move(pass)); + { + std::unique_lock guard(promisesMutex); + promises[0].set_value(std::move(pass)); + } content->forEachBlockParallel(startOffset, blockSize, maxParallelism, doBlock); // last chunk with single last line is in the last queue entry - if (!hasExc && !queues.empty()) { - //cerr << "last one; queues.size() = " << queues.size() << endl; - size_t chunkNumber = queues.size() - 1; + if (!hasExc && !promises.empty()) { + if (debug) cerr << "last one; promises.size() = " << promises.size() << endl; + size_t chunkNumber = highestChunkNumber + 1; doBlock(chunkNumber, -1 /* offset */, FrozenMemoryRegion()); #if 0 diff --git a/utils/testing/for_each_line_test.cc b/utils/testing/for_each_line_test.cc index fd599cce2..c5e447d76 100644 --- a/utils/testing/for_each_line_test.cc +++ b/utils/testing/for_each_line_test.cc @@ -306,6 +306,7 @@ struct ForEachLineTester { bool debug = false; bool blocked = true; + ssize_t maxLines = -1; std::unique_ptr splitter; @@ -388,6 +389,8 @@ struct ForEachLineTester { std::bind(&ForEachLineTester::endBlock, this, _1, _2, _3), blockSize, *splitter); + + this->maxLines = maxLines; } void processUsingBlockedMappedStream(const std::string & filename, ssize_t blockSize = -1, ssize_t maxLines = -1, int maxParallelism = 0) @@ -401,6 +404,8 @@ struct ForEachLineTester { std::bind(&ForEachLineTester::endBlock, this, _1, _2, _3), blockSize, *splitter); + + this->maxLines = maxLines; } void processUsingLineByLine(const std::string & filename, ssize_t maxLines = -1, int maxParallelism = 0) @@ -414,10 +419,26 @@ struct ForEachLineTester { maxParallelism, false /* ignore exceptions */, maxLines); + + this->maxLines = maxLines; } - void processUsingContentDescriptor(const std::string & filename) + void processUsingContentDescriptor(const std::string & filename, ssize_t blockSize = -1, ssize_t maxLines = -1, int maxParallelism = 0) { + ContentDescriptor descriptor; + descriptor.addUrl(filename); + auto content = getContent(descriptor); + + forEachLineBlock(content, + 0 /* startOffset */, + std::bind(&ForEachLineTester::processLine, this, _1, _2, _3, _4), + maxLines, maxParallelism, + std::bind(&ForEachLineTester::startBlock, this, _1, _2, _3), + std::bind(&ForEachLineTester::endBlock, this, _1, _2, _3), + blockSize, + *splitter); + + this->maxLines = maxLines; } bool processLine(const char * line, size_t length, int64_t blockNumber, int64_t lineNum) @@ -429,6 +450,8 @@ struct ForEachLineTester { lineInfo.contents = std::string(line, line + length); lineInfo.found = true; ++lineCount; + if (maxLines != -1) + CHECK(lineNum < maxLines); return true; } @@ -452,7 +475,7 @@ struct ForEachLineTester { bool endBlock(int64_t blockNumber, int64_t lineNumber, int64_t numLines) { if (debug) - cerr << "endBlock " << blockNumber << " at " << lineNumber << endl; + cerr << "endBlock " << blockNumber << " at " << lineNumber << " with " << numLines << " lines" << endl; BlockInfo & blockInfo = getBlockInfo(blockNumber); blockInfo.ended = true; return true; @@ -460,47 +483,82 @@ struct ForEachLineTester { void validate() { + int b = 0; for (auto & block: blocks) { if (blocked) REQUIRE(block.ended); + int n = 0; for (auto & line: block.lines) { + if (!line.found) + cerr << "line not found: line " << n << " of block " << b << " of " << blocks.size() + << " (" << b + block.firstLineNumber << " of " << lineCount.load() << " in file)" << endl; REQUIRE(line.found); + ++n; } + ++b; } + + if (maxLines != -1) + CHECK(lineCount == maxLines); } }; TEST_CASE("for_each_line newline splitter") { - for (auto blockSize: { -1 , 1, 2, 3, 5, 17, 1000000 }) { - SECTION("blockSize " + std::to_string(blockSize)) { - - SECTION("blocked stream") { - ForEachLineTester tester; - tester.processUsingBlockedStream("file://mldb/testing/MLDB-1043-bucketize-data.csv", blockSize); - tester.validate(); - } + for (auto parallelism: { 0, 1, -1 }) { + SECTION("parallelism " + std::to_string(parallelism)) { + cerr << "parallelism " << parallelism << endl; + for (auto blockSize: { -1, 1, 2, 3, 5, 17, 1000000 }) { + SECTION("blockSize " + std::to_string(blockSize)) { + cerr << "blockSize " << blockSize << endl; +#if 1 + SECTION("blocked stream") { + ForEachLineTester tester; + tester.processUsingBlockedStream("file://mldb/testing/MLDB-1043-bucketize-data.csv", blockSize); + tester.validate(); + } + + // Mapping requires the file to be non-compressed + SECTION("blocked mapped stream") { + ForEachLineTester tester; + tester.processUsingBlockedMappedStream("file://mldb/testing/MLDB-1043-bucketize-data.csv", blockSize); + tester.validate(); + } +#endif - SECTION("blocked mapped stream") { - ForEachLineTester tester; - tester.processUsingBlockedMappedStream("file://mldb/testing/MLDB-1043-bucketize-data.csv", blockSize); - tester.validate(); - } + SECTION("blocked gzip stream") { + ForEachLineTester tester; + tester.processUsingBlockedMappedStream("file://mldb/mldb_test_data/reviews_Digital_Music_5.json.zstd", blockSize, 64000 /* maxLines */); + tester.validate(); + } + +#if 1 + SECTION("line by line") { + ForEachLineTester tester; + tester.processUsingLineByLine("file://mldb/mldb_test_data/reviews_Digital_Music_5.json.zstd", 1000 /* maxLines */); + tester.validate(); + }; +#endif - SECTION("blocked gzip stream") { - ForEachLineTester tester; - tester.processUsingBlockedMappedStream("file://mldb/mldb_test_data/reviews_Digital_Music_5.json.zstd", blockSize, 100000 /* maxLines */); - tester.validate(); +#if 1 + SECTION("blocked content descriptor") { + ForEachLineTester tester; + tester.processUsingContentDescriptor("file://mldb/testing/MLDB-1043-bucketize-data.csv", blockSize); + tester.validate(); + } + + if (blockSize > 5) { + SECTION("blocked content descriptor large stream") { + ForEachLineTester tester; + tester.processUsingContentDescriptor("file://mldb/mldb_test_data/train-1m.csv.lz4", blockSize, 100000 /* maxLines */); + tester.validate(); + } + } +#endif + } } - - SECTION("line by line") { - ForEachLineTester tester; - tester.processUsingLineByLine("file://mldb/mldb_test_data/reviews_Digital_Music_5.json.zstd", blockSize, 1000 /* maxLines */); - tester.validate(); - }; } } - #if 0 SECTION("blocked filter stream") { ForEachLineTester tester; From 7b9a516b221b449bce67ad2393a14c486edd238a Mon Sep 17 00:00:00 2001 From: Jeremy Barnes Date: Mon, 20 Jan 2025 07:40:25 -0500 Subject: [PATCH 24/39] Added scoreboard task to track parallel execution of a sequence of tasks --- utils/scoreboard.h | 263 +++++++++++++++++++++++++++++++ utils/testing/scoreboard_test.cc | 131 +++++++++++++++ utils/testing/testing.mk | 1 + 3 files changed, 395 insertions(+) create mode 100644 utils/scoreboard.h create mode 100644 utils/testing/scoreboard_test.cc diff --git a/utils/scoreboard.h b/utils/scoreboard.h new file mode 100644 index 000000000..998da3afa --- /dev/null +++ b/utils/scoreboard.h @@ -0,0 +1,263 @@ +/* scoreboard.h + Jeremy Barnes, 21 February 2007 + This file is part of MLDB. Copyright 2015 mldb.ai inc. All rights reserved. + + Scoreboard for keeping track of the progress of multithreaded operations. +*/ + +#pragma once + +#include +#include +#include +#include +#include +#include "mldb/arch/spinlock.h" +#include "mldb/compiler/compiler.h" +#include "mldb/arch/exception.h" +#include "mldb/base/exc_check.h" +#include "mldb/base/exc_assert.h" + +namespace MLDB { + +/*****************************************************************************/ +/* SCOREBOARD */ +/*****************************************************************************/ + +/** This structure allows us to keep track of the in progress and done + status of work that is done across multiple threads. + + The work is conceptually split into work items, which are numbered + sequentially from zero. + + When a thread begins working on a work item, it calls beginWorkItem(). + + When it finishes, it calls endWorkItem(). This will return the number of + the previous highest work item done, and the number of the new highest + work item done. If there is cleanup to be done once a work item ends, + then it can be done by that thread. + + The highestFinishedWorkItem() method returns the index of the highest + work item that has been completed. Note that there may be earlier work + items not completed. + + The highestInProgressWorkItem() method returns the index of the highest + work item that is in progress. + + The progress() method returns the highest item which is both done and all + of the previous work items are done. + + This structure is thread-safe. Initial implementation is via a spinlock + but it could probably be made lock-free without changing the contract + too much if it were to become a bottleneck (probably not due to the + expectation that the work items should be large & they can be pre- + chunked if necessary). +*/ + +using namespace std; + +struct LinearScoreboard { + + LinearScoreboard(size_t maxInProgressWorkItems = 128) + : maxInProgressWorkItems_(maxInProgressWorkItems), + workItems_(maxInProgressWorkItems * 8, WorkItemState::NOT_STARTED) + { + } + + /** Begin work new work item n. Will return true if this is the first + thread to work on the item, or false if another thread has already + started it. + + If this thread is too far ahead (index is more than + maxInProgressWorkItems_ ahead of the highestInProgressWorkItem_), + then it will return false. + + Output: + - If started is true, then tooFarAhead is false, and the item started + - Otherwise, if tooFarAhead is true, then started is false, and the + item was not started because the rest of the work needs to catch up. + This thread should probably either wait or contribute to the work + already in progress. + - If both are false, then the item was already in progress and this + thread should not do anything. This may indicate a logic error in + the program. + */ + struct BeginWorkItemResult { + bool started = false; + bool tooFarAhead = false; + }; + + BeginWorkItemResult beginWorkItem(size_t index) MLDB_WARN_UNUSED_RESULT + { + //cerr << endl << "Begin work item " << index << endl; + //dumpState(); + //cerr << endl; + std::unique_lock guard(mutex_); + ExcCheckGreaterEqual(index, workItemsBase_, "attempting to restart old work item"); + size_t i = index - workItemsBase_; + if (i >= earliestNonCompletedItem_ + maxInProgressWorkItems_) { + // Too many in progress + return { false, true }; + } + ExcAssert(i < workItems_.size()); + if (workItems_[i] != WorkItemState::NOT_STARTED) { + // Already started + return { false, false }; + } + + ++workItemsStarted_; + + workItems_[i] = WorkItemState::IN_PROGRESS; + if (index >= nextWorkItem_) { + nextWorkItem_ = index + 1; + } + + // Started + return { true, false }; + } + + /** End work on a work item. Returns the number of the work item that + was in progress before this one, and the number of the work item + that is now in progress. */ + + struct EndWorkItemResult { + int64_t prevEarliestUncompletedWork = -1; + int64_t newEarliestUncompletedWork = -1; + int64_t count() const { return newEarliestUncompletedWork - prevEarliestUncompletedWork; } + }; + + EndWorkItemResult endWorkItem(size_t index) + { + //cerr << "endWorkItem " << index << endl; + //dumpState(); + std::unique_lock guard(mutex_); + ExcCheckGreaterEqual(index, workItemsBase_, "attempting to restart old work item"); + size_t i = index - workItemsBase_; + ExcAssert(i < workItems_.size()); + if (workItems_[i] != WorkItemState::IN_PROGRESS) { + // Not started or already finished + MLDB_THROW_LOGIC_ERROR("attempt to finish unstarted or previously finished work item %d", (int)index); + } + + ++workItemsCompleted_; + + EndWorkItemResult result; + result.prevEarliestUncompletedWork = earliestNonCompletedItem_; + + workItems_[i] = WorkItemState::DONE; + if (index == earliestNonCompletedItem_) { + // Find the next earliest work item + while (earliestNonCompletedItem_ < nextWorkItem_ && + workItems_[earliestNonCompletedItem_ - workItemsBase_] == WorkItemState::DONE) { + ++earliestNonCompletedItem_; + } + } + + size_t numUnused = earliestNonCompletedItem_ - workItemsBase_ - 1; + if (numUnused + maxInProgressWorkItems_ > workItems_.size()) { + //cerr << endl << "SHIFTING by " << numUnused << endl; + //dumpState(); + //cerr << "numUnused = " << numUnused << " maxInProgressWorkItems_ = " << maxInProgressWorkItems_ << " workItems_.size() = " << workItems_.size() << endl; + //cerr << "earliestNonCompletedItem_ = " << earliestNonCompletedItem_ << " workItemsBase_ = " << workItemsBase_ << endl; + std::copy(workItems_.begin() + numUnused, workItems_.end(), workItems_.begin()); + std::fill(workItems_.begin() + workItems_.size() - numUnused, workItems_.end(), WorkItemState::NOT_STARTED); + workItemsBase_ += numUnused; + //cerr << "state after shift: " << endl; + //dumpState(); + } + + result.newEarliestUncompletedWork = earliestNonCompletedItem_; + return result; + } + + ssize_t earliestNonCompletedItem() const + { + std::unique_lock guard(mutex_); + return earliestNonCompletedItem_; + } + +#if 0 + /** Return the highest work item that has been completed. */ + ssize_t highestFinishedWorkItem() const + { + std::unique_lock guard(mutex_); + return highestFinishedWorkItem_; + } + + /** Return the highest work item that is in progress, or nothing + if no work is in progress. */ + std::optional highestInProgressWorkItem() const + { + std::unique_lock guard(mutex_); + ssize_t result = nextWorkItem_ - 1; + return result == earliestNonCompletedItem_ ? std::nullopt : std::optional(result); + } +#endif + + /** Return the highest work item that is both done and all of the previous + work items are done, plus one. + + If zero work items have been submitted, progress is zero. + If 100 work items have been submitted and all are done, progress is 100. + If 100 work items have been submitted and all are done apart from the first, progress is zero. + */ + size_t progress() const + { + std::unique_lock guard(mutex_); + return earliestNonCompletedItem_; + } + + void dumpState() const + { + auto dumpItemState = [] (WorkItemState state) -> char { + return state == WorkItemState::NOT_STARTED ? 'N' : + state == WorkItemState::IN_PROGRESS ? 'I' : 'D'; + }; + + cerr << "earliestNonCompletedItem_ = " << earliestNonCompletedItem_ << endl; + cerr << "nextWorkItem_ = " << nextWorkItem_ << endl; + cerr << "workItemsBase_ = " << workItemsBase_ << endl; + cerr << "workItemsStarted_ = " << workItemsStarted_ << endl; + cerr << "workItemsCompleted_ = " << workItemsCompleted_ << endl; + + cerr << "items: "; + for (size_t i = 0; i < workItems_.size(); ++i) { + cerr << dumpItemState(workItems_[i]); + } + cerr << endl; + +#if 0 + cerr << "pre: " << workItemsBase_ << " * C "; + cerr << "before: " << earliestNonCompletedItem_ - workItemsBase << " = "; + for (auto it = workItems_.begin(); it != workItems_.begin() + earliestNonCompletedItem_ - workItemsBase_; ++it) { + cerr << dumpItemState(*it); + } + cerr << "curr: " << nextWorkItem_ - workItemsBase_ << " = "; + for (auto it = workItems_.begin() + earliestNonCompletedItem_ - workItemsBase_; it != workItems_.begin() + nextWorkItem_ - workItemsBase_; ++it) { + cerr << dumpItemState(*it); + } + cerr << endl; + for (sizeIt - +#endif + } + +private: + enum class WorkItemState: uint8_t { + NOT_STARTED, + IN_PROGRESS, + DONE + }; + + using Mutex = Spinlock; + mutable Mutex mutex_; + size_t maxInProgressWorkItems_; + std::vector workItems_; + ssize_t workItemsBase_ = 0; //< offset for first work item + ssize_t earliestNonCompletedItem_ = 0; //< earliest work item that is not comlpeted. + ssize_t nextWorkItem_ = 0; //< all work items from this one are unstarted + size_t workItemsStarted_ = 0; + size_t workItemsCompleted_ = 0; +}; + + +} // namespace MLDB diff --git a/utils/testing/scoreboard_test.cc b/utils/testing/scoreboard_test.cc new file mode 100644 index 000000000..c21d2e4c7 --- /dev/null +++ b/utils/testing/scoreboard_test.cc @@ -0,0 +1,131 @@ +/* scoreboard_test.cc + Jeremy Barnes, 28 August 2014 + Copyright (c) 2014 mldb.ai inc. All rights reserved. + This file is part of MLDB. Copyright 2015 mldb.ai inc. All rights reserved. + + Test the scoreboard class. +*/ + +#include "mldb/utils/scoreboard.h" +#include "mldb/utils/testing/mldb_catch2.h" + +using namespace std; +using namespace MLDB; + +TEST_CASE("test linear scoreboard") +{ + LinearScoreboard s(8 /* max ahead */); + + SECTION("empty") { + CHECK(s.progress() == 0); + + } + + SECTION("one item") { + auto [started, toofarahead] = s.beginWorkItem(0); + CHECK(started); + CHECK(!toofarahead); + CHECK(s.progress() == 0); + + CHECK(!s.beginWorkItem(0).started); + + auto [first, last] = s.endWorkItem(0); + CHECK(first == 0); + CHECK(last == 1); + CHECK(s.progress() == 1); + CHECK_THROWS(s.endWorkItem(0)); + CHECK(s.beginWorkItem(0).started == false); + } + + SECTION("too far ahead") { + auto [started, toofarahead] = s.beginWorkItem(8); + CHECK(!started); + CHECK(toofarahead); + } + + SECTION("out of order, first ending at start") { + auto [started2, toofarahead2] = s.beginWorkItem(3); + CHECK(started2); + CHECK(!toofarahead2); + CHECK(s.progress() == 0); + + auto [first, last] = s.endWorkItem(3); + CHECK(first == 0); + CHECK(last == 0); + CHECK(s.progress() == 0); + + CHECK(s.beginWorkItem(1).started); + CHECK(s.beginWorkItem(2).started); + CHECK(s.endWorkItem(2).count() == 0); + CHECK(s.endWorkItem(1).count() == 0); + + CHECK(s.beginWorkItem(0).started); + auto [first2, last2] = s.endWorkItem(0); + CHECK(first2 == 0); + CHECK(last2 == 4); + } + + SECTION("out of order, first ending in middle") { + auto [started2, toofarahead2] = s.beginWorkItem(3); + CHECK(started2); + CHECK(!toofarahead2); + CHECK(s.progress() == 0); + + auto [first, last] = s.endWorkItem(3); + CHECK(first == 0); + CHECK(last == 0); + CHECK(s.progress() == 0); + + CHECK(s.beginWorkItem(0).started); + CHECK(s.beginWorkItem(2).started); + CHECK(s.endWorkItem(2).count() == 0); + CHECK(s.endWorkItem(0).count() == 1); + + CHECK(s.beginWorkItem(1).started); + auto [first2, last2] = s.endWorkItem(1); + CHECK(first2 == 1); + CHECK(last2 == 4); + } + + SECTION("one at a time") { + for (size_t i = 0; i < 1000; ++i) { + auto [started, toofarahead] = s.beginWorkItem(i); + CHECK(started); + CHECK(!toofarahead); + CHECK(s.progress() == i); + + auto [first, last] = s.endWorkItem(i); + CHECK(first == i); + CHECK(last == i + 1); + CHECK(s.progress() == i + 1); + } + } + + SECTION("five at a time") { + for (size_t i = 0; i < 5; ++i) { + auto [started, toofarahead] = s.beginWorkItem(i); + CHECK(started); + CHECK(!toofarahead); + CHECK(s.progress() == 0); + } + + for (size_t i = 5; i < 1000; ++i) { + auto [started, toofarahead] = s.beginWorkItem(i); + CHECK(started); + CHECK(!toofarahead); + CHECK(s.progress() == i - 5); + + auto [first, last] = s.endWorkItem(i - 5); + CHECK(first == i - 5); + CHECK(last == i - 4); + CHECK(s.progress() == i - 4); + } + + for (size_t i = 995; i < 1000; ++i) { + auto [first, last] = s.endWorkItem(i); + CHECK(first == i); + CHECK(last == i + 1); + CHECK(s.progress() == i + 1); + } + } +} \ No newline at end of file diff --git a/utils/testing/testing.mk b/utils/testing/testing.mk index d4e1cb172..934ddc1a2 100644 --- a/utils/testing/testing.mk +++ b/utils/testing/testing.mk @@ -39,3 +39,4 @@ $(eval $(call test,floating_point_test,utils log arch base,boost)) $(eval $(call test,string_algorithm_test,base utils arch base value_description,catch2)) $(eval $(call test,lexical_cast_test,arch types value_description,catch2)) $(eval $(call test,safe_clamp_test,utils log arch,catch2)) +$(eval $(call test,scoreboard_test,utils log arch,catch2)) From 7c008b422514d438f71b6d58d1b3b3d4d1eb00c3 Mon Sep 17 00:00:00 2001 From: Jeremy Barnes Date: Mon, 20 Jan 2025 18:33:44 -0500 Subject: [PATCH 25/39] SQUASH for_each_line testing/fixes (6) --- base/iostream_adaptors.cc | 34 +++++- base/iostream_adaptors.h | 41 +++++++ base/testing/iostream_adaptors_test.cc | 28 ++++- utils/for_each_line.cc | 148 +++++++++++++------------ utils/testing/mldb_catch2.h | 15 +++ vfs/testing/filter_streams_test.cc | 13 +++ 6 files changed, 204 insertions(+), 75 deletions(-) create mode 100644 utils/testing/mldb_catch2.h diff --git a/base/iostream_adaptors.cc b/base/iostream_adaptors.cc index 93dc79456..bcb851df5 100644 --- a/base/iostream_adaptors.cc +++ b/base/iostream_adaptors.cc @@ -88,9 +88,8 @@ std::streamsize buffered_istreambuf::xsgetn(char * s, std::streamsize n) std::streampos buffered_istreambuf::seekoff(std::streamoff off, std::ios_base::seekdir way, std::ios_base::openmode which) { - // pos_ represents the position of the last character in the buffer, ie egptr() - if (which != std::ios_base::in || way != std::ios_base::cur || off != 0) return EOF; - return pos_ + egptr() - gptr(); + if (which != std::ios_base::in) return EOF; + return this->seek(off, way); } void buffered_istreambuf::buf_fill() @@ -190,6 +189,35 @@ ssize_t mapped_file_source::read(char * s, size_t n) return n; } +std::streampos mapped_file_source::seek(std::streamoff off, std::ios_base::seekdir way) +{ + ssize_t currentOff = ptr_ - data_; + cerr << "currentOff = " << currentOff << endl; + std::streamoff newOff; + switch (way) { + case std::ios_base::beg: + newOff = off; + break; + case std::ios_base::cur: + newOff = currentOff + off; + break; + case std::ios_base::end: + newOff = size_ + off; + break; + default: + MLDB_THROW_LOGIC_ERROR("invalid seek direction"); + } + + if (newOff < 0 || newOff > size_) + return EOF; + + if (currentOff == newOff) + return newOff; + + ptr_ = data_ + newOff; + return newOff == size_ ? EOF : newOff; +} + /*****************************************************************************/ /* FILE DESCRIPTOR */ /*****************************************************************************/ diff --git a/base/iostream_adaptors.h b/base/iostream_adaptors.h index 845b6654c..a1b342065 100644 --- a/base/iostream_adaptors.h +++ b/base/iostream_adaptors.h @@ -62,6 +62,21 @@ template void close_stream(Stream& stream, std::enable_if_t void close_stream(Stream& stream, std::enable_if_t> * = 0) { } +template +struct has_seek { + template static auto test(int) -> decltype(std::declval().seek(0, std::ios::beg), std::true_type()); + template static auto test(...) -> std::false_type; + using type = decltype(test(0)); + static constexpr bool value = type::value; +}; + +template constexpr bool has_seek_v = has_seek::value; +template using has_seek_t = has_seek::type; + +template void seek_stream(SinkOrSource& stream, std::streamoff off, std::ios::seekdir dir, std::enable_if_t> * = 0) { stream.seek(off, dir); } +template void seek_stream(SinkOrSource& stream, std::streamoff off, std::ios::seekdir dir, std::enable_if_t> * = 0) { } + + template ssize_t write_stream(std::ostream& stream, const char * data, size_t len) { @@ -227,6 +242,12 @@ struct buffered_istreambuf: public filter_streambuf { pos_ += (res == EOF ? 0 : res); return res; } + size_t current_pos() const { return pos_ - (egptr() - gptr()); }; + virtual std::streampos seek(std::streamoff off, std::ios_base::seekdir way) + { + if (way != std::ios_base::cur || off != 0) return EOF; + return current_pos(); + } }; template @@ -239,6 +260,25 @@ struct source_istreambuf: public buffered_istreambuf { virtual void close() override { close_stream(source_); } protected: virtual ssize_t source_read(char * s, size_t n) override { return do_source_read(s, n, source_); } + virtual std::streampos seek(std::streamoff off, std::ios_base::seekdir way) override + { + if (way == std::ios_base::cur && off == 0) return current_pos(); + + // If the source supports seeking, then we can seek to the new position. + // Since the source doesn't know about buffering at all, we need to calculate + // a different offset to seek to, and then perform the actual seek. + if constexpr (has_seek_v) { + auto curr_pos = current_pos(); + if (way == std::ios_base::cur) off -= egptr() - gptr(); + std::streampos new_pos = source_.seek(off, way); + if (curr_pos != new_pos && !eof()) { + setg(nullptr, nullptr, nullptr); // we no longer have a buffer + buf_fill(); + } + return new_pos; + } + return base_type::seek(off, way); + } Source source_; }; @@ -304,6 +344,7 @@ struct mapped_file_source { size_t extra_capacity() const { return capacity_ - size_; } ssize_t read(char * s, size_t n); + std::streampos seek(std::streamoff off, std::ios_base::seekdir way); int fd_ = -1; std::shared_ptr region_; diff --git a/base/testing/iostream_adaptors_test.cc b/base/testing/iostream_adaptors_test.cc index 9b5e9bddc..08d686215 100644 --- a/base/testing/iostream_adaptors_test.cc +++ b/base/testing/iostream_adaptors_test.cc @@ -22,12 +22,13 @@ using namespace std; using namespace MLDB; +#if 0 TEST_CASE("proper EOF sequencing") { string input_file = "mldb/utils/testing/parse_context_test_data.csv"; size_t input_length = std::filesystem::file_size(input_file); - for (auto chunk_size: { /* 1, 2, 3, 5, 7, 11, 50,*/ 71, 1000, 1000000 }) { + for (auto chunk_size: { 1, 2, 3, 5, 7, 11, 50, 71, 1000, 1000000 }) { SECTION("chunk_size " + std::to_string(chunk_size)) { for (auto buffer_size: { /*1, 2, 3, 5, 7, 11, 16,*/ 128, 1000 }) { SECTION("buffer_size " + std::to_string(buffer_size)) { @@ -71,3 +72,28 @@ TEST_CASE("proper EOF sequencing") } } } +#endif + +TEST_CASE("mapped stream tellg") +{ + string input_file = "mldb/vfs/testing/fixtures/minimal.csv"; + + for (auto buffer_size: { /*1, 2, 3, 5, 7, 11, 16, 128,*/ 1000 }) { + SECTION("buffer_size " + std::to_string(buffer_size)) { + filtering_istream stream; + stream.push(mapped_file_source({input_file}), buffer_size); + + CHECK(stream.tellg() == 0); + std::string line; + getline(stream, line); + CHECK(line == "a,b,c"); + CHECK(stream.tellg() == 6); + getline(stream, line); + CHECK(line == "d,e,f"); + CHECK(stream.tellg() == 12); + getline(stream, line); + CHECK(line == ""); + CHECK(stream.eof()); + } + } +} diff --git a/utils/for_each_line.cc b/utils/for_each_line.cc index 07091e129..8fd445626 100644 --- a/utils/for_each_line.cc +++ b/utils/for_each_line.cc @@ -365,27 +365,23 @@ bool forEachLineBlock(std::istream & stream, return; } - if (current) + if (current) { + // Seek ahead in the stream to keep it synchronized with the data that we've + // read so far. + //cerr << "seeking " << current - start << " chars ahead" << endl; + //cerr << "lineOffsets.size() = " << lineOffsets.size() << endl; stream.seekg(current - start, ios::cur); + } else { // Last line has no newline lineOffsets.push_back(end - start); ++doneLines; } - myChunkNumber = chunkNumber++; - - if (current && current < end && - (maxLines == -1 || doneLines < maxLines)) // don't schedule a new block if we have enough lines - { - // Ready for another chunk - tp.add(doBlock); - } else if (current == end) { - lastBlock = true; - } - blockOut = std::shared_ptr(start, [] (const char *) {}); + + lastBlock = !current || current >= end; } else { // not memory mapped if (debug) cerr << "block is not memory mapped" << endl; @@ -469,80 +465,91 @@ bool forEachLineBlock(std::istream & stream, nextBlock.get()); } - bool emptyBlock = lineOffsets.size() == 1; - myChunkNumber = emptyBlock ? -1 : chunkNumber++; + lastBlock = !stream || stream.eof(); + } - // don't schedule a new block if we have enough lines - if (stream && !stream.eof() && (maxLines == -1 || doneLines < maxLines)) { - // Ready for another chunk - tp.add(doBlock); - } else if (stream.eof()) { - lastBlock = true; - } - - int64_t chunkLineNumber = startLine; - size_t lastLineOffset = lineOffsets[0]; + bool emptyBlock = lineOffsets.size() == 1; - size_t numLinesInBlock = lineOffsets.size() - 1; - if (maxLines != -1) - ExcAssertLessEqual(numLinesInBlock + startLine, maxLines); + // Must increment this before scheduling the new block to avoid a data + // race. + myChunkNumber = emptyBlock ? -1 : chunkNumber++; - if (!emptyBlock && startBlock && !startBlock(myChunkNumber, chunkLineNumber, lineOffsets.size() - 1)) { - stop = true; - return; - } + // don't schedule a new block if we have enough lines + if (!lastBlock && (maxLines == -1 || doneLines < maxLines)) { + // Ready for another chunk + tp.add(doBlock); + } + + //cerr << "emptyBlock = " << emptyBlock << " myChunkNumber = " << myChunkNumber << endl; - if (debug) - cerr << "passing on " << lineOffsets.size() - 1 << " lines in chunk " << myChunkNumber << endl; + int64_t chunkLineNumber = startLine; + size_t lastLineOffset = lineOffsets[0]; - size_t returnedLinesAtStart = returnedLines; - size_t returnedLinesFromThisBlock = 0; + size_t numLinesInBlock = lineOffsets.size() - 1; + if (maxLines != -1) + ExcAssertLessEqual(numLinesInBlock + startLine, maxLines); - for (unsigned i = 1; i < lineOffsets.size() && (maxLines == -1 || returnedLines < maxLines); ++i) { + //cerr << "calling startBlock(" << myChunkNumber << ", " << chunkLineNumber << ", " << lineOffsets.size() - 1 << ")" << endl; + if (!emptyBlock && startBlock && !startBlock(myChunkNumber, startLine, lineOffsets.size() - 1)) { + cerr << "stopping from startBlock" << endl; + stop = true; + return; + } - if (debug && myChunkNumber == 88) { - cerr << "maxLines = " << maxLines << " returnedLines = " << returnedLines << " lastBlock = " << lastBlock << endl; - } + if (debug) { + cerr << "passing on " << lineOffsets.size() - 1 << " lines in chunk " << myChunkNumber << endl; + cerr << "lastBlock = " << lastBlock << endl; + cerr << "maxLines = " << maxLines << endl; + } - if (stop.load(std::memory_order_relaxed)) - return; - const char * line = blockOut.get() + lastLineOffset; - size_t len = lineOffsets[i] - lastLineOffset; + size_t returnedLinesAtStart = returnedLines; + size_t returnedLinesFromThisBlock = 0; - auto fixedup = splitter.fixupBlock({line, len}); + for (unsigned i = 1; i < lineOffsets.size() && (maxLines == -1 || returnedLines < maxLines); ++i) { - // if we are not at the last line - if (!lastBlock || fixedup.size() != 0 || i != lineOffsets.size() - 1) { - ++returnedLines; - ++returnedLinesFromThisBlock; - if (debug && myChunkNumber == 88) { - cerr << "line " << i << " of " << lineOffsets.size() << " in chunk " << myChunkNumber << endl; - //cerr << " line is " << string(line, len) << endl; - //cerr << " fixedup is " << string(fixedup.data(), fixedup.size()) << endl; - } - if (!onLine(fixedup.data(), fixedup.size(), myChunkNumber, chunkLineNumber++)) { - if (debug && myChunkNumber == 88) - cerr << " STOPPING" << endl; - stop = true; - return; - } - if (debug && myChunkNumber == 88) cerr << " CONTINUING" << endl; - } else { - cerr << "*** skipped line " << returnedLines << " with lastBlock = " << lastBlock << " and fixedup size = " << fixedup.size() << endl; + if (stop.load(std::memory_order_relaxed)) { + return; + } + const char * line = blockOut.get() + lastLineOffset; + size_t len = lineOffsets[i] - lastLineOffset; + + auto fixedup = splitter.fixupBlock({line, len}); + + // if we are not at the last line + if (!lastBlock || fixedup.size() != 0 || i != lineOffsets.size() - 1) { + ++returnedLines; + ++returnedLinesFromThisBlock; + if (debug && myChunkNumber == 88) { + cerr << "line " << i << " of " << lineOffsets.size() << " in chunk " << myChunkNumber << endl; + //cerr << " line is " << string(line, len) << endl; + //cerr << " fixedup is " << string(fixedup.data(), fixedup.size()) << endl; } - - lastLineOffset = lineOffsets[i]; + if (!onLine(fixedup.data(), fixedup.size(), myChunkNumber, chunkLineNumber++)) { + if (debug && myChunkNumber == 88) + cerr << " STOPPING" << endl; + stop = true; + return; + } + if (debug && myChunkNumber == 88) cerr << " CONTINUING" << endl; + } + + lastLineOffset = lineOffsets[i]; + } + + //cerr << "emptyBlock = " << emptyBlock << endl; + if (maxParallelism == 0) { //cerr << "returnedLines was " << returnedLinesAtStart << " now " << returnedLines << " from this block " << returnedLinesFromThisBlock << endl; //cerr << "compared to " << returnedLines - returnedLinesAtStart << " from this block" << endl; ExcAssertEqual(returnedLines, returnedLinesAtStart + returnedLinesFromThisBlock); + } - if (!emptyBlock && endBlock && !endBlock(myChunkNumber, chunkLineNumber, lineOffsets.size())) { - stop = true; - return; - } + //cerr << "calling endBlock(" << myChunkNumber << ", " << startLine << ", " << lineOffsets.size() - 1 << ")" << endl; + if (!emptyBlock && endBlock && !endBlock(myChunkNumber, startLine, lineOffsets.size() - 1)) { + stop = true; + return; } } MLDB_CATCH_ALL { if (hasExc.fetch_add(1) == 0) { @@ -558,9 +565,8 @@ bool forEachLineBlock(std::istream & stream, // Wait for all to be done tp.waitForAll(); - // If there was an exception, rethrow it rather than returning - // cleanly - if (hasExc) { + // If there was an exception, rethrow it rather than returning cleanly + if (exc) { std::rethrow_exception(exc); } diff --git a/utils/testing/mldb_catch2.h b/utils/testing/mldb_catch2.h new file mode 100644 index 000000000..33f28822f --- /dev/null +++ b/utils/testing/mldb_catch2.h @@ -0,0 +1,15 @@ +#pragma once + +#include "catch2/catch_all.hpp" +#include "mldb/arch/exception.h" + +// Save the Catch2 CHECK_THROWS macro... +#define CATCH2_CHECK_THROWS(...) INTERNAL_CATCH_THROWS( "CHECK_THROWS", Catch::ResultDisposition::ContinueOnFailure, __VA_ARGS__ ) +#define CATCH2_REQUIRE_THROWS(...) INTERNAL_CATCH_THROWS( "REQUIRE_THROWS", Catch::ResultDisposition::Normal, __VA_ARGS__ ) + +// ...and replace it with our own that disables exceptions +#undef CHECK_THROWS +#define CHECK_THROWS(...) do { MLDB_TRACE_EXCEPTIONS(false); CATCH2_CHECK_THROWS(__VA_ARGS__); } while (0) + +#undef REQUIRE_THROWS +#define REQUIRE_THROWS(...) do { MLDB_TRACE_EXCEPTIONS(false); CATCH2_REQUIRE_THROWS(__VA_ARGS__); } while (0) diff --git a/vfs/testing/filter_streams_test.cc b/vfs/testing/filter_streams_test.cc index 195561ea8..02d1d9e68 100644 --- a/vfs/testing/filter_streams_test.cc +++ b/vfs/testing/filter_streams_test.cc @@ -770,4 +770,17 @@ BOOST_AUTO_TEST_CASE(test_file_stream_tellg) stream.close(); BOOST_CHECK_EQUAL(stream.tellg(), -1); } + + { + filter_istream stream; + stream.open("mldb/vfs/testing/fixtures/minimal.csv", {{ "mapped", "true" }}); + BOOST_CHECK_EQUAL(stream.tellg(), 0); + std::string line; + getline(stream, line); + BOOST_CHECK_EQUAL(line, "a,b,c"); + BOOST_CHECK_EQUAL(stream.tellg(), 6); + getline(stream, line); + BOOST_CHECK_EQUAL(line, "d,e,f"); + BOOST_CHECK_EQUAL(stream.tellg(), 12); + } } From 80547459ae5593b7ea22906566a237e9c16620b0 Mon Sep 17 00:00:00 2001 From: Jeremy Barnes Date: Fri, 24 Jan 2025 21:02:46 -0500 Subject: [PATCH 26/39] SQUASH for_each_line (7) --- base/testing/base_testing.mk | 3 +- base/testing/processing_state_test.cc | 21 ++ utils/coalesced_range.h | 265 ++++++++++++++ utils/for_each_line.cc | 481 ++++++++++++++++++++++---- utils/for_each_line.h | 56 +-- utils/scoreboard.h | 2 + utils/testing/coalesced_range_test.cc | 69 ++++ utils/testing/for_each_line_test.cc | 2 +- utils/testing/testing.mk | 1 + 9 files changed, 797 insertions(+), 103 deletions(-) create mode 100644 base/testing/processing_state_test.cc create mode 100644 utils/coalesced_range.h create mode 100644 utils/testing/coalesced_range_test.cc diff --git a/base/testing/base_testing.mk b/base/testing/base_testing.mk index 249699bf4..9d959e627 100644 --- a/base/testing/base_testing.mk +++ b/base/testing/base_testing.mk @@ -4,4 +4,5 @@ export MLDB_NO_TIMING_TESTS=1 $(eval $(call test,thread_pool_test,base arch,boost timed)) $(eval $(call test,thread_queue_test,base arch,boost timed)) $(eval $(call test,per_thread_accumulator_test,base arch,boost)) -$(eval $(call test,iostream_adaptors_test, base arch, catch2)) +$(eval $(call test,iostream_adaptors_test,arch base, catch2)) +$(eval $(call test,processing_state_test,arch base,catch2)) diff --git a/base/testing/processing_state_test.cc b/base/testing/processing_state_test.cc new file mode 100644 index 000000000..6dfc36e52 --- /dev/null +++ b/base/testing/processing_state_test.cc @@ -0,0 +1,21 @@ +/* processing_state_test.cc + Wolfgang Sourdeau, 28 August 2014 + Copyright (c) 2014 mldb.ai inc. All rights reserved. + This file is part of MLDB. Copyright 2015 mldb.ai inc. All rights reserved. + + Test processing state tracker. +*/ + + +#include "mldb/base/processing_state.h" +#include "mldb/utils/testing/mldb_catch2.h" + +using namespace std; +using namespace MLDB; + +TEST_CASE("basics") +{ + ProcessingState state(0 /* max parallelism */); + state.waitForAll(); +} + diff --git a/utils/coalesced_range.h b/utils/coalesced_range.h new file mode 100644 index 000000000..31379304d --- /dev/null +++ b/utils/coalesced_range.h @@ -0,0 +1,265 @@ +/* coalesced_range.h" + + Jeremy Barnes, 29 November 2013 + Copyright (c) 2013 mldb.ai inc. All rights reserved. + + This file is part of MLDB. Copyright 2015 mldb.ai inc. All rights reserved. + + Class to process each line in a file in parallel. +*/ + +#pragma once + +#include +#include +#include +#include +#include +#include "mldb/base/exc_assert.h" +#include "mldb/base/exc_check.h" +#include "mldb/compiler/compiler.h" +#include + +namespace MLDB { + +template>> +struct CoalescedRange { + using ranges_type = Ranges; + using range_type = typename ranges_type::value_type; + using value_type = T; + + template struct Iterator { + using value_type = Value; + using difference_type = ssize_t; + using pointer = Value *; + using reference = Value &; + using iterator_category = std::random_access_iterator_tag; + + auto operator <=> (const Iterator & other) const = default; + + size_t range_size() const + { + ExcCheck(ranges_, "Coalesced range iterator not initialized"); + ExcCheckLess(range_, ranges_->size(), "Coalesced range iterator past end"); + return (*ranges_)[range_].size(); + } + + Iterator & operator ++ () + { + ExcAssert(ranges_); + ExcAssert(offset_ < range_size()); + ++offset_; + if (MLDB_UNLIKELY(offset_ == range_size())) { + ExcAssert(range_ < ranges_->size()); + ++range_; + offset_ = 0; + } + return *this; + } + + Iterator operator ++ (int) + { + auto result = *this; + operator ++ (); + return result; + } + + Iterator & operator -- () + { + ExcAssert(ranges_); + if (MLDB_UNLIKELY(offset_ == 0)) { + ExcAssert(range_ > 0); + --range_; + offset_ = range_size(); + } + ExcAssert(offset_ > 0); + --offset_; + return *this; + } + + Iterator operator -- (int) + { + auto result = *this; + operator -- (); + return result; + } + + Iterator & operator += (ssize_t ofs) + { + if (ofs >= 0) { + while (ofs) { + auto cs = range_size(); + if (ofs >= cs - offset_) { + ofs -= cs - offset_; + offset_ = 0; + ++range_; + } + else { + offset_ += ofs; + ofs = 0; + } + } + return *this; + } + else return operator -= (ofs); + } + + Iterator & operator -= (ssize_t ofs) + { + if (ofs >= 0) { + while (ofs) { + if (ofs >= offset_) { + ofs -= offset_; + ExcCheckGreater(range_, 0, "Coalesced range iterator before beginning"); + --range_; + offset_ = range_size(); + } + else { + offset_ -= ofs; + ofs = 0; + } + } + return *this; + } + else return operator += (-ofs); + } + + Iterator operator + (ssize_t ofs) const { Iterator result = *this; result += ofs; return result; } + Iterator operator - (ssize_t ofs) const { Iterator result = *this; result -= ofs; return result; } + + ssize_t operator - (const Iterator & other) const + { + ExcCheck(ranges_ == other.ranges_, "Attempt to subtract non-compatible range iterators"); + + if (range_ < other.range_) + return - other.operator-(*this); + + ssize_t result = -other.offset_; + for (auto r = other.range_; r < range_; ++r) { + result += (*ranges_)[r].size(); + } + result += offset_; + return result; + } + + value_type & operator * () const + { + ExcCheck(ranges_, "Attempt to dereference null coalesced range iterator"); + ExcCheckLess(range_, ranges_->size(), "Attempt to dereference off-the-end coalesced range iterator"); + return (*ranges_)[range_][offset_]; + } + + value_type & operator [] (ssize_t ofs) const + { + return *(*this + ofs); + } + + const ranges_type * ranges_ = nullptr; + size_t range_ = 0; + size_t offset_ = 0; // invariant: offset_ will never point past the end of a valid range_ value + + const value_type * range_begin() const + { + ExcCheck(ranges_, "Attempt to dereference null coalesced range iterator"); + return ranges_->at(range_).data(); + } + + const value_type * range_it() const { return range_begin() + offset_; } + const value_type * range_end() const { return range_begin() + range_size(); } + + friend struct CoalescedRange; + }; + + using iterator = Iterator; + using const_iterator = Iterator; + + iterator begin() { return {&ranges_, 0, 0}; } + iterator end() { return {&ranges_, ranges_.size(), 0}; } + const_iterator begin() const { return {&ranges_, 0, 0}; } + const_iterator end() const { return {&ranges_, ranges_.size(), 0}; } + + // Add something to the ranges. Invalidates iterators. + // If it is empty, it will not be added. + // If it is an extension of the previous range, then it will be extended. + template void add(Args&&... args) { return add(range_type(std::forward(args)...)); } + + void add(range_type range) + { + if (range.empty()) + return; + else if (!ranges_.empty() && ranges_.back().data() + ranges_.back().size() == range.data()) { + // Contiguous, combine them + ranges_.back() = {ranges_.back().data(), ranges_.back().size() + range.size()}; + } + else { + ranges_.push_back(range); + } + } + + size_t size() const { size_t result = 0; for (auto r: ranges_) result += r.size(); return result; } + + void reduce(const_iterator begin, const_iterator end); + + // Try to extract a single contiguous span of memory from two iterators. + // If both iterators are contained within a contiguous span of memory, then return the + // span of memory between them. Otherwise, a null option is returned. + std::optional get_span(const_iterator begin, const_iterator end) const + { + ExcCheck(begin < end, "Attempt to extract backwards span"); + ExcCheck(begin.ranges_ == &ranges_ && end.ranges_ == &ranges_, "Attempt to extract span from wrong ranges"); + if (begin.range_ != end.range_) + return std::nullopt; + if (begin.range_ == ranges_.size()) + return range_type(); + auto first = begin.range_it(); + auto last = end.range_it(); + return range_type(first, last - first); + } + + iterator find(const value_type & what) { return find(begin(), end(), what); } + const_iterator find(const value_type & what) const { return find(begin(), end(), what); } + + iterator find(iterator first, iterator last, const value_type & what) { return find_impl(first, last, what); } + const_iterator find(iterator first, iterator last, const value_type & what) const { return find_impl(first, last, what); } + +private: + template + static Iterator find_impl(Iterator first, const Iterator & last, const value_type & what) + { + using namespace std; + + ExcAssert(first <= last); + ExcAssert(first.ranges_); + ExcAssert(first.ranges_ == last.ranges_); + + cerr << endl; + cerr << "find: looking between " << first.range_ << "," << first.offset_ << " and " << last.range_ << "," << last.offset_ << endl; + + while (first < last) { + cerr << "looking within range " << first.range_ << ": " << std::string(first.range_begin(), first.range_end()) << endl; + auto rit = first.range_it(); + auto rend = first.range_ == last.range_ ? last.range_it() : first.range_end(); + + cerr << " chars in play: " << std::string(rit, rend) << endl; + + // For chars, this should be optimized to memchr or similar + auto rfound = std::find(rit, rend, what); + if (rfound != rend) { + cerr << "found at pos " << rfound - first.range_begin() << endl; + ExcAssert(*rfound == what); + // Found here + return Iterator{first.ranges_, first.range_, first.offset_ + std::distance(rit, rfound)}; + } + + // Skip to the next one + ++first.range_; + first.offset_ = 0; + } + + return last; + } + + ranges_type ranges_; +}; + +} // namespace MLDB diff --git a/utils/for_each_line.cc b/utils/for_each_line.cc index 8fd445626..dba402ea7 100644 --- a/utils/for_each_line.cc +++ b/utils/for_each_line.cc @@ -12,6 +12,7 @@ #include #include #include +#include #include "mldb/ext/concurrentqueue/blockingconcurrentqueue.h" #include #include "mldb/vfs/filter_streams.h" @@ -25,6 +26,8 @@ #include "mldb/arch/atomic_min_max.h" #include "mldb/base/scope.h" #include "mldb/utils/scoreboard.h" +#include "mldb/utils/coalesced_range.h" +#include "mldb/base/processing_state.h" using namespace std; using moodycamel::BlockingConcurrentQueue; @@ -43,31 +46,9 @@ fixupBlock(std::span block) const namespace { -struct Processing { - - Processing() - : shutdown(false), hasException_(false), - excPtr(nullptr), decompressedLines(16000) - { - } - - void takeLastException() - { - std::lock_guard guard(excPtrLock); - excPtr = std::current_exception(); - hasException_ = true; - } - - bool hasException() - { - return hasException_; - } - - atomic shutdown; - atomic hasException_; - std::mutex excPtrLock; - std::exception_ptr excPtr; - +// Structure that keep track of the overall status of processing +struct Processing: public ProcessingState { + Processing(int numThreads) : ProcessingState(numThreads) {} BlockingConcurrentQueue > > decompressedLines; }; @@ -131,14 +112,14 @@ readStream(std::istream & stream, } } catch (const std::exception & exc) { if (!ignoreStreamExceptions) { - processing.takeLastException(); + processing.takeException("readStream"); } else { WARNING_MSG(logger) << "stream threw ignored exception: " << exc.what(); } } - if (!current.second.empty() && !processing.hasException()) { + if (!current.second.empty() && !processing.stopped()) { processing.decompressedLines.enqueue(std::move(current)); } @@ -151,10 +132,10 @@ parseLinesThreadStr(Processing & processing, int64_t lineNum)> & processLine, shared_ptr logger) { - while (!processing.hasException()) { + while (!processing.stopped()) { std::pair > lines; if (!processing.decompressedLines.wait_dequeue_timed(lines, 1000 /* us */)) { - if (processing.shutdown) { + if (processing.stopped()) { break; } continue; @@ -167,12 +148,10 @@ parseLinesThreadStr(Processing & processing, const string & line = lines.second[i]; try { processLine(line, lines.first + i); - } catch (const std::exception & exc) { - processing.takeLastException(); + } MLDB_CATCH_ALL { + processing.takeException("parseLinesThreadStr on line " + std::to_string(lines.first + i)); WARNING_MSG(logger) << "error dealing with line " << line - << ": " << exc.what(); - } catch (...) { - processing.takeLastException(); + << ": " << getExceptionString(); } } } @@ -204,7 +183,7 @@ forEachLineStr(std::istream & stream, bool ignoreStreamExceptions, int64_t maxLines) { - Processing processing; + Processing processing(numThreads); if (numThreads == -1) numThreads = numCpus(); @@ -216,13 +195,11 @@ forEachLineStr(std::istream & stream, size_t result = readStream(stream, processing, logger, ignoreStreamExceptions, maxLines); - processing.shutdown = true; + processing.stop(); tp.waitForAll(); - if (processing.hasException()) { - std::rethrow_exception(processing.excPtr); - } + processing.rethrowIfException(); return result; } @@ -253,6 +230,313 @@ forEachLineStr(const std::string & filename, ignoreStreamExceptions, maxLines); } +// First phase: blocks are processed in sequence, with each block creating +// a set of lines plus a state containing leftover data to pass to the +// next block. + +namespace { + + +struct ForEachLineOptions { + int maxParallelism = -1; + ssize_t defaultBlockSize = -1; + size_t startOffset = 0; + size_t skipLines = 0; + ssize_t maxLines = -1; + const BlockSplitter * splitter = &newLineSplitter; +}; + +struct ForEachLineProcessor: public ProcessingState { + + ForEachLineProcessor(ForEachLineOptions options) + : ProcessingState(options.maxParallelism), options(options) + { + } + + ForEachLineOptions options; + + enum { + CHUNK_STREAM_PRIORITY = 5, + }; + + // A chunk of memory plus metadata + struct Chunk { + size_t chunkNumber = 0; + size_t startOffset = 0; + bool lastChunk = false; + std::span data; + std::vector> keep; + }; + + struct JobPromise; + + struct CoroutineJob: public std::coroutine_handle { + using promise_type = JobPromise; + }; + + struct JobPromise { + CoroutineJob get_return_object() { return {CoroutineJob::from_promise(*this)}; } + std::suspend_always initial_suspend() noexcept { return {}; } + std::suspend_always final_suspend() noexcept { return {}; } + void return_void() {} + void unhandled_exception() {} + }; + + // Pushes a series of jobs that call onChunk + void chunk_source(std::istream & stream) + { + filter_istream * fistream = dynamic_cast(&stream); + size_t extraCapacity = options.splitter->requiredBlockPadding(); + + if (fistream) { + size_t chunkOffset = stream.tellg(); + // Can we get a memory mapped version of our stream? It + // saves us having to copy data. mapped will be set to + // nullptr if it's not possible to memory map this stream. + auto [mapped, mappedSize, mappedCapacity] = fistream->mapped(); + ExcCheckLessEqual(options.startOffset + chunkOffset, mappedSize, "startOffset is beyond the size of the file"); + std::span mem(reinterpret_cast(mapped) + options.startOffset + chunkOffset, + mappedSize - options.startOffset - chunkOffset); + chunk_source(mem, options.startOffset + chunkOffset); + } + else { + size_t blockSize = options.defaultBlockSize == -1 ? 2'000'000 : options.defaultBlockSize; + stream.seekg(options.startOffset); + std::shared_ptr block(new std::byte[blockSize]); + + bool lastChunk = false; + for (size_t chunkNumber = 0; stream; ++chunkNumber) { + if (stopped()) return; + size_t chunkOffset = stream.tellg(); + stream.read(reinterpret_cast(block.get()), blockSize + extraCapacity); + ssize_t bytesRead = stream.gcount(); + if (bytesRead <= 0) + break; + if (!stream) + lastChunk = true; + std::span mem(block.get(), bytesRead); + if (!handle_chunk({chunkNumber, chunkOffset, lastChunk, mem, {block}})) + break; + } + } + } + + size_t block_size_for_content_length(size_t contentLength) + { + size_t blockSize = options.defaultBlockSize; + if (blockSize == -1) { + blockSize = std::max(1000000, contentLength / options.maxParallelism); + blockSize = std::min(blockSize, 20000000); + } + return blockSize; + } + + void chunk_source(std::span mem, size_t startOffset) + { + size_t numBytes = mem.size(); + size_t blockSize = block_size_for_content_length(numBytes); + + const std::byte * p = mem.data(); + const std::byte * e = p + mem.size(); + + for (size_t chunkNumber = 0; p < e; p += blockSize) { + if (stopped()) return; + const std::byte * eb = std::min(e, p + blockSize); + std::span mem(p, eb-p); + size_t chunkOffset = startOffset + p - mem.data(); + bool lastChunk = eb == e; + if (!handle_chunk({chunkNumber, chunkOffset, lastChunk, mem, {}})) + break; + } + } + + void chunk_source(const ContentHandler & content) + { + size_t contentSize = content.getSize(); + size_t blockSize = block_size_for_content_length(contentSize); + + auto doBlock = [&] (size_t chunkNumber, uint64_t chunkOffset, FrozenMemoryRegion region) + { + bool lastChunk = chunkOffset + region.length() == contentSize; + std::span mem(reinterpret_cast(region.data()), region.length()); + return handle_chunk({chunkNumber, chunkOffset, lastChunk, mem, {}}); + }; + + content.forEachBlockParallel(options.startOffset, blockSize, options.maxParallelism, doBlock); + } + + struct LeftoverChunk { + size_t chunkNumber = 0; + size_t startOffset = 0; + size_t lineNumber = 0; + std::vector data; + std::any splitterState; + std::vector> keep; + }; + + bool handle_chunk(Chunk chunk) + { + cerr << "handling chunk " << chunk.chunkNumber << " last " << chunk.lastChunk << endl; + size_t numChunksOutstanding = 0; + { + std::unique_lock guard{chunks_mutex_}; + if (chunk.chunkNumber == chunks_done_) { + guard.release(); + return handle_next_chunk(std::move(chunk)); + } + else { + chunks_.emplace(chunk.chunkNumber, std::move(chunk)); + numChunksOutstanding = chunks_.size(); + } + } + + // Slow down the production of chunks if there are too many by contributing to + // other work. + while (numChunksOutstanding > numCpus()) { + tp_.work(); + std::unique_lock guard{chunks_mutex_}; + numChunksOutstanding = chunks_.size(); + } + + return true; + } + + bool handle_next_chunk(Chunk chunk) + { + cerr << "handling in-order chunk " << chunk.chunkNumber << endl; + // Precondition: chunks_done_ is equal to this chunk number + // Only one thread in this block at a time, which is staisfied by the condition above + ExcAssertEqual(chunks_done_, chunk.chunkNumber); + + CoalescedRange fullChunk; + fullChunk.add(reinterpret_cast(leftover.data.data()), leftover.data.size()); + fullChunk.add(reinterpret_cast(chunk.data.data()), chunk.data.size()); + + std::vector> keep; + std::vector> lines; + + auto it = fullChunk.begin(), end = fullChunk.end(); + auto & splitterState = leftover.splitterState; + + while (it != end) { + auto another = options.splitter->nextRecord(fullChunk, it, chunk.lastChunk, splitterState); + if (!another) + break; + auto [next_it, next_state] = another.value(); + + if (auto lineSpan = fullChunk.get_span(it, next_it)) { + // Push the contiguous line + lines.push_back(std::move(lineSpan.value())); + } + else { + // Line is not in a contiguous range; need to extract as a string + size_t len = next_it - it; + std::shared_ptr contiguous(new char[len]); + using std::copy; + copy(it, end, contiguous.get()); + lines.emplace_back(contiguous.get(), len); + keep.emplace_back(std::move(contiguous)); + } + splitterState = std::move(next_state); + it = next_it; + } + + cerr << "found " << lines.size() << " lines" << endl; + MLDB_THROW_UNIMPLEMENTED(); + +#if 0 + // Create single span with the coalesced version of the given ranges, with new + // memory allocated if necessary. + auto coalesce = [&] (int firstBlock, const char * firstValue, int lastBlock, const char * lastValue) -> std::span + { + ExcAssertGreater(firstBlock, 0); + ExcAssertLessEqual(lastBlock, 2); + ExcAssertLessEqual(firstBlock, lastBlock); + + if (firstBlock == lastBlock) { + // Both within the same block, nothing to do + return { firstValue, lastValue - firstValue }; + } + else if (blocks[0].data() + blocks[0].size() == blocks[1].data()) { + // If they are contiguous in memory, then they already were coalesced + ExcAssertEqual(firstBlock, 0); ExcAssertEqual(lastBlock, 1); + return { firstValue, lastValue - firstValue }; + } else { + // Need to allocate a new string to copy the data and coalesce them + ExcAssertEqual(firstBlock, 0); ExcAssertEqual(lastBlock, 1); + auto data = std::make_shared(); + data->append(firstValue, blocks[0].data() + blocks[0].size()); + data->append(blocks[1].data(), lastValue); + keep.emplace_back(std::move(data)); + return { keep.back()->data(), keep.back()->size(); }; + } + }; +#endif + + return true; + } + + struct LineBlock { + size_t blockNumber = 0; + size_t startLine = 0; + size_t startOffset = 0; + size_t endOffset = 0; + bool lastBlock = false; + std::vector> lines; + std::vector> keep; + }; + + template + bool process(Source&& source, + std::function onLine, + std::function startBlock, + std::function endBlock) + { + chunk_source(source); + return false; + +#if 0 + std::function handle_block = [onLine,startBlock,endBlock] (LineBlock block) + { + if (startBlock && !startBlock(block.blockNumber, block.startLine, block.lines.size())) + return false; + + for (size_t i = 0; i < lines.size(); ++i) { + if (onLine && !onLine(lines[i].data(), lines[i].size(), block.blockNumber, block.startLine + i)) + return false; + } + + if (endBlock && !endBlock(block.blockNumber, block.startLine, block.lines.size())) + return false; + + return true; + }; +#endif + +#if 0 + auto pipeline + = getLazyStream(source, block_size=blockSize, start_offset=startOffset) + .map(handle_chunk, parallel=true, in_order=true) + .reduce(LeftoverChunk(), split_chunk, in_order=true) + .map(handle_block, parallel=true); + + auto executor = pipeline.compile(); + return executor(); +#endif + } + + mutable std::mutex chunks_mutex_; + std::map chunks_; + std::atomic chunks_done_ = 0; + + LeftoverChunk leftover; +}; + +} // file scope + /*****************************************************************************/ /* FOR EACH LINE BLOCK (ISTREAM) */ @@ -270,6 +554,18 @@ bool forEachLineBlock(std::istream & stream, ssize_t defaultBlockSize, const BlockSplitter & splitter) { + ForEachLineOptions options; + options.maxParallelism = maxParallelism; + options.defaultBlockSize = defaultBlockSize; + options.startOffset = 0; + options.skipLines = 0; + options.maxLines = maxLines; + options.splitter = &splitter; + + ForEachLineProcessor processor(options); + return processor.process(stream, onLine, startBlock, endBlock); + + static constexpr int64_t READ_SIZE = 200000; // read&scan 200kb to fit in cache std::atomic doneLines(0); //number of lines processed but not yet returned @@ -300,6 +596,7 @@ bool forEachLineBlock(std::istream & stream, } } + //cerr << "defaultBlockSize = " << defaultBlockSize << endl; ExcCheckGreater(defaultBlockSize, 0, "defaultBlockSize must be > 0"); //cerr << "defaultBlockSize = " << defaultBlockSize << endl; @@ -348,23 +645,33 @@ bool forEachLineBlock(std::istream & stream, const char * current = start; const char * end = mapped + mappedSize; + CoalescedRange block; + block.add(start, end - start); + while (current && current < end && (current - start) < defaultBlockSize && (maxLines == -1 || doneLines < maxLines)) { //stop processing new line when we have enough) - std::tie(current, splitterState) - = splitter.nextBlock(current, end - current, nullptr, 0, - true /* no more data */, splitterState); - if (current) { - lineOffsets.push_back(current - start); - ++doneLines; - if (current == end) - break; - ++current; + + auto another = splitter.nextRecord(block, block.begin() + (current - start), true /* no more data */, splitterState); + if (!another) { + current = nullptr; + break; } + auto [endIt, newSplitterState] = another.value(); + current += (endIt - (block.begin() + (current - start))); + splitterState = newSplitterState; + + //cerr << "found line at " << current - start << endl; + lineOffsets.push_back(current - start); + ++doneLines; + if (current == end) + break; + ++current; + if (stop.load(std::memory_order_relaxed)) return; } - + if (current) { // Seek ahead in the stream to keep it synchronized with the data that we've // read so far. @@ -378,8 +685,7 @@ bool forEachLineBlock(std::istream & stream, ++doneLines; } - blockOut = std::shared_ptr(start, - [] (const char *) {}); + blockOut = std::shared_ptr(start, [] (const char *) {}); lastBlock = !current || current >= end; } @@ -404,6 +710,7 @@ bool forEachLineBlock(std::istream & stream, // First line starts at offset 0 if (debug) cerr << "starting block with istream: eof = " << stream.eof() << " offset = " << offset << " blockUsed " << blockUsed << " thisBlockSize " << thisBlockSize << endl; + while (stream && !stream.eof() && (maxLines == -1 || doneLines < maxLines) //stop processing new line when we have enough && (offset < thisBlockSize)) { @@ -419,29 +726,36 @@ bool forEachLineBlock(std::istream & stream, offset += bytesRead; // Scan for the end of the block - const char * current = block.get() + lineOffsets.back(); + const char * start = block.get() + lineOffsets.back(); + const char * current = start; const char * end = block.get() + offset; + CoalescedRange range; + range.add(start, end - start); + while (current && current < end && (maxLines == -1 || doneLines < maxLines)) { - std::tie(current, splitterState) - = splitter.nextBlock(current, end - current, nullptr, 0, - stream.eof(), splitterState); - if (current && (current < end || stream.eof())) { - //cerr << "block is at " << current - block.get() << " of " << bytesRead << endl; - //ExcAssertEqual(*current, '\n'); - if (lineOffsets.back() != current - block.get()) { - lineOffsets.push_back(current - block.get()); - ++doneLines; + auto another = splitter.nextRecord(range, range.begin() + (current - start), stream.eof(), splitterState); + if (another) { + auto [endIt, endState] = another.value(); + current = start + (endIt - range.begin()); + if (current < end || stream.eof()) { + //cerr << "block is at " << current - block.get() << " of " << bytesRead << endl; + //ExcAssertEqual(*current, '\n'); + if (lineOffsets.back() != current - block.get()) { + lineOffsets.push_back(current - block.get()); + ++doneLines; + } + ++current; } - ++current; } + else break; } byteOffset += bytesRead; } if (stream.eof()) { -#if 0 + #if 0 // If we are at the end of the stream // make sure we include the last line // if there was no newline @@ -449,7 +763,7 @@ bool forEachLineBlock(std::istream & stream, lineOffsets.push_back(offset); ++doneLines; } -#endif + #endif } else { // Package up the leftover (truncated) block for the next @@ -507,6 +821,9 @@ bool forEachLineBlock(std::istream & stream, for (unsigned i = 1; i < lineOffsets.size() && (maxLines == -1 || returnedLines < maxLines); ++i) { + if (debug) { + cerr << "maxLines = " << maxLines << " returnedLines = " << returnedLines << " lastBlock = " << lastBlock << endl; + } if (stop.load(std::memory_order_relaxed)) { return; @@ -526,12 +843,12 @@ bool forEachLineBlock(std::istream & stream, //cerr << " fixedup is " << string(fixedup.data(), fixedup.size()) << endl; } if (!onLine(fixedup.data(), fixedup.size(), myChunkNumber, chunkLineNumber++)) { - if (debug && myChunkNumber == 88) + if (debug) cerr << " STOPPING" << endl; stop = true; return; } - if (debug && myChunkNumber == 88) cerr << " CONTINUING" << endl; + if (debug) cerr << " CONTINUING" << endl; } @@ -577,7 +894,7 @@ bool forEachLineBlock(std::istream & stream, /* FOR EACH LINE BLOCK (CONTENT HANDLER) */ /*****************************************************************************/ -void forEachLineBlock(std::shared_ptr content, +bool forEachLineBlock(std::shared_ptr content, uint64_t startOffset, std::function content, size_t blockSize, const BlockSplitter & splitter) { + ForEachLineOptions options; + options.maxParallelism = maxParallelism; + options.defaultBlockSize = blockSize; + options.startOffset = startOffset; + options.skipLines = 0; + options.maxLines = maxLines; + options.splitter = &splitter; + + ForEachLineProcessor processor(options); + return processor.process(*content, onLine, startBlock, endBlock); + + std::atomic hasExc(false); std::exception_ptr exc; @@ -755,7 +1084,9 @@ void forEachLineBlock(std::shared_ptr content, } #endif } - + + MLDB_THROW_UNIMPLEMENTED(); + try { if (hasExc.load(std::memory_order_relaxed)) { bailNextBlock(); @@ -797,20 +1128,23 @@ void forEachLineBlock(std::shared_ptr content, //cerr << "processing block with " << leftoverFromPreviousBlock.length() // << " and " << mem.length() << " bytes and splitter " << type_name(splitter) << endl; - const char * start1 = leftoverFromPreviousBlock.data(); - const char * end1 = start1 + leftoverFromPreviousBlock.length(); - const char * start2 = mem.data(); - const char * end2 = start2 + mem.length(); - const char * current = start1 == end1 ? start2 : start1; FrozenMemoryRegion leftover; FrozenMemoryRegion firstRecord; bool noMoreData = mem.length() == 0; // We signal the last block by sending over a null block if (debug) cerr << " noMoreData = " << noMoreData << endl; + if (debug_lines) cerr << " debugging lines" << endl; //cerr << "leftoverFromPreviousBlock.length() = " << leftoverFromPreviousBlock.length() << endl; //cerr << "mem.length() = " << mem.length() << endl; +#if 0 + const char * start1 = leftoverFromPreviousBlock.data(); + const char * end1 = start1 + leftoverFromPreviousBlock.length(); + const char * start2 = mem.data(); + const char * end2 = start2 + mem.length(); + const char * current = start1 == end1 ? start2 : start1; + if (noMoreData && leftoverFromPreviousBlock.length() != 0) { //cerr << "doing last line" << endl; auto [newCurrent, newState] = splitter.nextBlock(start1, end1 - start1, nullptr, 0, @@ -903,6 +1237,7 @@ void forEachLineBlock(std::shared_ptr content, current = newCurrent; splitterState = std::move(newState); } +#endif //cerr << "done " << lines.size() << " lines" << endl; //cerr << "leftover.length() = " << leftover.length() << endl; diff --git a/utils/for_each_line.h b/utils/for_each_line.h index 069d260ce..4ccef6f33 100644 --- a/utils/for_each_line.h +++ b/utils/for_each_line.h @@ -10,7 +10,9 @@ #pragma once #include "mldb/utils/log_fwd.h" +#include "mldb/utils/coalesced_range.h" #include +#include #include #include #include @@ -22,6 +24,9 @@ namespace MLDB { struct ContentHandler; +using TextBlock = CoalescedRange; +using TextBlockIterator = TextBlock::const_iterator; + /* Structure that encapsulates logic to split a block of memory into separate * chunks that can be handled in parallel. The simplest is to split per line * of text, but this interface allows state to be carried around which allows @@ -33,9 +38,8 @@ struct BlockSplitter { virtual std::any newState() const = 0; virtual bool isStateless() const { return false; }; virtual size_t requiredBlockPadding() const { return 0; } - virtual std::pair - nextBlock(const char * block1, size_t n1, const char * block2, size_t n2, - bool noMoreData, const std::any & state) const = 0; + virtual std::optional> + nextRecord(const TextBlock & data, TextBlockIterator curr, bool noMoreData, const std::any & state) const = 0; virtual std::span fixupBlock(std::span block) const; }; @@ -44,19 +48,17 @@ template struct BlockSplitterT: public BlockSplitter { virtual ~BlockSplitterT() = default; virtual State newStateT() const { return State(); } - virtual std::pair - nextBlockT(const char * block1, size_t n1, const char * block2, size_t n2, - bool noMoreData, const State & state) const = 0; + virtual std::optional> + nextRecordT(const TextBlock & data, TextBlockIterator curr, bool noMoreData, const State & state) const = 0; virtual std::any newState() const override { return newStateT(); } - virtual std::pair - nextBlock(const char * block1, size_t n1, const char * block2, size_t n2, - bool noMoreData, const std::any & state) const override + virtual std::optional> + nextRecord(const TextBlock & data, TextBlockIterator curr, bool noMoreData, const std::any & state) const override { const State & stateT = std::any_cast(state); - auto [newPos, newState] = nextBlockT(block1, n1, block2, n2, noMoreData, stateT); + auto [newPos, newState] = nextRecordT(data, noMoreData, stateT); return { newPos, std::move(newState) }; }; }; @@ -70,38 +72,36 @@ struct BlockSplitterT: public BlockSplitter { return {}; } virtual bool isStateless() const override { return true; }; - virtual const char * - nextBlockT(const char * block1, size_t n1, const char * block2, size_t n2, - bool noMoreData) const = 0; - virtual std::pair - nextBlock(const char * block1, size_t n1, const char * block2, size_t n2, - bool noMoreData, const std::any & state) const override + virtual std::optional + nextRecordT(const TextBlock & data, TextBlockIterator curr, bool noMoreData) const = 0; + virtual std::optional> + nextRecord(const TextBlock & data, TextBlockIterator curr, bool noMoreData, const std::any & state) const override { - auto newPos = nextBlockT(block1, n1, block2, n2, noMoreData); - return { newPos, {} }; + auto newPos = nextRecordT(data, curr, noMoreData); + if (!newPos) + return std::nullopt; + std::tuple result(*newPos, std::any()); + return result; }; }; /* BlockSplitter that splits on the newline character. */ struct NewlineSplitter: public BlockSplitterT { - virtual const char * - nextBlockT(const char * block1, size_t n1, const char * block2, size_t n2, - bool noMoreData) const override + virtual std::optional + nextRecordT(const TextBlock & data, TextBlockIterator curr, bool noMoreData) const override { - auto result = (const char *)memchr(block1, '\n', n1); - if (!result && block2) - result = (const char *)memchr(block2, '\n', n2); + auto result = data.find(curr, data.end(), '\n'); // Found a newline, skip it and return - if (result) + if (result != data.end()) return result + 1; // No newline but EOF, return up to the last character if (noMoreData) - return n2 ? block2 + n2 : block1 + n1; + return data.end(); // No newline and not EOF, we need more data - return nullptr; + return std::nullopt; } static std::span removeNewlines(std::span block) @@ -249,7 +249,7 @@ bool forEachLineBlock(std::istream & stream, This is the fastest way to parse a text file. */ -void forEachLineBlock(std::shared_ptr content, +bool forEachLineBlock(std::shared_ptr content, uint64_t startOffset, std::function range; + + range.add(span("hello", 5)); + range.add(span(" ", 1)); + range.add(span("world", 5)); + range.add(span("\n", 1)); + + CHECK(range.size() == 12); + + std::string s; + for (char c: range) s += c; + + CHECK(s == "hello world\n"); + + auto it = range.begin(), end = range.end(); + CHECK(std::distance(it, end) == 12); + CHECK(end - it == 12); + CHECK(it != end); + CHECK(it < end); + CHECK(it <= end); + CHECK(end > it); + CHECK(end >= it); + + CHECK(it[0] == 'h'); + CHECK(it[5] == ' '); + CHECK(it[6] == 'w'); + CHECK(it[11] == '\n'); + + ++it; + CHECK(std::distance(it, end) == 11); + CHECK(it[0] == 'e'); + CHECK(it[5] == 'w'); + CHECK(it[6] == 'o'); + CHECK_THROWS(it[11]); + + --end; + CHECK(std::distance(it, end) == 10); + + auto found = range.find(' '); + CHECK(found != range.end()); + CHECK(std::distance(range.begin(), found) == 5); + CHECK(*found == ' '); + + auto found2 = range.find(found + 1, range.end(), ' '); + CHECK(found2 == range.end()); + + auto found3 = range.find(range.begin() + 1, range.end(), 'h'); + CHECK(found3 == range.end()); + + auto found4 = range.find(range.begin(), range.end() - 1, '\n'); + CHECK(found4 == range.end() - 1); + +} diff --git a/utils/testing/for_each_line_test.cc b/utils/testing/for_each_line_test.cc index c5e447d76..fa7c1a994 100644 --- a/utils/testing/for_each_line_test.cc +++ b/utils/testing/for_each_line_test.cc @@ -17,7 +17,7 @@ #include "mldb/utils/for_each_line.h" #include "mldb/vfs/filter_streams.h" #include "mldb/block/content_descriptor.h" -#include "catch2/catch_all.hpp" +#include "mldb/utils/testing/mldb_catch2.h" using namespace std; using namespace std::placeholders; diff --git a/utils/testing/testing.mk b/utils/testing/testing.mk index 934ddc1a2..0960a365a 100644 --- a/utils/testing/testing.mk +++ b/utils/testing/testing.mk @@ -40,3 +40,4 @@ $(eval $(call test,string_algorithm_test,base utils arch base value_description, $(eval $(call test,lexical_cast_test,arch types value_description,catch2)) $(eval $(call test,safe_clamp_test,utils log arch,catch2)) $(eval $(call test,scoreboard_test,utils log arch,catch2)) +$(eval $(call test,coalesced_range_test,arch,catch2)) From f8bb6cc5c73fd207b6337e440bf5f74b69b2c1ef Mon Sep 17 00:00:00 2001 From: Jeremy Barnes Date: Fri, 24 Jan 2025 21:38:56 -0500 Subject: [PATCH 27/39] SQUASH for_each_line (8) --- utils/block_splitter.cc | 62 +++++++++ utils/block_splitter.h | 88 +++++++++++++ utils/block_splitter_impl.h | 41 ++++++ utils/coalesced_range.h | 255 ++++++++++++++++++------------------ utils/for_each_line.h | 101 +------------- utils/utils.mk | 1 + 6 files changed, 317 insertions(+), 231 deletions(-) create mode 100644 utils/block_splitter.cc create mode 100644 utils/block_splitter.h create mode 100644 utils/block_splitter_impl.h diff --git a/utils/block_splitter.cc b/utils/block_splitter.cc new file mode 100644 index 000000000..212129282 --- /dev/null +++ b/utils/block_splitter.cc @@ -0,0 +1,62 @@ +/** block_splitter.cc + + Jeremy Barnes, 29 November 2013 + Copyright (c) 2013 mldb.ai inc. All rights reserved. + + This file is part of MLDB. Copyright 2015 mldb.ai inc. All rights reserved. + + Classes to identify split points of blocks of records (lines, CSV rows, JSON objects, etc). +*/ + +#include "block_splitter.h" +#include "block_splitter_impl.h" +#include "mldb/utils/coalesced_range.h" + +namespace MLDB { + +const NewlineSplitter newLineSplitter; + +std::span +BlockSplitter:: +fixupBlock(std::span block) const +{ + return block; +} + +std::optional +NewlineSplitter:: +nextRecordT(const TextBlock & data, TextBlockIterator curr, bool noMoreData) const +{ + auto result = data.find(curr, data.end(), '\n'); + + // Found a newline, skip it and return + if (result != data.end()) + return result + 1; + + // No newline but EOF, return up to the last character + if (noMoreData) + return data.end(); + + // No newline and not EOF, we need more data + return std::nullopt; +} + +std::span +NewlineSplitter:: +removeNewlines(std::span block) +{ + const char * p = block.data(); + const char * e = p + block.size(); + if (e > p && e[-1] == '\n') --e; + if (e > p && e[-1] == '\r') --e; + return { p, size_t(e - p) }; +} + +std::span +NewlineSplitter:: +fixupBlock(std::span block) const +{ + return removeNewlines(block); +} + +} // namespace MLDB diff --git a/utils/block_splitter.h b/utils/block_splitter.h new file mode 100644 index 000000000..beffb54d3 --- /dev/null +++ b/utils/block_splitter.h @@ -0,0 +1,88 @@ +/** block_splitter.h + + Jeremy Barnes, 29 November 2013 + Copyright (c) 2013 mldb.ai inc. All rights reserved. + + This file is part of MLDB. Copyright 2015 mldb.ai inc. All rights reserved. + + Classes to identify split points of blocks of records (lines, CSV rows, JSON objects, etc). +*/ + +#pragma once + +#include +#include +#include +#include +#include "mldb/utils/coalesced_range_fwd.h" + +namespace MLDB { + +using TextBlock = CoalescedRange>>; +using TextBlockIterator = CoalescedRangeIterator>>; + +/* Structure that encapsulates logic to split a block of memory into separate + * chunks that can be handled in parallel. The simplest is to split per line + * of text, but this interface allows state to be carried around which allows + * for other splitting schemes that can handle quoted or structured records + * like CSV and JSON. + */ +struct BlockSplitter { + virtual ~BlockSplitter() = default; + virtual std::any newState() const = 0; + virtual bool isStateless() const { return false; }; + virtual size_t requiredBlockPadding() const { return 0; } + virtual std::optional> + nextRecord(const TextBlock & data, TextBlockIterator curr, bool noMoreData, const std::any & state) const = 0; + virtual std::span fixupBlock(std::span block) const; +}; + +/* BlockSplitter with a specific state type. */ +template +struct BlockSplitterT: public BlockSplitter { + virtual ~BlockSplitterT() = default; + virtual State newStateT() const { return State(); } + virtual std::optional> + nextRecordT(const TextBlock & data, TextBlockIterator curr, bool noMoreData, const State & state) const = 0; + virtual std::any newState() const override + { + return newStateT(); + } + + // in block_splitter_impl.h + virtual std::optional> + nextRecord(const TextBlock & data, TextBlockIterator curr, bool noMoreData, const std::any & state) const override; +}; + +/* BlockSplitter with no state. */ +template<> +struct BlockSplitterT: public BlockSplitter { + virtual ~BlockSplitterT() = default; + virtual std::any newState() const override + { + return {}; + } + virtual bool isStateless() const override { return true; }; + virtual std::optional + nextRecordT(const TextBlock & data, TextBlockIterator curr, bool noMoreData) const = 0; + + // in block_splitter_impl.h + virtual std::optional> + nextRecord(const TextBlock & data, TextBlockIterator curr, bool noMoreData, const std::any & state) const override; +}; + +/* BlockSplitter that splits on the newline character. */ +struct NewlineSplitter: public BlockSplitterT { + virtual std::optional + nextRecordT(const TextBlock & data, TextBlockIterator curr, bool noMoreData) const override; + + static std::span removeNewlines(std::span block); + + virtual std::span fixupBlock(std::span block) const override; +}; + +/* Instance of the newline splitter that we can use for default reference arguments. */ +extern const NewlineSplitter newLineSplitter; + + +} // namespace MLDB diff --git a/utils/block_splitter_impl.h b/utils/block_splitter_impl.h new file mode 100644 index 000000000..37dfb952b --- /dev/null +++ b/utils/block_splitter_impl.h @@ -0,0 +1,41 @@ +/** block_splitter_impl.h + + Jeremy Barnes, 29 November 2013 + Copyright (c) 2013 mldb.ai inc. All rights reserved. + + This file is part of MLDB. Copyright 2015 mldb.ai inc. All rights reserved. + + Classes to identify split points of blocks of records (lines, CSV rows, JSON objects, etc). +*/ + +#pragma once + +#include "block_splitter.h" +#include "coalesced_range.h" + +namespace MLDB { + +/* BlockSplitter with a specific state type. */ +template +std::optional> +BlockSplitterT:: +nextRecord(const TextBlock & data, TextBlockIterator curr, bool noMoreData, const std::any & state) const +{ + const State & stateT = std::any_cast(state); + auto [newPos, newState] = nextRecordT(data, noMoreData, stateT); + return { newPos, std::move(newState) }; +}; + +/* BlockSplitter with no state. */ +std::optional> +BlockSplitterT:: +nextRecord(const TextBlock & data, TextBlockIterator curr, bool noMoreData, const std::any & state) const +{ + auto newPos = nextRecordT(data, curr, noMoreData); + if (!newPos) + return std::nullopt; + std::tuple result(*newPos, std::any()); + return result; +} + +} // namespace MLDB \ No newline at end of file diff --git a/utils/coalesced_range.h b/utils/coalesced_range.h index 31379304d..65507ab42 100644 --- a/utils/coalesced_range.h +++ b/utils/coalesced_range.h @@ -10,6 +10,7 @@ #pragma once +#include "coalesced_range_fwd.h" #include #include #include @@ -18,160 +19,161 @@ #include "mldb/base/exc_assert.h" #include "mldb/base/exc_check.h" #include "mldb/compiler/compiler.h" -#include namespace MLDB { -template>> -struct CoalescedRange { +template +struct CoalescedRangeIterator { + using value_type = Value; + using difference_type = ssize_t; + using pointer = Value *; + using reference = Value &; + using iterator_category = std::random_access_iterator_tag; using ranges_type = Ranges; - using range_type = typename ranges_type::value_type; - using value_type = T; - - template struct Iterator { - using value_type = Value; - using difference_type = ssize_t; - using pointer = Value *; - using reference = Value &; - using iterator_category = std::random_access_iterator_tag; - auto operator <=> (const Iterator & other) const = default; + auto operator <=> (const CoalescedRangeIterator & other) const = default; - size_t range_size() const - { - ExcCheck(ranges_, "Coalesced range iterator not initialized"); - ExcCheckLess(range_, ranges_->size(), "Coalesced range iterator past end"); - return (*ranges_)[range_].size(); - } + size_t range_size() const + { + ExcCheck(ranges_, "Coalesced range iterator not initialized"); + ExcCheckLess(range_, ranges_->size(), "Coalesced range iterator past end"); + return (*ranges_)[range_].size(); + } - Iterator & operator ++ () - { - ExcAssert(ranges_); - ExcAssert(offset_ < range_size()); - ++offset_; - if (MLDB_UNLIKELY(offset_ == range_size())) { - ExcAssert(range_ < ranges_->size()); - ++range_; - offset_ = 0; - } - return *this; + CoalescedRangeIterator & operator ++ () + { + ExcAssert(ranges_); + ExcAssert(offset_ < range_size()); + ++offset_; + if (MLDB_UNLIKELY(offset_ == range_size())) { + ExcAssert(range_ < ranges_->size()); + ++range_; + offset_ = 0; } + return *this; + } - Iterator operator ++ (int) - { - auto result = *this; - operator ++ (); - return result; - } + CoalescedRangeIterator operator ++ (int) + { + auto result = *this; + operator ++ (); + return result; + } - Iterator & operator -- () - { - ExcAssert(ranges_); - if (MLDB_UNLIKELY(offset_ == 0)) { - ExcAssert(range_ > 0); - --range_; - offset_ = range_size(); - } - ExcAssert(offset_ > 0); - --offset_; - return *this; + CoalescedRangeIterator & operator -- () + { + ExcAssert(ranges_); + if (MLDB_UNLIKELY(offset_ == 0)) { + ExcAssert(range_ > 0); + --range_; + offset_ = range_size(); } + ExcAssert(offset_ > 0); + --offset_; + return *this; + } - Iterator operator -- (int) - { - auto result = *this; - operator -- (); - return result; - } + CoalescedRangeIterator operator -- (int) + { + auto result = *this; + operator -- (); + return result; + } - Iterator & operator += (ssize_t ofs) - { - if (ofs >= 0) { - while (ofs) { - auto cs = range_size(); - if (ofs >= cs - offset_) { - ofs -= cs - offset_; - offset_ = 0; - ++range_; - } - else { - offset_ += ofs; - ofs = 0; - } + CoalescedRangeIterator & operator += (ssize_t ofs) + { + if (ofs >= 0) { + while (ofs) { + auto cs = range_size(); + if (ofs >= cs - offset_) { + ofs -= cs - offset_; + offset_ = 0; + ++range_; + } + else { + offset_ += ofs; + ofs = 0; } - return *this; } - else return operator -= (ofs); + return *this; } + else return operator -= (ofs); + } - Iterator & operator -= (ssize_t ofs) - { - if (ofs >= 0) { - while (ofs) { - if (ofs >= offset_) { - ofs -= offset_; - ExcCheckGreater(range_, 0, "Coalesced range iterator before beginning"); - --range_; - offset_ = range_size(); - } - else { - offset_ -= ofs; - ofs = 0; - } + CoalescedRangeIterator & operator -= (ssize_t ofs) + { + if (ofs >= 0) { + while (ofs) { + if (ofs >= offset_) { + ofs -= offset_; + ExcCheckGreater(range_, 0, "Coalesced range iterator before beginning"); + --range_; + offset_ = range_size(); + } + else { + offset_ -= ofs; + ofs = 0; } - return *this; } - else return operator += (-ofs); + return *this; } + else return operator += (-ofs); + } - Iterator operator + (ssize_t ofs) const { Iterator result = *this; result += ofs; return result; } - Iterator operator - (ssize_t ofs) const { Iterator result = *this; result -= ofs; return result; } + CoalescedRangeIterator operator + (ssize_t ofs) const { CoalescedRangeIterator result = *this; result += ofs; return result; } + CoalescedRangeIterator operator - (ssize_t ofs) const { CoalescedRangeIterator result = *this; result -= ofs; return result; } - ssize_t operator - (const Iterator & other) const - { - ExcCheck(ranges_ == other.ranges_, "Attempt to subtract non-compatible range iterators"); + ssize_t operator - (const CoalescedRangeIterator & other) const + { + ExcCheck(ranges_ == other.ranges_, "Attempt to subtract non-compatible range iterators"); - if (range_ < other.range_) - return - other.operator-(*this); + if (range_ < other.range_) + return - other.operator-(*this); - ssize_t result = -other.offset_; - for (auto r = other.range_; r < range_; ++r) { - result += (*ranges_)[r].size(); - } - result += offset_; - return result; + ssize_t result = -other.offset_; + for (auto r = other.range_; r < range_; ++r) { + result += (*ranges_)[r].size(); } + result += offset_; + return result; + } - value_type & operator * () const - { - ExcCheck(ranges_, "Attempt to dereference null coalesced range iterator"); - ExcCheckLess(range_, ranges_->size(), "Attempt to dereference off-the-end coalesced range iterator"); - return (*ranges_)[range_][offset_]; - } + value_type & operator * () const + { + ExcCheck(ranges_, "Attempt to dereference null coalesced range iterator"); + ExcCheckLess(range_, ranges_->size(), "Attempt to dereference off-the-end coalesced range iterator"); + return (*ranges_)[range_][offset_]; + } - value_type & operator [] (ssize_t ofs) const - { - return *(*this + ofs); - } + value_type & operator [] (ssize_t ofs) const + { + return *(*this + ofs); + } - const ranges_type * ranges_ = nullptr; - size_t range_ = 0; - size_t offset_ = 0; // invariant: offset_ will never point past the end of a valid range_ value + const ranges_type * ranges_ = nullptr; + size_t range_ = 0; + size_t offset_ = 0; // invariant: offset_ will never point past the end of a valid range_ value - const value_type * range_begin() const - { - ExcCheck(ranges_, "Attempt to dereference null coalesced range iterator"); - return ranges_->at(range_).data(); - } + const value_type * range_begin() const + { + ExcCheck(ranges_, "Attempt to dereference null coalesced range iterator"); + return ranges_->at(range_).data(); + } - const value_type * range_it() const { return range_begin() + offset_; } - const value_type * range_end() const { return range_begin() + range_size(); } + const value_type * range_it() const { return range_begin() + offset_; } + const value_type * range_end() const { return range_begin() + range_size(); } - friend struct CoalescedRange; - }; + template friend struct CoalescedRange; +}; + +template +struct CoalescedRange { + using ranges_type = Ranges; + using range_type = typename ranges_type::value_type; + using value_type = T; - using iterator = Iterator; - using const_iterator = Iterator; + using iterator = CoalescedRangeIterator; + using const_iterator = CoalescedRangeIterator; iterator begin() { return {&ranges_, 0, 0}; } iterator end() { return {&ranges_, ranges_.size(), 0}; } @@ -226,26 +228,17 @@ struct CoalescedRange { template static Iterator find_impl(Iterator first, const Iterator & last, const value_type & what) { - using namespace std; - ExcAssert(first <= last); ExcAssert(first.ranges_); ExcAssert(first.ranges_ == last.ranges_); - cerr << endl; - cerr << "find: looking between " << first.range_ << "," << first.offset_ << " and " << last.range_ << "," << last.offset_ << endl; - while (first < last) { - cerr << "looking within range " << first.range_ << ": " << std::string(first.range_begin(), first.range_end()) << endl; auto rit = first.range_it(); auto rend = first.range_ == last.range_ ? last.range_it() : first.range_end(); - cerr << " chars in play: " << std::string(rit, rend) << endl; - // For chars, this should be optimized to memchr or similar auto rfound = std::find(rit, rend, what); if (rfound != rend) { - cerr << "found at pos " << rfound - first.range_begin() << endl; ExcAssert(*rfound == what); // Found here return Iterator{first.ranges_, first.range_, first.offset_ + std::distance(rit, rfound)}; diff --git a/utils/for_each_line.h b/utils/for_each_line.h index 4ccef6f33..95379db66 100644 --- a/utils/for_each_line.h +++ b/utils/for_each_line.h @@ -10,7 +10,7 @@ #pragma once #include "mldb/utils/log_fwd.h" -#include "mldb/utils/coalesced_range.h" +#include "mldb/utils/block_splitter.h" #include #include #include @@ -24,105 +24,6 @@ namespace MLDB { struct ContentHandler; -using TextBlock = CoalescedRange; -using TextBlockIterator = TextBlock::const_iterator; - -/* Structure that encapsulates logic to split a block of memory into separate - * chunks that can be handled in parallel. The simplest is to split per line - * of text, but this interface allows state to be carried around which allows - * for other splitting schemes that can handle quoted or structured records - * like CSV and JSON. - */ -struct BlockSplitter { - virtual ~BlockSplitter() = default; - virtual std::any newState() const = 0; - virtual bool isStateless() const { return false; }; - virtual size_t requiredBlockPadding() const { return 0; } - virtual std::optional> - nextRecord(const TextBlock & data, TextBlockIterator curr, bool noMoreData, const std::any & state) const = 0; - virtual std::span fixupBlock(std::span block) const; -}; - -/* BlockSplitter with a specific state type. */ -template -struct BlockSplitterT: public BlockSplitter { - virtual ~BlockSplitterT() = default; - virtual State newStateT() const { return State(); } - virtual std::optional> - nextRecordT(const TextBlock & data, TextBlockIterator curr, bool noMoreData, const State & state) const = 0; - virtual std::any newState() const override - { - return newStateT(); - } - virtual std::optional> - nextRecord(const TextBlock & data, TextBlockIterator curr, bool noMoreData, const std::any & state) const override - { - const State & stateT = std::any_cast(state); - auto [newPos, newState] = nextRecordT(data, noMoreData, stateT); - return { newPos, std::move(newState) }; - }; -}; - -/* BlockSplitter with no state. */ -template<> -struct BlockSplitterT: public BlockSplitter { - virtual ~BlockSplitterT() = default; - virtual std::any newState() const override - { - return {}; - } - virtual bool isStateless() const override { return true; }; - virtual std::optional - nextRecordT(const TextBlock & data, TextBlockIterator curr, bool noMoreData) const = 0; - virtual std::optional> - nextRecord(const TextBlock & data, TextBlockIterator curr, bool noMoreData, const std::any & state) const override - { - auto newPos = nextRecordT(data, curr, noMoreData); - if (!newPos) - return std::nullopt; - std::tuple result(*newPos, std::any()); - return result; - }; -}; - -/* BlockSplitter that splits on the newline character. */ -struct NewlineSplitter: public BlockSplitterT { - virtual std::optional - nextRecordT(const TextBlock & data, TextBlockIterator curr, bool noMoreData) const override - { - auto result = data.find(curr, data.end(), '\n'); - - // Found a newline, skip it and return - if (result != data.end()) - return result + 1; - - // No newline but EOF, return up to the last character - if (noMoreData) - return data.end(); - - // No newline and not EOF, we need more data - return std::nullopt; - } - - static std::span removeNewlines(std::span block) - { - const char * p = block.data(); - const char * e = p + block.size(); - if (e > p && e[-1] == '\n') --e; - if (e > p && e[-1] == '\r') --e; - return { p, size_t(e - p) }; - } - - virtual std::span fixupBlock(std::span block) const override - { - return removeNewlines(block); - } -}; - -/* Instance of the newline splitter that we can use for default reference arguments. */ -extern const NewlineSplitter newLineSplitter; - - /** Run the given lambda over every line read from the stream, with the work distributed over the given number of threads. diff --git a/utils/utils.mk b/utils/utils.mk index 7ad8690f0..dc244ffad 100644 --- a/utils/utils.mk +++ b/utils/utils.mk @@ -13,6 +13,7 @@ LIBUTILS_SOURCES := \ confidence_intervals.cc \ quadtree.cc \ for_each_line.cc \ + block_splitter.cc \ tmpdir.cc \ LIBUTILS_LINK := \ From 149d7fa585d17e8a0530a5a45f02dd3918714d9e Mon Sep 17 00:00:00 2001 From: Jeremy Barnes Date: Fri, 31 Jan 2025 07:01:47 -0500 Subject: [PATCH 28/39] FIXUP vfs files --- vfs/CMakeLists.txt | 2 +- vfs/{libdb_initialization.cc => libdb_init.cc} | 0 vfs/testing/fixtures/minimal.csv | 2 ++ vfs/vfs.mk | 3 +-- 4 files changed, 4 insertions(+), 3 deletions(-) rename vfs/{libdb_initialization.cc => libdb_init.cc} (100%) create mode 100644 vfs/testing/fixtures/minimal.csv diff --git a/vfs/CMakeLists.txt b/vfs/CMakeLists.txt index 0fb8f7c6b..9047cb91a 100644 --- a/vfs/CMakeLists.txt +++ b/vfs/CMakeLists.txt @@ -9,7 +9,7 @@ set(LIBVFS_SOURCES http_streambuf.cc compressor.cc exception_ptr.cc - libdb_initialization.cc + libdb_init.cc gzip.cc bzip2.cc lzma.cc diff --git a/vfs/libdb_initialization.cc b/vfs/libdb_init.cc similarity index 100% rename from vfs/libdb_initialization.cc rename to vfs/libdb_init.cc diff --git a/vfs/testing/fixtures/minimal.csv b/vfs/testing/fixtures/minimal.csv new file mode 100644 index 000000000..2e8f4cae1 --- /dev/null +++ b/vfs/testing/fixtures/minimal.csv @@ -0,0 +1,2 @@ +a,b,c +d,e,f diff --git a/vfs/vfs.mk b/vfs/vfs.mk index b0422a43c..a24b9dc17 100644 --- a/vfs/vfs.mk +++ b/vfs/vfs.mk @@ -6,8 +6,7 @@ LIBVFS_SOURCES := \ http_streambuf.cc \ compressor.cc \ exception_ptr.cc \ - libdb_initialization.cc \ - \ + libdb_init.cc \ gzip.cc \ bzip2.cc \ lzma.cc \ From 444e432a065030a323d2b051939149b4e94d8561 Mon Sep 17 00:00:00 2001 From: Jeremy Barnes Date: Fri, 31 Jan 2025 07:08:42 -0500 Subject: [PATCH 29/39] SQUASH for_each_line (8) --- utils/coalesced_range.h | 70 ++++++- utils/coalesced_range_fwd.h | 21 ++ utils/for_each_line.cc | 268 +++++++++++++++----------- utils/processing_state.h | 0 utils/testing/coalesced_range_test.cc | 68 +++++++ utils/testing/for_each_line_test.cc | 3 + 6 files changed, 313 insertions(+), 117 deletions(-) create mode 100644 utils/coalesced_range_fwd.h create mode 100644 utils/processing_state.h diff --git a/utils/coalesced_range.h b/utils/coalesced_range.h index 65507ab42..045a55f7f 100644 --- a/utils/coalesced_range.h +++ b/utils/coalesced_range.h @@ -12,6 +12,7 @@ #include "coalesced_range_fwd.h" #include +#include #include #include #include @@ -163,6 +164,22 @@ struct CoalescedRangeIterator { const value_type * range_it() const { return range_begin() + offset_; } const value_type * range_end() const { return range_begin() + range_size(); } + typename ranges_type::iterator ranges_begin() const + { + ExcCheck(ranges_, "Attempt to dereference null coalesced range iterator"); + return ranges_->begin(); + } + + typename ranges_type::iterator ranges_end() const + { + ExcCheck(ranges_, "Attempt to dereference null coalesced range iterator"); + return ranges_->end(); + } + + size_t block_number() const { return range_; } + size_t block_offset() const { return offset_; } + bool at_the_end() const { return range_ == ranges_->size(); } + template friend struct CoalescedRange; }; @@ -199,8 +216,59 @@ struct CoalescedRange { } size_t size() const { size_t result = 0; for (auto r: ranges_) result += r.size(); return result; } + size_t range_count() const { return ranges_.size(); } + + // Convert to a string, rolling up all of the ranges + std::basic_string> to_string() const + { + std::basic_string> result; + for (auto r: ranges_) + result.append(r.data(), r.size()); + return result; + } - void reduce(const_iterator begin, const_iterator end); + // Reduce it to contain just the mentioned range + // It may lead to the list of ranges shrinking + // The result gives the indexes (first and past-the-end) of the new range in the + // old ranges. + std::tuple reduce(const_iterator begin, const_iterator end) + { + ExcCheck(begin <= end, "Attempt to reduce with backwards span"); + ExcCheck(begin.ranges_ == &ranges_ && end.ranges_ == &ranges_, "Attempt to reduce span from wrong ranges"); + + if (begin == end) { + ranges_.clear(); + return { begin.range_, begin.range_ }; + } + + size_t first = begin.block_number(); + size_t first_ofs = begin.block_offset(); + size_t last = end.block_number(); + size_t last_ofs = end.block_offset(); + if (last_ofs == 0) { + ExcAssert(last > 0); + last -= 1; + } + + ranges_type new_ranges(ranges_.begin() + first, ranges_.begin() + last + 1); + + if (!new_ranges.empty()) { + auto p1 = new_ranges.front().data(); + auto sz1 = new_ranges.front().size(); + p1 += first_ofs; + sz1 -= first_ofs; + new_ranges.front() = { p1, sz1 }; + + auto p2 = new_ranges.back().data(); + auto sz2 = new_ranges.back().size(); + sz2 -= last_ofs; + new_ranges.back() = { p2, sz2 }; + } + + ranges_.swap(new_ranges); + + return { first, last + 1 }; + } // Try to extract a single contiguous span of memory from two iterators. // If both iterators are contained within a contiguous span of memory, then return the diff --git a/utils/coalesced_range_fwd.h b/utils/coalesced_range_fwd.h new file mode 100644 index 000000000..ba1ee5a3a --- /dev/null +++ b/utils/coalesced_range_fwd.h @@ -0,0 +1,21 @@ +/* coalesced_range.h" + + Jeremy Barnes, 29 November 2013 + Copyright (c) 2013 mldb.ai inc. All rights reserved. + + This file is part of MLDB. Copyright 2015 mldb.ai inc. All rights reserved. + + Class to process each line in a file in parallel. +*/ + +#pragma once + +#include +#include + +namespace MLDB { + +template struct CoalescedRangeIterator; +template>> struct CoalescedRange; + +} // namespace MLDB diff --git a/utils/for_each_line.cc b/utils/for_each_line.cc index dba402ea7..1c907450d 100644 --- a/utils/for_each_line.cc +++ b/utils/for_each_line.cc @@ -35,14 +35,6 @@ using moodycamel::BlockingConcurrentQueue; namespace MLDB { -const NewlineSplitter newLineSplitter; - -std::span -BlockSplitter:: -fixupBlock(std::span block) const -{ - return block; -} namespace { @@ -195,8 +187,6 @@ forEachLineStr(std::istream & stream, size_t result = readStream(stream, processing, logger, ignoreStreamExceptions, maxLines); - processing.stop(); - tp.waitForAll(); processing.rethrowIfException(); @@ -259,15 +249,6 @@ struct ForEachLineProcessor: public ProcessingState { CHUNK_STREAM_PRIORITY = 5, }; - // A chunk of memory plus metadata - struct Chunk { - size_t chunkNumber = 0; - size_t startOffset = 0; - bool lastChunk = false; - std::span data; - std::vector> keep; - }; - struct JobPromise; struct CoroutineJob: public std::coroutine_handle { @@ -282,8 +263,17 @@ struct ForEachLineProcessor: public ProcessingState { void unhandled_exception() {} }; + // A chunk of memory plus metadata + struct Chunk { + size_t chunkNumber = 0; + size_t startOffset = 0; + bool lastChunk = false; + std::span data; + shared_ptr keep; // Pins data in place + }; + // Pushes a series of jobs that call onChunk - void chunk_source(std::istream & stream) + bool chunk_source(std::istream & stream) { filter_istream * fistream = dynamic_cast(&stream); size_t extraCapacity = options.splitter->requiredBlockPadding(); @@ -294,31 +284,35 @@ struct ForEachLineProcessor: public ProcessingState { // saves us having to copy data. mapped will be set to // nullptr if it's not possible to memory map this stream. auto [mapped, mappedSize, mappedCapacity] = fistream->mapped(); - ExcCheckLessEqual(options.startOffset + chunkOffset, mappedSize, "startOffset is beyond the size of the file"); - std::span mem(reinterpret_cast(mapped) + options.startOffset + chunkOffset, - mappedSize - options.startOffset - chunkOffset); - chunk_source(mem, options.startOffset + chunkOffset); + + if (mapped) { + ExcCheckLessEqual(options.startOffset + chunkOffset, mappedSize, "startOffset is beyond the size of the file"); + std::span mem(reinterpret_cast(mapped) + options.startOffset + chunkOffset, + mappedSize - options.startOffset - chunkOffset); + return chunk_source(mem, options.startOffset + chunkOffset); + } } - else { - size_t blockSize = options.defaultBlockSize == -1 ? 2'000'000 : options.defaultBlockSize; + size_t blockSize = options.defaultBlockSize == -1 ? 2'000'000 : options.defaultBlockSize; + if (options.startOffset > 0) stream.seekg(options.startOffset); - std::shared_ptr block(new std::byte[blockSize]); - - bool lastChunk = false; - for (size_t chunkNumber = 0; stream; ++chunkNumber) { - if (stopped()) return; - size_t chunkOffset = stream.tellg(); - stream.read(reinterpret_cast(block.get()), blockSize + extraCapacity); - ssize_t bytesRead = stream.gcount(); - if (bytesRead <= 0) - break; - if (!stream) - lastChunk = true; - std::span mem(block.get(), bytesRead); - if (!handle_chunk({chunkNumber, chunkOffset, lastChunk, mem, {block}})) - break; - } + std::shared_ptr block(new std::byte[blockSize]); + + bool lastChunk = false; + + for (size_t chunkNumber = 0; stream; ++chunkNumber) { + if (stopped()) return false; + size_t chunkOffset = stream.tellg(); + stream.read(reinterpret_cast(block.get()), blockSize + extraCapacity); + ssize_t bytesRead = stream.gcount(); + if (bytesRead <= 0) + break; + if (!stream) + lastChunk = true; + std::span mem(block.get(), bytesRead); + if (!handle_chunk({chunkNumber, chunkOffset, lastChunk, mem, {block}})) + return false; } + return true; } size_t block_size_for_content_length(size_t contentLength) @@ -331,7 +325,7 @@ struct ForEachLineProcessor: public ProcessingState { return blockSize; } - void chunk_source(std::span mem, size_t startOffset) + bool chunk_source(std::span mem, size_t startOffset) { size_t numBytes = mem.size(); size_t blockSize = block_size_for_content_length(numBytes); @@ -340,40 +334,33 @@ struct ForEachLineProcessor: public ProcessingState { const std::byte * e = p + mem.size(); for (size_t chunkNumber = 0; p < e; p += blockSize) { - if (stopped()) return; + if (stopped()) return false; const std::byte * eb = std::min(e, p + blockSize); std::span mem(p, eb-p); size_t chunkOffset = startOffset + p - mem.data(); bool lastChunk = eb == e; if (!handle_chunk({chunkNumber, chunkOffset, lastChunk, mem, {}})) - break; + return false; } + return true; } - void chunk_source(const ContentHandler & content) + bool chunk_source(const ContentHandler & content) { size_t contentSize = content.getSize(); size_t blockSize = block_size_for_content_length(contentSize); auto doBlock = [&] (size_t chunkNumber, uint64_t chunkOffset, FrozenMemoryRegion region) { + if (stopped()) return false; bool lastChunk = chunkOffset + region.length() == contentSize; std::span mem(reinterpret_cast(region.data()), region.length()); return handle_chunk({chunkNumber, chunkOffset, lastChunk, mem, {}}); }; - content.forEachBlockParallel(options.startOffset, blockSize, options.maxParallelism, doBlock); + return content.forEachBlockParallel(options.startOffset, blockSize, options.maxParallelism, doBlock); } - struct LeftoverChunk { - size_t chunkNumber = 0; - size_t startOffset = 0; - size_t lineNumber = 0; - std::vector data; - std::any splitterState; - std::vector> keep; - }; - bool handle_chunk(Chunk chunk) { cerr << "handling chunk " << chunk.chunkNumber << " last " << chunk.lastChunk << endl; @@ -381,7 +368,9 @@ struct ForEachLineProcessor: public ProcessingState { { std::unique_lock guard{chunks_mutex_}; if (chunk.chunkNumber == chunks_done_) { - guard.release(); + if (chunksFinished) + return true; + guard.unlock(); return handle_next_chunk(std::move(chunk)); } else { @@ -392,7 +381,7 @@ struct ForEachLineProcessor: public ProcessingState { // Slow down the production of chunks if there are too many by contributing to // other work. - while (numChunksOutstanding > numCpus()) { + while (numChunksOutstanding > numCpus() && !stopped()) { tp_.work(); std::unique_lock guard{chunks_mutex_}; numChunksOutstanding = chunks_.size(); @@ -401,30 +390,56 @@ struct ForEachLineProcessor: public ProcessingState { return true; } + struct LineBlock { + size_t blockNumber = 0; + size_t startLine = 0; + size_t startOffset = 0; + size_t endOffset = 0; + bool lastBlock = false; + std::vector> lines; + std::vector> keep; + }; + + // Information passed from one chunk to the next + size_t outputChunkNumber = 0; + size_t outputStartOffset = 0; + size_t outputLineNumber = 0; + CoalescedRange chunkData; + std::any splitterState; + std::vector> keep; // pins for each block in chunkData + bool handle_next_chunk(Chunk chunk) { cerr << "handling in-order chunk " << chunk.chunkNumber << endl; + cerr << "chunkData.range_count() = " << chunkData.range_count() << endl; + cerr << "keep.size() = " << keep.size() << endl; + // Precondition: chunks_done_ is equal to this chunk number // Only one thread in this block at a time, which is staisfied by the condition above ExcAssertEqual(chunks_done_, chunk.chunkNumber); + ExcAssertEqual(chunkData.range_count(), keep.size()); - CoalescedRange fullChunk; - fullChunk.add(reinterpret_cast(leftover.data.data()), leftover.data.size()); - fullChunk.add(reinterpret_cast(chunk.data.data()), chunk.data.size()); + chunkData.add(reinterpret_cast(chunk.data.data()), chunk.data.size()); + keep.emplace_back(chunk.keep); - std::vector> keep; - std::vector> lines; + LineBlock lineBlock; + lineBlock.keep = keep; + lineBlock.blockNumber = outputChunkNumber; + lineBlock.startLine = outputLineNumber; + lineBlock.startOffset = outputStartOffset; + lineBlock.lastBlock = chunk.lastChunk; + + auto & lines = lineBlock.lines; - auto it = fullChunk.begin(), end = fullChunk.end(); - auto & splitterState = leftover.splitterState; + auto it = chunkData.begin(), end = chunkData.end(); while (it != end) { - auto another = options.splitter->nextRecord(fullChunk, it, chunk.lastChunk, splitterState); + auto another = options.splitter->nextRecord(chunkData, it, chunk.lastChunk, splitterState); if (!another) break; auto [next_it, next_state] = another.value(); - if (auto lineSpan = fullChunk.get_span(it, next_it)) { + if (auto lineSpan = chunkData.get_span(it, next_it)) { // Push the contiguous line lines.push_back(std::move(lineSpan.value())); } @@ -433,58 +448,82 @@ struct ForEachLineProcessor: public ProcessingState { size_t len = next_it - it; std::shared_ptr contiguous(new char[len]); using std::copy; - copy(it, end, contiguous.get()); - lines.emplace_back(contiguous.get(), len); - keep.emplace_back(std::move(contiguous)); + copy(it, next_it, contiguous.get()); + lineBlock.lines.emplace_back(contiguous.get(), len); + lineBlock.keep.emplace_back(std::move(contiguous)); } splitterState = std::move(next_state); it = next_it; } - cerr << "found " << lines.size() << " lines" << endl; - MLDB_THROW_UNIMPLEMENTED(); + size_t lineCount = lines.size(); -#if 0 - // Create single span with the coalesced version of the given ranges, with new - // memory allocated if necessary. - auto coalesce = [&] (int firstBlock, const char * firstValue, int lastBlock, const char * lastValue) -> std::span - { - ExcAssertGreater(firstBlock, 0); - ExcAssertLessEqual(lastBlock, 2); - ExcAssertLessEqual(firstBlock, lastBlock); + cerr << "found " << lineCount << " lines" << endl; + cerr << "outputLineNumber = " << outputLineNumber << endl; + cerr << "options.maxLines = " << options.maxLines << endl; + + if (options.maxLines != -1 && lineCount + outputLineNumber >= options.maxLines) { + // We've reached the maximum number of lines + lineBlock.lines.resize(options.maxLines - outputLineNumber); + lineBlock.lastBlock = true; + } - if (firstBlock == lastBlock) { - // Both within the same block, nothing to do - return { firstValue, lastValue - firstValue }; + // Reduce the chunk data to the leftover parts and remove the associated + // data pins. + + ExcAssertEqual(keep.size(), chunkData.range_count()); + auto [firstChunk, lastChunk] = chunkData.reduce(it, end); + cerr << "keeping chunks " << firstChunk << " to " << lastChunk << " of " << keep.size() << endl; + keep.erase(keep.begin() + lastChunk, keep.end()); + keep.erase(keep.begin(), keep.begin() + firstChunk); + + ExcAssertEqual(keep.size(), chunkData.range_count()); + + if (lineCount > 0) { + // Submit the line block for processing before we schedule another chunk so + // we don't get ahead of ourselves. + int priority = 1; + + std::function job = [lineBlock=std::move(lineBlock),this] () + { + if (this->stopped()) + return; + if (!this->handle_line_block(std::move(lineBlock))) + this->stop(); + }; + + if (options.maxParallelism > 1) { + submit(priority, "process_line_block " + std::to_string(chunk.chunkNumber), std::move(job)); } - else if (blocks[0].data() + blocks[0].size() == blocks[1].data()) { - // If they are contiguous in memory, then they already were coalesced - ExcAssertEqual(firstBlock, 0); ExcAssertEqual(lastBlock, 1); - return { firstValue, lastValue - firstValue }; - } else { - // Need to allocate a new string to copy the data and coalesce them - ExcAssertEqual(firstBlock, 0); ExcAssertEqual(lastBlock, 1); - auto data = std::make_shared(); - data->append(firstValue, blocks[0].data() + blocks[0].size()); - data->append(blocks[1].data(), lastValue); - keep.emplace_back(std::move(data)); - return { keep.back()->data(), keep.back()->size(); }; + else { + // We're not processing in parallel, so there is no other thread + try { + job(); + } MLDB_CATCH_ALL { + takeException("handle_line_block"); + } } - }; -#endif + ++outputChunkNumber; + } + outputLineNumber += lineCount; + outputStartOffset = chunk.startOffset + chunk.data.size(); + // Allow another chunk to happen + { + std::unique_lock guard{chunks_mutex_}; + // Nothing should have happened in the meantime... + ExcAssertEqual(chunks_done_, chunk.chunkNumber); + ++chunks_done_; + if (chunk.lastChunk) { + // We're done + chunksFinished = true; + } + } + return true; } - struct LineBlock { - size_t blockNumber = 0; - size_t startLine = 0; - size_t startOffset = 0; - size_t endOffset = 0; - bool lastBlock = false; - std::vector> lines; - std::vector> keep; - }; + std::function handle_line_block; template bool process(Source&& source, @@ -495,17 +534,13 @@ struct ForEachLineProcessor: public ProcessingState { std::function startBlock, std::function endBlock) { - chunk_source(source); - return false; - -#if 0 - std::function handle_block = [onLine,startBlock,endBlock] (LineBlock block) + handle_line_block = [onLine,startBlock,endBlock] (LineBlock block) { if (startBlock && !startBlock(block.blockNumber, block.startLine, block.lines.size())) return false; - for (size_t i = 0; i < lines.size(); ++i) { - if (onLine && !onLine(lines[i].data(), lines[i].size(), block.blockNumber, block.startLine + i)) + for (size_t i = 0; i < block.lines.size(); ++i) { + if (onLine && !onLine(block.lines[i].data(), block.lines[i].size(), block.blockNumber, block.startLine + i)) return false; } @@ -514,7 +549,9 @@ struct ForEachLineProcessor: public ProcessingState { return true; }; -#endif + + return chunk_source(source); + #if 0 auto pipeline @@ -531,8 +568,7 @@ struct ForEachLineProcessor: public ProcessingState { mutable std::mutex chunks_mutex_; std::map chunks_; std::atomic chunks_done_ = 0; - - LeftoverChunk leftover; + std::atomic chunksFinished = false; }; } // file scope diff --git a/utils/processing_state.h b/utils/processing_state.h new file mode 100644 index 000000000..e69de29bb diff --git a/utils/testing/coalesced_range_test.cc b/utils/testing/coalesced_range_test.cc index caa7b6844..069a295a4 100644 --- a/utils/testing/coalesced_range_test.cc +++ b/utils/testing/coalesced_range_test.cc @@ -65,5 +65,73 @@ TEST_CASE("coalesced range basics") auto found4 = range.find(range.begin(), range.end() - 1, '\n'); CHECK(found4 == range.end() - 1); +} + +TEST_CASE("coalesced range reduce") +{ + CoalescedRange range; + + range.add(span("hello", 5)); + range.add(span(" ", 1)); + range.add(span("world", 5)); + range.add(span("\n", 1)); +#if 1 + SECTION("no-op reduce") { + auto [first, last] = range.reduce(range.begin(), range.end()); + CHECK(first == 0); + CHECK(last == 4); + CHECK(range.to_string() == "hello world\n"); + } + + SECTION("null reduce at beginning") { + auto [first, last] = range.reduce(range.begin(), range.begin()); + CHECK(first == 0); + CHECK(last == 0); + CHECK(range.to_string() == ""); + } + + SECTION("null reduce at all positions") { + for (size_t i = 0; i < range.size(); ++i) { + SECTION("position " + to_string(i)) { + auto [first, last] = range.reduce(range.begin() + i, range.begin() + i); + CHECK(first == last); + CHECK(range.to_string() == ""); + } + } + } + + SECTION("keep n characters") { + for (size_t keep = 0; keep < range.size(); ++keep) { + SECTION("keep " + to_string(keep)) { + for (size_t i = 0; i < range.size() - keep; ++i) { + SECTION("position " + to_string(i)) { + cerr << "keep " << keep << " at " << i << endl; + auto it = range.begin() + i, end = range.begin() + i + keep; + string str(it, end); + cerr << "got iterators" << endl; + auto [first, last] = range.reduce(it, end); + CHECK(first <= last); + CHECK(range.to_string() == str); + CHECK(range.to_string() == string("hello world\n").substr(i, keep)); + } + } + } + } + } +#endif + + SECTION("reduce remove first word") { + auto [first, last] = range.reduce(range.begin(), range.begin() + 5); + CHECK(first == 0); + CHECK(last == 1); + CHECK(range.to_string() == "hello"); + } + + SECTION("reduce remove second word") { + auto [first, last] = range.reduce(range.begin() + 6, range.begin() + 11); + CHECK(first == 2); + CHECK(last == 3); + CHECK(range.to_string() == "world"); + } } diff --git a/utils/testing/for_each_line_test.cc b/utils/testing/for_each_line_test.cc index fa7c1a994..fd9c776a1 100644 --- a/utils/testing/for_each_line_test.cc +++ b/utils/testing/for_each_line_test.cc @@ -381,6 +381,7 @@ struct ForEachLineTester { void processUsingBlockedStream(const std::string & filename, ssize_t blockSize = -1, ssize_t maxLines = -1, int maxParallelism = 0) { filter_istream stream(filename); + REQUIRE(stream); forEachLineBlock(stream, std::bind(&ForEachLineTester::processLine, this, _1, _2, _3, _4), @@ -396,6 +397,7 @@ struct ForEachLineTester { void processUsingBlockedMappedStream(const std::string & filename, ssize_t blockSize = -1, ssize_t maxLines = -1, int maxParallelism = 0) { filter_istream stream(filename, { { "mapped", "true" } } ); + REQUIRE(stream); forEachLineBlock(stream, std::bind(&ForEachLineTester::processLine, this, _1, _2, _3, _4), @@ -412,6 +414,7 @@ struct ForEachLineTester { { this->blocked = false; filter_istream stream(filename); + REQUIRE(stream); forEachLine(stream, std::bind(&ForEachLineTester::processLine, this, _1, _2, 0, _3), From 58c8c5386dda803ecaac4a74a89a34b05fef7d4f Mon Sep 17 00:00:00 2001 From: Jeremy Barnes Date: Fri, 31 Jan 2025 08:11:52 -0500 Subject: [PATCH 30/39] SQUASH for_each_line (9) --- utils/for_each_line.cc | 1065 +++++----------------------------------- vfs/vfs.mk | 2 +- 2 files changed, 117 insertions(+), 950 deletions(-) diff --git a/utils/for_each_line.cc b/utils/for_each_line.cc index 1c907450d..f3f2b7a60 100644 --- a/utils/for_each_line.cc +++ b/utils/for_each_line.cc @@ -36,190 +36,6 @@ using moodycamel::BlockingConcurrentQueue; namespace MLDB { -namespace { - -// Structure that keep track of the overall status of processing -struct Processing: public ProcessingState { - Processing(int numThreads) : ProcessingState(numThreads) {} - BlockingConcurrentQueue > > decompressedLines; -}; - -} // file scope - - -/*****************************************************************************/ -/* PARALLEL LINE PROCESSOR */ -/*****************************************************************************/ - -static size_t -readStream(std::istream & stream, - Processing & processing, - shared_ptr logger, - bool ignoreStreamExceptions, - int64_t maxLines) -{ - Date start = Date::now(); - - pair > current; - current.second.reserve(1000); - - Date lastCheck = start; - - int64_t done = current.first = 0; // 32 bit not enough - - try { - while (stream && !stream.eof() && (maxLines == -1 || done < maxLines)) { - - if (processing.hasException()) { - break; - } - string line; - getline(stream, line); - current.second.emplace_back(std::move(line)); - - ++done; - - if (current.second.size() == 1000) { - processing.decompressedLines.enqueue(std::move(current)); - current.first = done; - current.second.clear(); - //current.clear(); - ExcAssertEqual(current.second.size(), 0); - current.second.reserve(1000); - } - - if (done % 1000000 == 0 && - logger->should_log(spdlog::level::info)) { - - logger->info() << "done " << done << " lines"; - Date now = Date::now(); - - double elapsed = now.secondsSince(start); - double instElapsed = now.secondsSince(lastCheck); - logger->info() << MLDB::format("doing %.3fMlines/second total, %.3f instantaneous", - done / elapsed / 1000000.0, - 1000000 / instElapsed / 1000000.0); - lastCheck = now; - } - } - } catch (const std::exception & exc) { - if (!ignoreStreamExceptions) { - processing.takeException("readStream"); - } - else { - WARNING_MSG(logger) << "stream threw ignored exception: " << exc.what(); - } - } - - if (!current.second.empty() && !processing.stopped()) { - processing.decompressedLines.enqueue(std::move(current)); - } - - return done; -}; - -static void -parseLinesThreadStr(Processing & processing, - const std::function & processLine, - shared_ptr logger) -{ - while (!processing.stopped()) { - std::pair > lines; - if (!processing.decompressedLines.wait_dequeue_timed(lines, 1000 /* us */)) { - if (processing.stopped()) { - break; - } - continue; - } - - for (unsigned i = 0; i < lines.second.size(); ++i) { - if (processing.hasException()) { - break; - } - const string & line = lines.second[i]; - try { - processLine(line, lines.first + i); - } MLDB_CATCH_ALL { - processing.takeException("parseLinesThreadStr on line " + std::to_string(lines.first + i)); - WARNING_MSG(logger) << "error dealing with line " << line - << ": " << getExceptionString(); - } - } - } -}; - -size_t -forEachLine(std::istream & stream, - const std::function & processLine, - shared_ptr logger, - int numThreads, - bool ignoreStreamExceptions, - int64_t maxLines) -{ - auto onLineStr = [&] (const string & line, int64_t lineNum) { - processLine(line.c_str(), line.size(), lineNum); - }; - - return forEachLineStr(stream, onLineStr, logger, numThreads, - ignoreStreamExceptions, maxLines); -} - -size_t -forEachLineStr(std::istream & stream, - const std::function & processLine, - shared_ptr logger, - int numThreads, - bool ignoreStreamExceptions, - int64_t maxLines) -{ - Processing processing(numThreads); - if (numThreads == -1) - numThreads = numCpus(); - - ThreadPool tp(ThreadPool::instance(), numThreads); - - for (unsigned i = 0; i == 0 || i < numThreads; ++i) - tp.add(std::bind(parseLinesThreadStr, std::ref(processing), std::ref(processLine), logger)); - - size_t result = readStream(stream, processing, logger, - ignoreStreamExceptions, maxLines); - - tp.waitForAll(); - - processing.rethrowIfException(); - - return result; -} - -size_t -forEachLine(const std::string & filename, - const std::function & processLine, - shared_ptr logger, - int numThreads, - bool ignoreStreamExceptions, - int64_t maxLines) -{ - filter_istream stream(filename); - return forEachLine(stream, processLine, logger, numThreads, - ignoreStreamExceptions, maxLines); -} - -size_t -forEachLineStr(const std::string & filename, - const std::function & processLine, - shared_ptr logger, - int numThreads, - bool ignoreStreamExceptions, - int64_t maxLines) -{ - filter_istream stream(filename); - return forEachLineStr(stream, processLine, logger, numThreads, - ignoreStreamExceptions, maxLines); -} - // First phase: blocks are processed in sequence, with each block creating // a set of lines plus a state containing leftover data to pass to the // next block. @@ -382,7 +198,16 @@ struct ForEachLineProcessor: public ProcessingState { // Slow down the production of chunks if there are too many by contributing to // other work. while (numChunksOutstanding > numCpus() && !stopped()) { + { + // Make sure there is no data race on chunksFinished + // We could remove this lock if it becomes a problem by using the right sequencing + std::unique_lock guard{chunks_mutex_}; + if (chunksFinished) + break; + } + tp_.work(); + std::unique_lock guard{chunks_mutex_}; numChunksOutstanding = chunks_.size(); } @@ -464,7 +289,7 @@ struct ForEachLineProcessor: public ProcessingState { if (options.maxLines != -1 && lineCount + outputLineNumber >= options.maxLines) { // We've reached the maximum number of lines - lineBlock.lines.resize(options.maxLines - outputLineNumber); + lines.resize(options.maxLines - outputLineNumber); lineBlock.lastBlock = true; } @@ -514,7 +339,7 @@ struct ForEachLineProcessor: public ProcessingState { // Nothing should have happened in the meantime... ExcAssertEqual(chunks_done_, chunk.chunkNumber); ++chunks_done_; - if (chunk.lastChunk) { + if (lineBlock.lastBlock) { // We're done chunksFinished = true; } @@ -571,8 +396,113 @@ struct ForEachLineProcessor: public ProcessingState { std::atomic chunksFinished = false; }; +// Structure that keep track of the overall status of processing +struct Processing: public ProcessingState { + Processing(int numThreads) : ProcessingState(numThreads) {} + BlockingConcurrentQueue > > decompressedLines; +}; + } // file scope +size_t +forEachLine(std::istream & stream, + const std::function & processLine, + shared_ptr logger, + int numThreads, + bool ignoreStreamExceptions, + int64_t maxLines) +{ + auto onLineStr = [&] (const string & line, int64_t lineNum) { + processLine(line.c_str(), line.size(), lineNum); + }; + + return forEachLineStr(stream, onLineStr, logger, numThreads, + ignoreStreamExceptions, maxLines); +} + +size_t +forEachLineStr(std::istream & stream, + const std::function & processLine, + shared_ptr logger, + int numThreads, + bool ignoreStreamExceptions, + int64_t maxLines) +{ + + ForEachLineOptions options; + options.maxParallelism = numThreads; + options.defaultBlockSize = -1; + options.startOffset = 0; + options.skipLines = 0; + options.maxLines = maxLines; + options.splitter = &newLineSplitter; + + ForEachLineProcessor processor(options); + std::atomic done(0); + Date start = Date::now(); + Date lastCheck = start; + + auto onLine = [&] (const char * line, size_t length, int64_t blockNumber, int64_t lineNumber) -> bool + { + string lineStr(line, length); + try { + processLine(lineStr, lineNumber); + auto new_done = done.fetch_add(1) + 1; + + if (new_done % 1000000 == 0 && + logger->should_log(spdlog::level::info)) { + + logger->info() << "done " << new_done << " lines"; + Date now = Date::now(); + + double elapsed = now.secondsSince(start); + double instElapsed = now.secondsSince(lastCheck); + logger->info() << MLDB::format("doing %.3fMlines/second total, %.3f instantaneous", + done / elapsed / 1000000.0, + 1000000 / instElapsed / 1000000.0); + lastCheck = now; + } + } MLDB_CATCH_ALL { + WARNING_MSG(logger) << "error dealing with line " << lineStr + << ": " << getExceptionString(); + if (!ignoreStreamExceptions) { + throw; + } + } + return true; + }; + + return processor.process(stream, onLine, nullptr /* startBlock */, nullptr /* endBlock */); +} + +size_t +forEachLine(const std::string & filename, + const std::function & processLine, + shared_ptr logger, + int numThreads, + bool ignoreStreamExceptions, + int64_t maxLines) +{ + filter_istream stream(filename); + return forEachLine(stream, processLine, logger, numThreads, + ignoreStreamExceptions, maxLines); +} + +size_t +forEachLineStr(const std::string & filename, + const std::function & processLine, + shared_ptr logger, + int numThreads, + bool ignoreStreamExceptions, + int64_t maxLines) +{ + filter_istream stream(filename); + return forEachLineStr(stream, processLine, logger, numThreads, + ignoreStreamExceptions, maxLines); +} + /*****************************************************************************/ /* FOR EACH LINE BLOCK (ISTREAM) */ @@ -600,330 +530,6 @@ bool forEachLineBlock(std::istream & stream, ForEachLineProcessor processor(options); return processor.process(stream, onLine, startBlock, endBlock); - - - static constexpr int64_t READ_SIZE = 200000; // read&scan 200kb to fit in cache - - std::atomic doneLines(0); //number of lines processed but not yet returned - std::atomic returnedLines(0); //number of lines returned - std::atomic byteOffset(0); - std::atomic chunkNumber(0); - - ThreadPool tp(ThreadPool::instance(), maxParallelism); - - constexpr bool debug = false; - - // Memory map if possible - const char * mapped = nullptr; - size_t mappedSize = 0; - size_t mappedCapacity = 0; - - filter_istream * fistream = dynamic_cast(&stream); - - if (fistream) { - // Can we get a memory mapped version of our stream? It - // saves us having to copy data. mapped will be set to - // nullptr if it's not possible to memory map this stream. - std::tie(mapped, mappedSize, mappedCapacity) = fistream->mapped(); - auto info = fistream->info(); - if (info.size > 0 && defaultBlockSize == -1) { - defaultBlockSize = std::max(1000000, info.size / maxParallelism); - defaultBlockSize = std::min(defaultBlockSize, 20000000); - } - } - - //cerr << "defaultBlockSize = " << defaultBlockSize << endl; - ExcCheckGreater(defaultBlockSize, 0, "defaultBlockSize must be > 0"); - - //cerr << "defaultBlockSize = " << defaultBlockSize << endl; - - //cerr << "mapped = " << (void *)mapped << endl; - //cerr << "mappedSize = " << mappedSize << endl; - //hex_dump(mapped, mappedSize, mappedSize); - - std::atomic hasExc(false); - std::exception_ptr exc; - - std::any splitterState = splitter.newState(); - - // These are used to pass leftover data from the previous block to the next - // one - std::shared_ptr nextBlock; - size_t nextBlockSize = 0; - size_t nextBlockUsed = 0; - std::atomic stop = false; - - std::function doBlock = [&] () - { - std::shared_ptr blockOut; - - //int64_t startOffset = byteOffset; - int64_t startLine = doneLines; - vector lineOffsets = {0}; - bool lastBlock = false; - size_t myChunkNumber = 0; - - if (stop.load(std::memory_order_relaxed)) - return; - - if (debug) cerr << "starting block at " << startLine << endl; - - try { - //MLDB-1426 - if (mapped) { - std::streamsize pos = stream.tellg(); - - if (debug) cerr << "memory mapped for each line at pos " << pos << " of " << mappedSize << endl; - - if (mappedSize == 0 || pos == EOF) - return; // EOF, so nothing to read... probably empty - const char * start = mapped + pos; - const char * current = start; - const char * end = mapped + mappedSize; - - CoalescedRange block; - block.add(start, end - start); - - while (current && current < end && (current - start) < defaultBlockSize - && (maxLines == -1 || doneLines < maxLines)) { //stop processing new line when we have enough) - - auto another = splitter.nextRecord(block, block.begin() + (current - start), true /* no more data */, splitterState); - if (!another) { - current = nullptr; - break; - } - - auto [endIt, newSplitterState] = another.value(); - current += (endIt - (block.begin() + (current - start))); - splitterState = newSplitterState; - - //cerr << "found line at " << current - start << endl; - lineOffsets.push_back(current - start); - ++doneLines; - if (current == end) - break; - ++current; - - if (stop.load(std::memory_order_relaxed)) - return; - } - - if (current) { - // Seek ahead in the stream to keep it synchronized with the data that we've - // read so far. - //cerr << "seeking " << current - start << " chars ahead" << endl; - //cerr << "lineOffsets.size() = " << lineOffsets.size() << endl; - stream.seekg(current - start, ios::cur); - } - else { - // Last line has no newline - lineOffsets.push_back(end - start); - ++doneLines; - } - - blockOut = std::shared_ptr(start, [] (const char *) {}); - - lastBlock = !current || current >= end; - } - else { // not memory mapped - if (debug) cerr << "block is not memory mapped" << endl; - - // How far through our block are we? - - std::shared_ptr block = nextBlock; - size_t thisBlockSize = nextBlockSize; - size_t blockUsed = nextBlockUsed; - - if (!block) { - block = std::shared_ptr(new char[defaultBlockSize], [] (char * c) { delete[] c; }); - blockUsed = 0; - thisBlockSize = defaultBlockSize; - } - - blockOut = block; - size_t offset = blockUsed; - - // First line starts at offset 0 - if (debug) cerr << "starting block with istream: eof = " << stream.eof() << " offset = " << offset << " blockUsed " << blockUsed << " thisBlockSize " << thisBlockSize << endl; - - - while (stream && !stream.eof() - && (maxLines == -1 || doneLines < maxLines) //stop processing new line when we have enough - && (offset < thisBlockSize)) { - - stream.read((char *)block.get() + offset, - std::min(READ_SIZE, thisBlockSize - offset)); - - // Check how many bytes we actually read - size_t bytesRead = stream.gcount(); - - if (debug) cerr << "read " << bytesRead << " characters" << endl; - - offset += bytesRead; - - // Scan for the end of the block - const char * start = block.get() + lineOffsets.back(); - const char * current = start; - const char * end = block.get() + offset; - - CoalescedRange range; - range.add(start, end - start); - - while (current && current < end && (maxLines == -1 || doneLines < maxLines)) { - auto another = splitter.nextRecord(range, range.begin() + (current - start), stream.eof(), splitterState); - if (another) { - auto [endIt, endState] = another.value(); - current = start + (endIt - range.begin()); - if (current < end || stream.eof()) { - //cerr << "block is at " << current - block.get() << " of " << bytesRead << endl; - //ExcAssertEqual(*current, '\n'); - if (lineOffsets.back() != current - block.get()) { - lineOffsets.push_back(current - block.get()); - ++doneLines; - } - ++current; - } - } - else break; - } - - byteOffset += bytesRead; - } - - if (stream.eof()) { - #if 0 - // If we are at the end of the stream - // make sure we include the last line - // if there was no newline - if (lineOffsets.back() != offset - 1) { - lineOffsets.push_back(offset); - ++doneLines; - } - #endif - } - else { - // Package up the leftover (truncated) block for the next - // block. - nextBlockUsed = offset - lineOffsets.back(); - if (lineOffsets.size() == 1) - nextBlockSize = thisBlockSize + nextBlockUsed; - else nextBlockSize = defaultBlockSize + nextBlockUsed; - - nextBlock = std::shared_ptr(new char[nextBlockSize], - [] (char * c) { delete[] c; }); - std::copy(block.get() + lineOffsets.back(), block.get() + offset, - nextBlock.get()); - } - - lastBlock = !stream || stream.eof(); - } - - bool emptyBlock = lineOffsets.size() == 1; - - // Must increment this before scheduling the new block to avoid a data - // race. - myChunkNumber = emptyBlock ? -1 : chunkNumber++; - - // don't schedule a new block if we have enough lines - if (!lastBlock && (maxLines == -1 || doneLines < maxLines)) { - // Ready for another chunk - tp.add(doBlock); - } - - //cerr << "emptyBlock = " << emptyBlock << " myChunkNumber = " << myChunkNumber << endl; - - int64_t chunkLineNumber = startLine; - size_t lastLineOffset = lineOffsets[0]; - - size_t numLinesInBlock = lineOffsets.size() - 1; - if (maxLines != -1) - ExcAssertLessEqual(numLinesInBlock + startLine, maxLines); - - //cerr << "calling startBlock(" << myChunkNumber << ", " << chunkLineNumber << ", " << lineOffsets.size() - 1 << ")" << endl; - if (!emptyBlock && startBlock && !startBlock(myChunkNumber, startLine, lineOffsets.size() - 1)) { - cerr << "stopping from startBlock" << endl; - stop = true; - return; - } - - if (debug) { - cerr << "passing on " << lineOffsets.size() - 1 << " lines in chunk " << myChunkNumber << endl; - cerr << "lastBlock = " << lastBlock << endl; - cerr << "maxLines = " << maxLines << endl; - } - - size_t returnedLinesAtStart = returnedLines; - size_t returnedLinesFromThisBlock = 0; - - for (unsigned i = 1; i < lineOffsets.size() && (maxLines == -1 || returnedLines < maxLines); ++i) { - - if (debug) { - cerr << "maxLines = " << maxLines << " returnedLines = " << returnedLines << " lastBlock = " << lastBlock << endl; - } - - if (stop.load(std::memory_order_relaxed)) { - return; - } - const char * line = blockOut.get() + lastLineOffset; - size_t len = lineOffsets[i] - lastLineOffset; - - auto fixedup = splitter.fixupBlock({line, len}); - - // if we are not at the last line - if (!lastBlock || fixedup.size() != 0 || i != lineOffsets.size() - 1) { - ++returnedLines; - ++returnedLinesFromThisBlock; - if (debug && myChunkNumber == 88) { - cerr << "line " << i << " of " << lineOffsets.size() << " in chunk " << myChunkNumber << endl; - //cerr << " line is " << string(line, len) << endl; - //cerr << " fixedup is " << string(fixedup.data(), fixedup.size()) << endl; - } - if (!onLine(fixedup.data(), fixedup.size(), myChunkNumber, chunkLineNumber++)) { - if (debug) - cerr << " STOPPING" << endl; - stop = true; - return; - } - if (debug) cerr << " CONTINUING" << endl; - - } - - lastLineOffset = lineOffsets[i]; - } - - //cerr << "emptyBlock = " << emptyBlock << endl; - - if (maxParallelism == 0) { - //cerr << "returnedLines was " << returnedLinesAtStart << " now " << returnedLines << " from this block " << returnedLinesFromThisBlock << endl; - //cerr << "compared to " << returnedLines - returnedLinesAtStart << " from this block" << endl; - ExcAssertEqual(returnedLines, returnedLinesAtStart + returnedLinesFromThisBlock); - } - - //cerr << "calling endBlock(" << myChunkNumber << ", " << startLine << ", " << lineOffsets.size() - 1 << ")" << endl; - if (!emptyBlock && endBlock && !endBlock(myChunkNumber, startLine, lineOffsets.size() - 1)) { - stop = true; - return; - } - } MLDB_CATCH_ALL { - if (hasExc.fetch_add(1) == 0) { - exc = std::current_exception(); - stop = true; - } - } - }; - - // Run the first block, which will enqueue the second before exiting, and so on - doBlock(); - - // Wait for all to be done - tp.waitForAll(); - - // If there was an exception, rethrow it rather than returning cleanly - if (exc) { - std::rethrow_exception(exc); - } - - return stop; } /*****************************************************************************/ @@ -957,445 +563,6 @@ bool forEachLineBlock(std::shared_ptr content, ForEachLineProcessor processor(options); return processor.process(*content, onLine, startBlock, endBlock); - - - std::atomic hasExc(false); - std::exception_ptr exc; - - /// This is what we pass to the next block once we've finished scanning for - /// line breaks. - struct PassToNextBlock { - FrozenMemoryRegion leftoverFromPreviousBlock; - uint64_t doneLines = 0; - bool bail = false; ///< Should we bail out (stop) immediately? - std::any splitterState; - }; - - constexpr bool debug = false; - constexpr bool debug_lines = debug && false; - - // Set of promises, one per block, for the previous block to use to pass information - // to the next block. We use a map so that we can remove early entries. Each block gets - // information from the promise blockNum and writes its output information to the - // promise blockNum + 1. Each block is responsible for removing its input promise from - // the map once it's done with it. - - Spinlock promisesMutex; - std::map> promises; - - auto getPromises = [&] (size_t blockNumber) -> std::pair, std::promise *> - { - if (debug) { - cerr << "getting promises for block " << blockNumber << endl; - cerr << " current exists: " << promises.count(blockNumber) << endl; - cerr << " next exists: " << promises.count(blockNumber + 1) << endl; - } - std::unique_lock guard(promisesMutex); - //ExcAssert(promises.count(blockNumber)); - //ExcAssert(!promises.count(blockNumber + 1)); - auto future = promises[blockNumber].get_future(); - ExcAssert(future.valid()); - return { std::move(future), &promises[blockNumber + 1] }; - }; - - auto doneBlock = [&] (size_t blockNumber) - { - std::unique_lock guard(promisesMutex); - promises.erase(blockNumber); - }; - - std::atomic highestChunkNumber(-1); - - auto doBlock - = [&hasExc,&exc,maxLines,&onLine,&startBlock,&endBlock,&getPromises, &splitter, &doneBlock, &highestChunkNumber] - (int chunkNumber, - uint64_t offset, - FrozenMemoryRegion mem) -> bool - { - atomic_max(highestChunkNumber, chunkNumber); - if (debug) { - cerr << "processing chunk " << chunkNumber << " with " << mem.length() << " bytes" << endl; - std::string data(mem.data(), mem.data() + mem.length()); - if (data.length() > 100) { - data.resize(100); - data += "..."; - } - cerr << " mem is " << data << endl; - } - - // Contains the full first line of our block, which is made up - // of whatever was leftover from the previous block plus - // our current line - FrozenMemoryRegion firstLine; - - // Contains the (partial) last line of our block - FrozenMemoryRegion partialLastLine; - - // Offset in otherLines of line start characters - vector> lines; - - // What we got from the last block - PassToNextBlock fromPrev; - - auto [fromPrevFuture, toNextPromise] = getPromises(chunkNumber); - - if (debug) cerr << " got promises" << endl; - - // Call this to tell the next block that it should bail out. It's - // safe to call at any time, including before the next block has - // been launched and after the next block has already been told to - // do something else. - auto bailNextBlock = [&] () - { - PassToNextBlock toNext; - toNext.bail = true; - toNextPromise->set_value(std::move(toNext)); - }; - - if (splitter.isStateless()) { -#if 0 // can scan before previous block is finished (TODO: re-enable) - std::any splitterState; - size_t length = mem.length(); - const char * start = mem.data(); - const char * current = start; - if (length > 0) { - std::tie(current, splitterState) = splitter.nextBlock(start, length, nullptr, 0, splitterState); - } - const char * end = start + length; - size_t numLinesInBlock = 0; - - //cerr << "start = " << (void *)start - // << " current = " << (void *)current - // << " end = " << (void *)end - // << endl; - - bool noBreakInChunk = false; - ssize_t charsUntilFirstLineBreak = -1; - if (!current) { - noBreakInChunk = true; - } - else { - charsUntilFirstLineBreak = current - start; - //cerr << "firstLine is " << endl; - //hex_dump(firstLine.data(), firstLine.length()); - - ++current; - ++numLinesInBlock; - //cerr << "numLinesInBlock incremented for first line" << endl; - - // Second line starts here; record the start - lineOffsets.push_back(current - start); - - const char * lastLineStart = current; - - //cerr << "start = " << (void *)start - // << " current = " << (void *)current - // << " end = " << (void *)end - // << endl; - - while (current && current < end) { - // Bail out on exception - if (numLinesInBlock % 256 == 0 - && hasExc.load(std::memory_order_relaxed)) { - bailNextBlock(); - return false; - } - - std::tie(current, splitterState) = splitter.nextBlock(current, end - current, nullptr, 0, splitterState); - - //cerr << " current now = " << (void *)current << endl; - - if (current) - lastLineStart = current + 1; - - if (current && current < end) { - ExcAssertEqual(*current, '\n'); - lineOffsets.push_back(current - start); - ++numLinesInBlock; - //cerr << "doneLines incremented for other line" - // << endl; - ++current; - } - } - } -#endif - } - - MLDB_THROW_UNIMPLEMENTED(); - - try { - if (hasExc.load(std::memory_order_relaxed)) { - bailNextBlock(); - return false; - } - - if (debug) cerr << " waiting for previous queue..." << endl; - - //fromPrevFuture.wait(); - fromPrev = fromPrevFuture.get(); - if (debug) cerr << " done waiting for previous queue..." << endl; - - // We no longer need the entry in the promises map - doneBlock(chunkNumber); - - // Do we bail out? If our previous block says it has bailed, - // then we should too. - if (fromPrev.bail) { - bailNextBlock(); - return false; - } - - FrozenMemoryRegion leftoverFromPreviousBlock - = std::move(fromPrev.leftoverFromPreviousBlock); - - if (debug) { - cerr << " had " << leftoverFromPreviousBlock.length() << " bytes leftover from previous block" << endl; - std::string leftoverStr(leftoverFromPreviousBlock.data(), leftoverFromPreviousBlock.length()); - if (leftoverStr.length() > 100) { - leftoverStr.resize(100); - leftoverStr += "..."; - } - cerr << " " << leftoverStr << endl; - } - - int64_t startLine = fromPrev.doneLines; - std::any splitterState = std::move(fromPrev.splitterState); - - //cerr << "processing block with " << leftoverFromPreviousBlock.length() - // << " and " << mem.length() << " bytes and splitter " << type_name(splitter) << endl; - - FrozenMemoryRegion leftover; - FrozenMemoryRegion firstRecord; - bool noMoreData = mem.length() == 0; // We signal the last block by sending over a null block - - if (debug) cerr << " noMoreData = " << noMoreData << endl; - if (debug_lines) cerr << " debugging lines" << endl; - - //cerr << "leftoverFromPreviousBlock.length() = " << leftoverFromPreviousBlock.length() << endl; - //cerr << "mem.length() = " << mem.length() << endl; - -#if 0 - const char * start1 = leftoverFromPreviousBlock.data(); - const char * end1 = start1 + leftoverFromPreviousBlock.length(); - const char * start2 = mem.data(); - const char * end2 = start2 + mem.length(); - const char * current = start1 == end1 ? start2 : start1; - - if (noMoreData && leftoverFromPreviousBlock.length() != 0) { - //cerr << "doing last line" << endl; - auto [newCurrent, newState] = splitter.nextBlock(start1, end1 - start1, nullptr, 0, - true /* noMoreData */, splitterState); - - //cerr << "newCurrent = " << (const void *)newCurrent << endl; - //cerr << "current = " << (const void *)current << endl; - //cerr << "start1 = " << (const void *)start1 << endl; - //cerr << "end1 = " << (const void *)end1 << endl; - //cerr << "start2 = " << (const void *)start2 << endl; - //cerr << "end2 = " << (const void *)end2 << endl; - - //cerr << "newCurrent = " << (const void *)newCurrent << endl; - if (!newCurrent) { - newCurrent = end1; - // Pass on the partial record; the underlying logic can decide if it's valid or not - //throw MLDB::Exception("File is truncated in the middle of a record at last line"); - } - ExcAssertEqual((const void *)newCurrent, (const void *)end1); - lines.emplace_back(start1, end1 - start1); - //cerr << "got last line " << string(firstRecord.data(), firstRecord.length()) << endl; - current = 0; - } - - if (debug) cerr << " lengths: prev block = " << end1 - start1 << ", this block = " << end2 - start2 << endl; - - // Scan the combined leftover and new blocks, normally it should only be once - // to complete the partial last record. - while (current && current >= start1 && current < end1) { - ExcAssert(start2 != 0); - //cerr << "doing current line" << endl; - auto [newCurrent, newState] = splitter.nextBlock(current, end1 - current, start2, end2 - start2, noMoreData, splitterState); - if (!newCurrent) { - if (debug) cerr << " *** no break in the whole block, continuing" << endl; - // No break in the whole lot... it's all a partial record - leftover = FrozenMemoryRegion::combined(leftoverFromPreviousBlock, mem); - current = nullptr; - break; - } - - if (newCurrent >= start1 && newCurrent < end1) { - if (debug_lines) cerr << " *** got line in first block at position " << newCurrent - start1 << endl; - if (debug_lines) cerr << " adding line " << string(current, newCurrent - start1) << endl; - lines.emplace_back(current, newCurrent - current); - } - else { - if (newCurrent < start2 || newCurrent > end2) { - cerr << "newCurrent = " << (const void *)newCurrent << endl; - cerr << "current = " << (const void *)current << endl; - cerr << "start1 = " << (const void *)start1 << endl; - cerr << "end1 = " << (const void *)end1 << endl; - cerr << "start2 = " << (const void *)start2 << endl; - cerr << "end2 = " << (const void *)end2 << endl; - } - ExcAssertGreaterEqual((const void *)newCurrent, (const void *)start2); - ExcAssertLessEqual((const void *)newCurrent, (const void *)end2); - //cerr << "doing combined" << endl; - if (debug_lines) cerr << " *** got line in the second block at position " << newCurrent - start2 << endl; - if (debug_lines) { - cerr << "combining " << string(leftoverFromPreviousBlock.data(), 0, leftoverFromPreviousBlock.length()) - << " with " << string(current, end1) - << " and " << string(start2, newCurrent) << endl; - } - firstRecord = FrozenMemoryRegion::combined(leftoverFromPreviousBlock, mem.rangeAtStart(newCurrent - start2)); - lines.emplace_back(firstRecord.data(), firstRecord.length()); - if (debug_lines) cerr << " adding line " << string(firstRecord.data(), firstRecord.length()) << endl; - } - //cerr << "got first line " << string(lines.back().data(), lines.back().size()) << endl; - current = newCurrent; - splitterState = std::move(newState); - } - - if (debug) cerr << " got " << lines.size() << " lines" << endl; - - // Scan the current block - while (current && current >= start2 && current < end2) { - if (startLine + lines.size() >= maxLines) - break; - - auto [newCurrent, newState] = splitter.nextBlock(current, end2 - current, nullptr, 0, noMoreData, splitterState); - if (!newCurrent) { - // We've gotten all we can - leftover = mem.rangeAtEnd(end2 - current); - current = nullptr; - break; - } - lines.emplace_back(current, newCurrent - current); - //cerr << "got line " << string(current, newCurrent) << endl; - ExcAssertGreater((const void *)newCurrent, (const void *)current); - current = newCurrent; - splitterState = std::move(newState); - } -#endif - - //cerr << "done " << lines.size() << " lines" << endl; - //cerr << "leftover.length() = " << leftover.length() << endl; - - if (hasExc.load(std::memory_order_relaxed)) { - bailNextBlock(); - return false; - } - - uint64_t doneLines = startLine + lines.size(); - if (debug) cerr << " doneLines = " << doneLines << endl; - - if (maxLines == -1 || doneLines < maxLines) { - // What we pass on to the next block - PassToNextBlock toNext; - toNext.leftoverFromPreviousBlock = std::move(leftover); - toNext.doneLines = doneLines; - toNext.splitterState = std::move(splitterState); - toNextPromise->set_value(std::move(toNext)); - } - else { - bailNextBlock(); - } - - int64_t chunkLineNumber = startLine; - size_t numLines = lines.size(); - - auto doLine = [&] (const char * line, size_t len) - { - //cerr << "doLine: " << string(line, len) << endl; - auto fixedup = splitter.fixupBlock({line, len}); - //cerr << "fixedup: " << string(fixedup.data(), fixedup.size()) << endl; - - return onLine(fixedup.data(), fixedup.size(), chunkNumber, chunkLineNumber++); - }; - - if (startBlock) - if (!startBlock(chunkNumber, chunkLineNumber, numLines)) - return false; - - auto returnedLines = startLine; - - for (unsigned i = 0; i < lines.size() && (maxLines == -1 || returnedLines++ < maxLines); ++i) { - //cerr << "i = " << i << " maxLines = " << maxLines << " returnedLines = " << returnedLines << endl; - // Check for exception bailout every 256 lines - if (i % 256 == 0 && hasExc.load(std::memory_order_relaxed)) - return false; - - const char * line = lines[i].data(); - size_t len = lines[i].size(); - - if (!doLine(line, len)) - return false; - } - - if (endBlock) - if (!endBlock(chunkNumber, chunkLineNumber, numLines)) - return false; - - } MLDB_CATCH_ALL { - //cerr << "got exception in chunk " << myChunkNumber - //<< " " << getExceptionString() << endl; - if (hasExc.fetch_add(1) == 0) { - exc = std::current_exception(); - } - - // If the next block is waiting for instructions, tell it - // to bail out. - bailNextBlock(); - return false; - } - - return true; - }; - - // Unblock the first block by writing to it - PassToNextBlock pass; - pass.doneLines = 0; - pass.splitterState = splitter.newState(); - { - std::unique_lock guard(promisesMutex); - promises[0].set_value(std::move(pass)); - } - - content->forEachBlockParallel(startOffset, blockSize, maxParallelism, doBlock); - - // last chunk with single last line is in the last queue entry - if (!hasExc && !promises.empty()) { - if (debug) cerr << "last one; promises.size() = " << promises.size() << endl; - size_t chunkNumber = highestChunkNumber + 1; - doBlock(chunkNumber, -1 /* offset */, FrozenMemoryRegion()); - -#if 0 - if (!queues.back()->try_dequeue(pass)) { - throw Exception("Queue issues"); - } - cerr << "total doneLines = " << pass.doneLines << endl; - if (pass.leftoverFromPreviousBlock) { - - if (!startBlock || startBlock(chunkNumber, pass.doneLines, 1 /* num in block*/)) { - const char * line = pass.leftoverFromPreviousBlock.data(); - size_t len = pass.leftoverFromPreviouBlock.length(); - - // Skip \r for DOS line endings - if (len > 0 && line[len - 1] == '\r') - --len; - - if (onLine(line, len, chunkNumber, pass.doneLines)) { - if (endBlock) { - endBlock(chunkNumber, pass.doneLines + 1); - } - } - } - } -#endif - } - - // If there was an exception, rethrow it rather than returning - // cleanly - if (hasExc) { - std::rethrow_exception(exc); - } } diff --git a/vfs/vfs.mk b/vfs/vfs.mk index a24b9dc17..815025c28 100644 --- a/vfs/vfs.mk +++ b/vfs/vfs.mk @@ -2,7 +2,7 @@ LIBVFS_SOURCES := \ fs_utils.cc \ - filter_streams.cc \ + filter_streams.cc \ http_streambuf.cc \ compressor.cc \ exception_ptr.cc \ From e68f382ed33f44fb7af6ec2706295202ca9b3e2f Mon Sep 17 00:00:00 2001 From: Jeremy Barnes Date: Fri, 31 Jan 2025 19:15:31 -0500 Subject: [PATCH 31/39] SQUASH for_each_line (10) --- base/base.mk | 1 + base/compute_context.h | 3 + base/compute_context_fwd.h | 6 + base/processing_state.cc | 166 ++++++++++++++++++++++++++ base/processing_state.h | 142 ++++++++++++++++++++++ base/processing_state_fwd.h | 17 +++ base/thread_pool.cc | 3 + base/thread_pool.h | 22 +++- block/content_descriptor.cc | 29 +++-- block/content_descriptor.h | 8 +- utils/coalesced_range.h | 17 +++ utils/for_each_line.cc | 30 ++--- utils/for_each_line.h | 147 +++++++++++------------ utils/testing/coalesced_range_test.cc | 41 ++++++- utils/testing/for_each_line_test.cc | 47 ++------ vfs/compressor.cc | 12 +- vfs/compressor.h | 12 +- vfs/lz4.cc | 21 ++-- vfs/zstandard.cc | 5 +- 19 files changed, 554 insertions(+), 175 deletions(-) create mode 100644 base/compute_context.h create mode 100644 base/compute_context_fwd.h create mode 100644 base/processing_state.cc create mode 100644 base/processing_state.h create mode 100644 base/processing_state_fwd.h diff --git a/base/base.mk b/base/base.mk index ac7ef7977..e91acd86b 100644 --- a/base/base.mk +++ b/base/base.mk @@ -4,6 +4,7 @@ LIBBASE_SOURCES := \ parse_context.cc \ thread_pool.cc \ + processing_state.cc \ parallel.cc \ optimized_path.cc \ hex_dump.cc \ diff --git a/base/compute_context.h b/base/compute_context.h new file mode 100644 index 000000000..9f2a2a213 --- /dev/null +++ b/base/compute_context.h @@ -0,0 +1,3 @@ +#pragma once +#include "compute_context_fwd.h" +#include "processing_state.h" diff --git a/base/compute_context_fwd.h b/base/compute_context_fwd.h new file mode 100644 index 000000000..5b9bb8f0e --- /dev/null +++ b/base/compute_context_fwd.h @@ -0,0 +1,6 @@ +#pragma once +#include "processing_state_fwd.h" + +namespace MLDB { +using ComputeContext = ProcessingState; +} diff --git a/base/processing_state.cc b/base/processing_state.cc new file mode 100644 index 000000000..7d5ab5b23 --- /dev/null +++ b/base/processing_state.cc @@ -0,0 +1,166 @@ +/** processing_state.cc + Jeremy Barnes, 29 November 2013 + Copyright (c) 2013 mldb.ai inc. All rights reserved. + This file is part of MLDB. Copyright 2015 mldb.ai inc. All rights reserved. + +*/ + +#include "processing_state.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "mldb/base/thread_pool.h" +#include "mldb/base/exc_assert.h" +#include "mldb/base/exc_check.h" +#include "mldb/arch/spinlock.h" +#include "mldb/ext/concurrentqueue/blockingconcurrentqueue.h" + +namespace MLDB { + +using moodycamel::BlockingConcurrentQueue; + +/*****************************************************************************/ +/* PROCESSING STATE INTERNAL */ +/*****************************************************************************/ + +struct ProcessingState::Itl { + Itl(int maxParallelism) + : tp_(maxParallelism) + { + } + +#if 0 + // Running a thread ties up a core for just this job, which is not good in + // the context of larger amounts of work. + void runThread() + { + while (!stopped()) { + WorkType work; + + // TODO: we shouldn't need to give a certain amount of time + if (!work_.wait_dequeue_timed(work, 1000)) { + continue; + } + + if (work == WorkType::STOP) + break; + + Job job; + { + std::unique_lock guard(queue_mutex_); + if (queue_.empty()) + continue; + job = queue_.top(); + } + + try { + job.fn(); + } MLDB_CATCH_ALL { + takeException(job.info); + break; + } + } + } +#endif + + std::atomic stop_ = 0; + std::atomic has_exception_ = 0; + std::exception_ptr exc_ptr_; + std::string exc_info_; + + struct Job { + int priority; + std::string info; + std::function fn; + auto operator <=> (const Job & other) const { return priority <=> other.priority; } + }; + + int max_parallelism_ = -1; + + Spinlock queue_mutex_; + std::priority_queue queue_; + + enum class WorkType { + STOP, // The queue should stop running + JOB // There is a queued job + }; + + // All work is put here so that the threads know when to wake up and look for some. + BlockingConcurrentQueue work_; + ThreadWorkGroup tp_; +}; + +/*****************************************************************************/ +/* PROCESSING STATE */ +/*****************************************************************************/ + + +ProcessingState(int maxParallelism = -1) + : max_parallelism_(maxParallelism == -1 ? numCpus() : maxParallelism), + itl(new Itl(max_parallelism_)) +{ + // Start the threads to do the work (they will sit there waiting for it) + for (int i = 0; i < max_parallelism_; ++i) { + tp_.add(std::bind(&ProcessingState::runThread, this)); + } +} + +ProcessingState::~ProcessingState() +{ +} + +// Must be called from a catch statement. This takes ownership of the currently active +// exception and stops the processing. +void ProcessingState::takeException(std::string info) +{ + using namespace std; + cerr << "taking exception in " << info << endl; + ExcAssert(std::current_exception()); + if (has_exception_.fetch_add(1) == 0) { + exc_ptr_ = std::current_exception(); + exc_info_ = std::move(info); + } + stop(); +} + +bool ProcessingState::hasException() const +{ + return has_exception_; +} + +void ProcessingState::stop() +{ + stop_ = true; + for (int i = 0; i <= max_parallelism_; ++i) { + work_.enqueue(WorkType::STOP); + } +} + +void ProcessingState::submit(int priority, std::string info, std::function fn) +{ + ExcCheckGreaterEqual(priority, 0, "invalid priority for submitted function"); + { + std::unique_lock guard(queue_mutex_); + queue_.emplace(priority, std::move(info), std::move(fn)); + work_.enqueue(WorkType::JOB); + } +} + +void ProcessingState::waitForAll() +{ + tp_.waitForAll(); +} + +void ProcessingState::rethrowIfException() +{ + if (exc_ptr_) + std::rethrow_exception(exc_ptr_); +} + +} // namespace MLDB diff --git a/base/processing_state.h b/base/processing_state.h new file mode 100644 index 000000000..9cdaea087 --- /dev/null +++ b/base/processing_state.h @@ -0,0 +1,142 @@ +/** processing_state.h + Jeremy Barnes, 29 November 2013 + Copyright (c) 2013 mldb.ai inc. All rights reserved. + This file is part of MLDB. Copyright 2015 mldb.ai inc. All rights reserved. + +*/ + +#pragma once + +#include "processing_state_fwd.h" +#include +#include +#include +#include +#include +#include + +namespace MLDB { + +// Function to generate a priority, that may be constructed from: +// - a lambda function +// - a priority value +// - nullptr + +template +struct PriorityFn { + PriorityFn() = default; + PriorityFn(int priority) : priority_(priority) { } + PriorityFn(std::nullptr_t) {} + + template + PriorityFn(Callable && fn, decltype(fn(std::declval()...)) = 1) : fn_(std::move(fn)) { } + + template + int operator () (Args&&... args) const + { + if (this->fn_) + return this->fn_(std::forward(args)...); + else return this->priority_; + } + + std::function fn_; + int priority_ = 0; +}; + +// Function to call a continuation for when work is done and processing needs to +// continue. This can also indicate that the processing should stop. It can be +// constructed from: +// - a lambda function returning a bool, indicating whether to continue +// - a lambda function returning void, indicating that the processing should continue +// - nullptr + +template +struct ContinuationFn { + // Default constructor: ignore + ContinuationFn() = default; + + // nullptr constructor: ignore + ContinuationFn(std::nullptr_t) {} + + // Constructor for a function that returns a bool + template + ContinuationFn(Callable && fn, std::enable_if_t()...)), bool>> * = 0) + : bool_fn_(std::move(fn)) { } + + // Constructor for a function that returns void + template + ContinuationFn(Callable && fn, std::enable_if_t()...))>> * = 0) + : void_fn_(std::move(fn)) { } + + template + bool operator () (Args&&... args) const + { + if (this->bool_fn_) + return this->bool_fn_(std::forward(args)...); + else if (this->void_fn_) + this->void_fn_(std::forward(args)...); + return true; + } + + std::function bool_fn_; + std::function void_fn_; +}; + +// Structure that keep track of the overall state of processing +struct ProcessingState { + + enum State { + RUNNING, + STOPPED_FINISHED, + STOPPED_EXCEPTION, + STOPPED_USER + }; + + ProcessingState(int maxParallelism = -1); + ProcessingState(ProcessingState & parent, int maxParallelism = -1); + ~ProcessingState(); + + // Must be called from a catch statement. This takes ownership of the currently active + // exception and stops the processing. + void takeException(std::string info); + + bool hasException() const; + + // Return an authorative answer to whether the processing has stopped. This is an expensive + // call in a multi-threaded and especially multi-processor environment. + bool is_stopped() const { return state_.load(std::memory_order_seq_cst) != RUNNING; } + + // Return a fast answer to whether the processing has stopped. This may return false negatives. + bool relaxed_stopped() const { return state_.load(std::memory_order_relaxed) != RUNNING; } + + // Stop the processing + void stop(); + + // Submit a job with the given priority to be processed. + void submit(int priority, std::string info, std::function fn); + + void waitForAll(); + + void rethrowIfException(); + + // Is the processing single-threaded? If so, we need to ensure that we never block in any + // of the jobs. Note that using this function is usually a design flaw on the processing + // function. + bool single_threaded() const; + + // Perform some useful work and return immediately if none is available or otherwise once + // some forward progress has been made. + void work() const; + + // Perform work until there is nothing outstanding in this pool of work. + void work_until_finished() const; + +protected: + std::atomic state_ = RUNNING; + struct Itl; + std::unique_ptr itl; + + void runThread(); +}; + +} // namespace MLDB diff --git a/base/processing_state_fwd.h b/base/processing_state_fwd.h new file mode 100644 index 000000000..8cb5000b3 --- /dev/null +++ b/base/processing_state_fwd.h @@ -0,0 +1,17 @@ +/** processing_state.h + Jeremy Barnes, 29 November 2013 + Copyright (c) 2013 mldb.ai inc. All rights reserved. + This file is part of MLDB. Copyright 2015 mldb.ai inc. All rights reserved. + +*/ + +#pragma once + +namespace MLDB { + +struct ProcessingState; +template struct PriorityFn; +template struct ContinuationFn; + + +} // namespace MLDB diff --git a/base/thread_pool.cc b/base/thread_pool.cc index 2a092b13e..5e67c27ff 100644 --- a/base/thread_pool.cc +++ b/base/thread_pool.cc @@ -51,6 +51,9 @@ int numCpus() threads, but not being able to do much itself. So the ability to handle lots of work being submitted by a given thread but not much being done by it is important. + + It's important that pool threads not block or sleep, as this can cause + deadlocks. */ struct ThreadPool::Itl: public std::enable_shared_from_this { diff --git a/base/thread_pool.h b/base/thread_pool.h index 438292a22..441a067da 100644 --- a/base/thread_pool.h +++ b/base/thread_pool.h @@ -41,9 +41,17 @@ struct ThreadPool { /** Add the given job to the thread pool. - The job MUST NOT throw an exception; any exception thrown within the - job WILL CRASH THE PROGRAM. (The lambda will be marked noexcept at - a later date). + If the ThreadPool is constructued with handleExceptions = false: + + The job MUST NOT throw an exception; any exception thrown within the + job WILL CRASH THE PROGRAM. (The lambda will be marked noexcept at + a later date). + + If the ThreadPool is constructed with handleExceptions = true: + + The job MAY throw an exception. If it does, then the exception will + be caught and stored. The first exception thrown will be rethrown + from waitForAll(). The job may either: 1. Be run before the add() function terminates @@ -122,7 +130,7 @@ struct ThreadPool { std::shared_ptr itl; }; - +#if 0 /*****************************************************************************/ /* THREAD WORK GROUP */ /*****************************************************************************/ @@ -133,6 +141,12 @@ struct ThreadWorkGroup: public ThreadPool { : ThreadPool(ThreadPool::instance(), maxParallelism, true /* handle exceptions */) { } + + ThreadWorkGroup(ThreadPool & parent, int maxParallelism = -1) + : ThreadPool(parent, maxParallelism, true /* handle exceptions */) + { + } }; +#endif } // namespace MLDB diff --git a/block/content_descriptor.cc b/block/content_descriptor.cc index d854bf008..a0720bd6b 100644 --- a/block/content_descriptor.cc +++ b/block/content_descriptor.cc @@ -15,6 +15,7 @@ #include "mldb/watch/watch_impl.h" #include "mldb/base/thread_pool.h" #include "mldb/base/iostream_adaptors.h" +#include "mldb/base/processing_state.h" using namespace std; @@ -380,8 +381,9 @@ bool ContentHandler:: forEachBlockParallel(uint64_t startOffset, uint64_t requestedBlockSize, - int maxParallelism, - std::function fn) const + ComputeContext & compute, + const PriorityFn & priority, + const ContinuationFn & onBlock) const { constexpr bool debug = false; if (debug) cerr << "ContentHandler foreachblockparallel" << endl; @@ -389,11 +391,11 @@ forEachBlockParallel(uint64_t startOffset, std::atomic finished(false); - ThreadWorkGroup tp(maxParallelism); + ComputeContext block_compute(compute); size_t blockNumber = 0; - - while (!finished && !tp.hasException()) { + + while (!finished && !compute.relaxed_stopped()) { uint64_t startOffset; FrozenMemoryRegion region; @@ -413,21 +415,21 @@ forEachBlockParallel(uint64_t startOffset, << startOffset << " len " << region.length() << endl; auto processBlock - = [myBlockNumber, startOffset, region, &fn, &finished] () + = [myBlockNumber, startOffset, region, &onBlock, &finished] () { - if (!fn(myBlockNumber, startOffset, region)) + if (!onBlock(myBlockNumber, startOffset, region)) finished = true; }; - if (maxParallelism == 0) + if (compute.single_threaded()) processBlock(); else - tp.add(std::move(processBlock)); + block_compute.submit(priority(blockNumber), "ContentHandler::forEachBlockParallel", std::move(processBlock)); offset = startOffset + region.length(); } - tp.waitForAll(); + block_compute.work_until_finished(); return !finished; } @@ -850,8 +852,9 @@ struct ContentDecompressor virtual bool forEachBlockParallel(uint64_t startOffset, uint64_t requestedBlockSize, - int maxParallelism, - std::function fn) const override + ComputeContext & compute, + const PriorityFn & priority, + const ContinuationFn & fn) const override { //maxParallelism = 1; @@ -913,7 +916,7 @@ struct ContentDecompressor }; return decompressor->forEachBlockParallel(requestedBlockSize, getData, onBlock, - allocate, maxParallelism); + allocate, compute, priority); } virtual std::pair diff --git a/block/content_descriptor.h b/block/content_descriptor.h index ec18a8dce..daf028c0d 100644 --- a/block/content_descriptor.h +++ b/block/content_descriptor.h @@ -19,6 +19,7 @@ #include "mldb/block/memory_region.h" #include "mldb/vfs/fs_utils.h" #include "mldb/watch/watch.h" +#include "mldb/base/compute_context.h" namespace MLDB { @@ -164,10 +165,9 @@ struct ContentHandler { virtual bool forEachBlockParallel(uint64_t startOffset, uint64_t requestedBlockSize, - int maxParallelism, - std::function fn) - const; + ComputeContext & compute, + const PriorityFn & priority, + const ContinuationFn & onBlock) const; virtual FrozenMemoryRegion getRange(uint64_t offset = 0, int64_t length = -1) const; diff --git a/utils/coalesced_range.h b/utils/coalesced_range.h index 045a55f7f..58d684b7e 100644 --- a/utils/coalesced_range.h +++ b/utils/coalesced_range.h @@ -227,6 +227,23 @@ struct CoalescedRange { return result; } + std::basic_string> to_string(const_iterator first, const_iterator last) const + { + ExcCheck(first.ranges_ == &ranges_ && last.ranges_ == &ranges_, "Attempt to convert span from wrong ranges"); + ExcCheck(first <= last, "Attempt to convert backwards span"); + + size_t n = std::distance(first, last); + std::basic_string> result; + result.reserve(n); + for (size_t i = first.range_; i <= last.range_ && i < ranges_.size(); ++i) { + auto start_ofs = i == first.range_ ? first.offset_ : 0; + auto end_ofs = i == last.range_ ? last.offset_ : ranges_[i].size(); + result.append(ranges_[i].data() + start_ofs, ranges_[i].data() + end_ofs); + } + return result; + } + + // Reduce it to contain just the mentioned range // It may lead to the list of ranges shrinking // The result gives the indexes (first and past-the-end) of the new range in the diff --git a/utils/for_each_line.cc b/utils/for_each_line.cc index f3f2b7a60..1b930a8c6 100644 --- a/utils/for_each_line.cc +++ b/utils/for_each_line.cc @@ -27,7 +27,7 @@ #include "mldb/base/scope.h" #include "mldb/utils/scoreboard.h" #include "mldb/utils/coalesced_range.h" -#include "mldb/base/processing_state.h" +#include "mldb/base/compute_context.h" using namespace std; using moodycamel::BlockingConcurrentQueue; @@ -52,10 +52,10 @@ struct ForEachLineOptions { const BlockSplitter * splitter = &newLineSplitter; }; -struct ForEachLineProcessor: public ProcessingState { +struct ForEachLineProcessor: public ComputeContext { ForEachLineProcessor(ForEachLineOptions options) - : ProcessingState(options.maxParallelism), options(options) + : ComputeContext(options.maxParallelism), options(options) { } @@ -116,7 +116,7 @@ struct ForEachLineProcessor: public ProcessingState { bool lastChunk = false; for (size_t chunkNumber = 0; stream; ++chunkNumber) { - if (stopped()) return false; + if (relaxed_stopped()) return false; size_t chunkOffset = stream.tellg(); stream.read(reinterpret_cast(block.get()), blockSize + extraCapacity); ssize_t bytesRead = stream.gcount(); @@ -150,7 +150,7 @@ struct ForEachLineProcessor: public ProcessingState { const std::byte * e = p + mem.size(); for (size_t chunkNumber = 0; p < e; p += blockSize) { - if (stopped()) return false; + if (relaxed_stopped()) return false; const std::byte * eb = std::min(e, p + blockSize); std::span mem(p, eb-p); size_t chunkOffset = startOffset + p - mem.data(); @@ -168,13 +168,15 @@ struct ForEachLineProcessor: public ProcessingState { auto doBlock = [&] (size_t chunkNumber, uint64_t chunkOffset, FrozenMemoryRegion region) { - if (stopped()) return false; + if (relaxed_stopped()) return false; bool lastChunk = chunkOffset + region.length() == contentSize; std::span mem(reinterpret_cast(region.data()), region.length()); return handle_chunk({chunkNumber, chunkOffset, lastChunk, mem, {}}); }; - return content.forEachBlockParallel(options.startOffset, blockSize, options.maxParallelism, doBlock); + auto getPriority = [] (size_t chunkNumber) -> int { return CHUNK_STREAM_PRIORITY; }; + auto res = content.forEachBlockParallel(options.startOffset, blockSize, *this /*compute*/, getPriority, doBlock); + return res; } bool handle_chunk(Chunk chunk) @@ -197,7 +199,7 @@ struct ForEachLineProcessor: public ProcessingState { // Slow down the production of chunks if there are too many by contributing to // other work. - while (numChunksOutstanding > numCpus() && !stopped()) { + while (numChunksOutstanding > numCpus() && !relaxed_stopped()) { { // Make sure there is no data race on chunksFinished // We could remove this lock if it becomes a problem by using the right sequencing @@ -206,7 +208,7 @@ struct ForEachLineProcessor: public ProcessingState { break; } - tp_.work(); + work(); std::unique_lock guard{chunks_mutex_}; numChunksOutstanding = chunks_.size(); @@ -311,7 +313,7 @@ struct ForEachLineProcessor: public ProcessingState { std::function job = [lineBlock=std::move(lineBlock),this] () { - if (this->stopped()) + if (this->relaxed_stopped()) return; if (!this->handle_line_block(std::move(lineBlock))) this->stop(); @@ -396,12 +398,6 @@ struct ForEachLineProcessor: public ProcessingState { std::atomic chunksFinished = false; }; -// Structure that keep track of the overall status of processing -struct Processing: public ProcessingState { - Processing(int numThreads) : ProcessingState(numThreads) {} - BlockingConcurrentQueue > > decompressedLines; -}; - } // file scope size_t @@ -417,7 +413,7 @@ forEachLine(std::istream & stream, processLine(line.c_str(), line.size(), lineNum); }; - return forEachLineStr(stream, onLineStr, logger, numThreads, + return forEachLine(stream, onLineStr, logger, numThreads, ignoreStreamExceptions, maxLines); } diff --git a/utils/for_each_line.h b/utils/for_each_line.h index 95379db66..24a9c33dd 100644 --- a/utils/for_each_line.h +++ b/utils/for_each_line.h @@ -11,10 +11,12 @@ #include "mldb/utils/log_fwd.h" #include "mldb/utils/block_splitter.h" +#include "mldb/base/compute_context.h" #include #include #include #include +#include #include #include #include @@ -24,82 +26,82 @@ namespace MLDB { struct ContentHandler; -/** Run the given lambda over every line read from the stream, with the - work distributed over the given number of threads. - - The processLine function takes a string with the contents of the line, - without the newline, as a beginning and a length. - - Returns the number of lines produced. -*/ -size_t -forEachLine(std::istream & stream, - const std::function & processLine, - std::shared_ptr logger, - int numThreads = 4, - bool ignoreStreamExceptions = false, - int64_t maxLines = -1); - +struct LineInfo { + std::string_view line; + int64_t lineNumber = -1; + int64_t blockNumber = -1; + int64_t startOffset = -1; +}; + +struct LineContinuationFn: public ContinuationFn { + using Base = ContinuationFn; + //template LineContinuationFn(Args&&... args, std::enable_if_t> * = 0): Base(std::forward(args)...) {} + using Base::Base; + +#if 1 + // Constructor for a function + template()(std::declval(), std::declval(), std::declval(), std::declval()))*/> + LineContinuationFn(Callable fn, std::enable_if_t || std::is_convertible_v> * = 0) + : Base([fn = std::forward(fn)] (LineInfo line) { return fn(line.line.data(), line.line.size(), line.blockNumber, line.lineNumber); }) { } + + template()(std::declval(), std::declval(), std::declval(), std::declval()))*/> + LineContinuationFn(Callable fn, std::enable_if_t(),2))> || std::is_convertible_v(),2))>> * = 0) + : Base([fn = std::forward(fn)] (LineInfo line) { return fn(std::string(line.line.data(), line.line.data() + line.line.size()), line.lineNumber); }) { } + + template + LineContinuationFn(Callable fn, std::enable_if_t || std::is_convertible_v> * = 0) + : Base([fn = std::forward(fn)] (LineInfo line) { return fn(line.line.data(), line.line.size(), line.lineNumber); }) { } +#endif +}; + +struct LineBlockInfo { + std::span block; + int64_t blockNumber = -1; + int64_t startOffset = -1; + int64_t lineNumber = -1; + int64_t numLinesInBlock = -1; +}; + +struct BlockContinuationFn: public ContinuationFn { + using Base = ContinuationFn; + using Base::Base; + +#if 1 + // Constructor for a function + template + BlockContinuationFn(Callable && fn, decltype(fn(1,2,3)) * = 0) + : Base([fn = std::move(fn)] (LineBlockInfo block) { return fn(block.blockNumber, block.lineNumber, block.numLinesInBlock); }) { } +#endif +}; + +struct ChunkInfo { + std::span chunk; + int64_t chunkNumber = -1; + int64_t startOffset = -1; +}; + +struct ChunkContinuationFn: public ContinuationFn { + using Base = ContinuationFn; + using Base::Base; +}; /** Run the given lambda over every line read from the stream, with the work distributed over the given number of threads. - The processLine function takes a string with the contents of the line, - without the newline. - - Returns the number of lines produced. -*/ -size_t -forEachLineStr(std::istream & stream, - const std::function & processLine, - std::shared_ptr logger, - int numThreads = 4, - bool ignoreStreamExceptions = false, - int64_t maxLines = -1); - - -/** Run the given lambda over every line read from the file, with the - work distributed over the given number of threads. - The processLine function takes a string with the contents of the line, without the newline, as a beginning and a length. - Uses an filter_istream under the hood. - Returns the number of lines produced. */ size_t -forEachLine(const std::string & filename, - const std::function & processLine, +forEachLine(std::istream & stream, + const LineContinuationFn & processLine, std::shared_ptr logger, int numThreads = 4, bool ignoreStreamExceptions = false, int64_t maxLines = -1); -/** Run the given lambda over every line read from the file, with the - work distributed over the given number of threads. - - The processLine function takes a string with the contents of the line, - without the newline. - - Uses an filter_istream under the hood. - - Returns the number of lines produced. -*/ -size_t -forEachLineStr(const std::string & filename, - const std::function & processLine, - std::shared_ptr logger, - int numThreads = 4, - bool ignoreStreamExceptions = false, - int64_t maxLines = -1); - - /** Run the given lambda over every line read from the file, with the work distributed over threads each of which receive one block. The threads will be taken from the default thread pool, with a maximum of @@ -128,10 +130,8 @@ bool forEachLineBlock(std::istream & stream, int64_t lineNumber)> onLine, int64_t maxLines = -1, int maxParallelism = 8, - std::function startBlock - = nullptr, - std::function endBlock - = nullptr, + const BlockContinuationFn & startBlock = nullptr, + const BlockContinuationFn & endBlock = nullptr, ssize_t blockSize = -1, const BlockSplitter & splitter = newLineSplitter); @@ -152,20 +152,11 @@ bool forEachLineBlock(std::istream & stream, bool forEachLineBlock(std::shared_ptr content, uint64_t startOffset, - std::function onLine, + const LineContinuationFn & onLine, int64_t maxLines = -1, int maxParallelism = 8, - std::function startBlock - = nullptr, - std::function endBlock - = nullptr, + BlockContinuationFn startBlock = nullptr, + BlockContinuationFn endBlock = nullptr, size_t blockSize = 20'000'000, const BlockSplitter & splitter = newLineSplitter); @@ -180,9 +171,7 @@ bool forEachLineBlock(std::shared_ptr content, concurrent lambdas have finished executing. */ void forEachChunk(std::istream & stream, - std::function onChunk, + const ChunkContinuationFn & onChunk, size_t chunkLength, int64_t maxChunks, int maxParallelism); diff --git a/utils/testing/coalesced_range_test.cc b/utils/testing/coalesced_range_test.cc index 069a295a4..339591cdd 100644 --- a/utils/testing/coalesced_range_test.cc +++ b/utils/testing/coalesced_range_test.cc @@ -76,7 +76,6 @@ TEST_CASE("coalesced range reduce") range.add(span("world", 5)); range.add(span("\n", 1)); -#if 1 SECTION("no-op reduce") { auto [first, last] = range.reduce(range.begin(), range.end()); CHECK(first == 0); @@ -106,10 +105,8 @@ TEST_CASE("coalesced range reduce") SECTION("keep " + to_string(keep)) { for (size_t i = 0; i < range.size() - keep; ++i) { SECTION("position " + to_string(i)) { - cerr << "keep " << keep << " at " << i << endl; auto it = range.begin() + i, end = range.begin() + i + keep; string str(it, end); - cerr << "got iterators" << endl; auto [first, last] = range.reduce(it, end); CHECK(first <= last); CHECK(range.to_string() == str); @@ -119,7 +116,6 @@ TEST_CASE("coalesced range reduce") } } } -#endif SECTION("reduce remove first word") { auto [first, last] = range.reduce(range.begin(), range.begin() + 5); @@ -135,3 +131,40 @@ TEST_CASE("coalesced range reduce") CHECK(range.to_string() == "world"); } } + +TEST_CASE("coalesced range to_string()") +{ + CoalescedRange range; + + range.add(span("hello", 5)); + range.add(span(" ", 1)); + range.add(span("world", 5)); + range.add(span("\n", 1)); + + SECTION("full range") { + CHECK(range.to_string() == "hello world\n"); + } + + SECTION("partial range") { + CHECK(range.to_string(range.begin() + 6, range.end()) == "world\n"); + } + + SECTION("empty range") { + CHECK(range.to_string(range.end(), range.end()) == ""); + CHECK(range.to_string(range.begin(), range.begin()) == ""); + } + + SECTION("keep n characters") { + for (size_t keep = 0; keep < range.size(); ++keep) { + SECTION("keep " + to_string(keep)) { + for (size_t i = 0; i < range.size() - keep; ++i) { + SECTION("position " + to_string(i)) { + auto it = range.begin() + i, end = range.begin() + i + keep; + string str(it, end); + CHECK(range.to_string(it, end) == str); + } + } + } + } + } +} diff --git a/utils/testing/for_each_line_test.cc b/utils/testing/for_each_line_test.cc index fd9c776a1..533eeb909 100644 --- a/utils/testing/for_each_line_test.cc +++ b/utils/testing/for_each_line_test.cc @@ -17,6 +17,7 @@ #include "mldb/utils/for_each_line.h" #include "mldb/vfs/filter_streams.h" #include "mldb/block/content_descriptor.h" +#include "mldb/utils/coalesced_range.h" #include "mldb/utils/testing/mldb_catch2.h" using namespace std; @@ -184,7 +185,7 @@ TEST_CASE(" test_forEachLineStr_data ") }; auto logger = getMldbLog("test"); - forEachLineStr(stream, processLine, logger); + forEachLine(stream, processLine, logger); CHECK(result == expected); } @@ -205,7 +206,7 @@ TEST_CASE(" test_forEachLine_throw ") }; auto logger = getMldbLog("test"); - CHECK_THROWS(forEachLineStr(stream, processLine, logger)); + CHECK_THROWS(forEachLine(stream, processLine, logger)); } TEST_CASE("split newlines") @@ -244,42 +245,20 @@ TEST_CASE("split newlines") const char * p = data; auto currentState = splitter.newState(); - //const char * lineStart = p; - //const char * blockStart = p; - std::string currentBlock; + TextBlock block; for (; p < end; p += blockSize) { - const char * e = p + blockSize; - if (e > end) e = end; - - std::string nextBlock(p, e); + // Add a new block + block.add(p, std::min(p + blockSize, end)); + bool isLastBlock = p + blockSize == end; - bool isLastBlock = e == end; - auto [newline_pos, newState] = splitter.nextBlock(currentBlock.c_str(), currentBlock.size(), nextBlock.c_str(), nextBlock.size(), - isLastBlock, currentState); + auto splitter_res = splitter.nextRecord(block, block.begin(), isLastBlock, currentState); + if (!splitter_res) continue; // No newline, we need a new block + auto [newline_pos, newState] = splitter_res.value(); currentState = std::move(newState); - - std::string line; - if (newline_pos == 0) { - // No newline, we need a new block - currentBlock += nextBlock; - continue; - } - else if (newline_pos >= currentBlock.c_str() && newline_pos < currentBlock.c_str() + currentBlock.size()) { - // newline is in the current block - CHECK(*newline_pos == '\n'); - line = std::string(currentBlock.c_str(), newline_pos); - currentBlock = std::string(currentBlock, newline_pos - currentBlock.c_str() + 1); - } - else if (newline_pos >= nextBlock.c_str() && newline_pos < nextBlock.c_str() + nextBlock.size()) { - // Newline is in the next block - CHECK(*newline_pos == '\n'); - line = currentBlock + std::string(nextBlock.c_str(), newline_pos); - currentBlock = std::string(nextBlock, newline_pos - nextBlock.c_str() + 1); - } - else { - REQUIRE(false); - } + CHECK(*newline_pos == '\n'); + std::string line = block.to_string(block.begin(), newline_pos); + block.reduce(newline_pos + 1, block.end()); checkLine(line); } diff --git a/vfs/compressor.cc b/vfs/compressor.cc index da7f88b94..303191bb5 100644 --- a/vfs/compressor.cc +++ b/vfs/compressor.cc @@ -13,6 +13,7 @@ #include #include #include "mldb/base/thread_pool.h" +#include "mldb/base/compute_context.h" #include @@ -180,7 +181,8 @@ forEachBlockParallel(size_t requestedBlockSize, const GetDataFunction & getData, const ForEachBlockFunction & onBlock, const Allocate & allocate, - int maxParallelism) + ComputeContext & compute, + const PriorityFn & priority) { bool finished = false; size_t blockNumber = 0; @@ -188,8 +190,6 @@ forEachBlockParallel(size_t requestedBlockSize, size_t numChars = 0; std::shared_ptr buf; - ThreadWorkGroup tp(maxParallelism); - // We queue them up as we want to ensure they run in sequence std::mutex jobsMutex; std::deque jobs; @@ -225,12 +225,12 @@ forEachBlockParallel(size_t requestedBlockSize, } }; - if (maxParallelism > 0) { + if (!compute.single_threaded()) { { std::unique_lock guard{jobsMutex}; jobs.push_back(std::move(doBlock)); } - tp.add(doOne); + compute.submit(priority(myBlockNumber), "Decompressor::forEachBlockParallel", doOne); } else { doBlock(); @@ -243,7 +243,7 @@ forEachBlockParallel(size_t requestedBlockSize, decompress(buf, numChars, onData, allocate); } - tp.waitForAll(); + compute.work_until_finished(); return !finished; } diff --git a/vfs/compressor.h b/vfs/compressor.h index bdf4dd86f..be4e04345 100644 --- a/vfs/compressor.h +++ b/vfs/compressor.h @@ -19,6 +19,7 @@ #include #include #include "mldb/types/string.h" +#include "mldb/base/compute_context_fwd.h" namespace MLDB { @@ -186,10 +187,10 @@ struct Decompressor { const Allocate & allocate); - typedef std::function blockStart, - size_t blockLength)> + typedef ContinuationFn blockStart, + size_t blockLength)> ForEachBlockFunction; typedef std::function, size_t> (size_t)> @@ -199,7 +200,8 @@ struct Decompressor { const GetDataFunction & getData, const ForEachBlockFunction & onBlock, const Allocate & allocate, - int maxParallelism = -1); + ComputeContext & compute, + const PriorityFn & priority); /** Create a compressor with the given scheme. Returns nullptr if the given compression scheme isn't found. diff --git a/vfs/lz4.cc b/vfs/lz4.cc index 3a23e03a4..e1a345e74 100644 --- a/vfs/lz4.cc +++ b/vfs/lz4.cc @@ -14,6 +14,7 @@ #include "mldb/arch/endian.h" #include "mldb/base/exc_assert.h" #include "mldb/base/thread_pool.h" +#include "mldb/base/compute_context.h" #include #include "mldb/base/scope.h" #include @@ -615,10 +616,12 @@ struct Lz4Decompressor: public Decompressor { const GetDataFunction & getData, const ForEachBlockFunction & onBlock, const Allocate & allocate, - int maxParallelism) override + ComputeContext & compute, + const PriorityFn & priority) override { //return Decompressor::forEachBlockParallel(requestedBlockSize, getData, onBlock); - ThreadWorkGroup tp(maxParallelism); + + ComputeContext block_compute(compute); std::shared_ptr buf; size_t bufLen = 0; @@ -712,8 +715,11 @@ struct Lz4Decompressor: public Decompressor { this, &aborted, &onBlock, - &allocate] () + &allocate, + &compute] () { + if (compute.relaxed_stopped()) + return; std::shared_ptr outputData; size_t outputLength; @@ -734,15 +740,16 @@ struct Lz4Decompressor: public Decompressor { blockOffset += blockSize; // Finish processing in a new thread - if (maxParallelism > 1) - tp.add(std::move(processBlock)); - else processBlock(); + if (compute.single_threaded()) + processBlock(); + else + compute.submit(priority(blockNumber), "lz4 decompress block", std::move(processBlock)); // Start of a new block again setCur(BLOCK_HEADER, blockHeader); } - tp.waitForAll(); + block_compute.work_until_finished(); return !aborted; } diff --git a/vfs/zstandard.cc b/vfs/zstandard.cc index a2b6121d6..39eb51298 100644 --- a/vfs/zstandard.cc +++ b/vfs/zstandard.cc @@ -174,9 +174,10 @@ struct ZStandardDecompressor: public Decompressor { const GetDataFunction & getData, const ForEachBlockFunction & onBlock, const Allocate & allocate, - int maxParallelism) override + ComputeContext & compute, + const PriorityFn & priority) override { - return Decompressor::forEachBlockParallel(requestedBlockSize, getData, onBlock, allocate, maxParallelism); + return Decompressor::forEachBlockParallel(requestedBlockSize, getData, onBlock, allocate, compute, priority); // To do this, we would need to: // - Get fixed sized chunks from the underlying stream // - Pass each to a stream From f35e51175227a551aac1e1ae210f9cc9c5f5062c Mon Sep 17 00:00:00 2001 From: Jeremy Barnes Date: Sat, 1 Feb 2025 06:33:25 -0500 Subject: [PATCH 32/39] SQUASH for_each_line (11) --- base/base.mk | 2 +- ...processing_state.cc => compute_context.cc} | 147 +++++++++++----- base/compute_context.h | 157 +++++++++++++++++- base/compute_context_fwd.h | 16 +- base/processing_state.h | 142 ---------------- base/processing_state_fwd.h | 17 -- base/testing/base_testing.mk | 2 +- ..._state_test.cc => compute_context_test.cc} | 8 +- base/testing/thread_pool_test.cc | 4 +- base/thread_pool.h | 19 --- block/content_descriptor.cc | 2 +- block/testing/content_descriptor_test.cc | 4 +- utils/for_each_line.cc | 123 +++++--------- utils/for_each_line.h | 42 +++-- 14 files changed, 351 insertions(+), 334 deletions(-) rename base/{processing_state.cc => compute_context.cc} (51%) rename base/testing/{processing_state_test.cc => compute_context_test.cc} (68%) diff --git a/base/base.mk b/base/base.mk index e91acd86b..552045c92 100644 --- a/base/base.mk +++ b/base/base.mk @@ -4,7 +4,7 @@ LIBBASE_SOURCES := \ parse_context.cc \ thread_pool.cc \ - processing_state.cc \ + compute_context.cc \ parallel.cc \ optimized_path.cc \ hex_dump.cc \ diff --git a/base/processing_state.cc b/base/compute_context.cc similarity index 51% rename from base/processing_state.cc rename to base/compute_context.cc index 7d5ab5b23..6d2a7d726 100644 --- a/base/processing_state.cc +++ b/base/compute_context.cc @@ -1,11 +1,11 @@ -/** processing_state.cc +/** compute_context.cc Jeremy Barnes, 29 November 2013 Copyright (c) 2013 mldb.ai inc. All rights reserved. This file is part of MLDB. Copyright 2015 mldb.ai inc. All rights reserved. */ -#include "processing_state.h" +#include "compute_context.h" #include #include #include @@ -15,26 +15,20 @@ #include #include #include +#include + #include "mldb/base/thread_pool.h" #include "mldb/base/exc_assert.h" #include "mldb/base/exc_check.h" #include "mldb/arch/spinlock.h" #include "mldb/ext/concurrentqueue/blockingconcurrentqueue.h" +using namespace std; + namespace MLDB { using moodycamel::BlockingConcurrentQueue; -/*****************************************************************************/ -/* PROCESSING STATE INTERNAL */ -/*****************************************************************************/ - -struct ProcessingState::Itl { - Itl(int maxParallelism) - : tp_(maxParallelism) - { - } - #if 0 // Running a thread ties up a core for just this job, which is not good in // the context of larger amounts of work. @@ -69,8 +63,24 @@ struct ProcessingState::Itl { } #endif - std::atomic stop_ = 0; - std::atomic has_exception_ = 0; + + +/*****************************************************************************/ +/* PROCESSING STATE INTERNAL */ +/*****************************************************************************/ + +struct ComputeContext::Itl { + Itl(int maxParallelism) + : max_parallelism_(maxParallelism), tp_(ThreadPool::instance(), maxParallelism, false /* handle exceptions */) + { + } + + Itl(Itl & parent) + : max_parallelism_(parent.max_parallelism_), tp_(parent.tp_) + { + } + + std::atomic state_ = ComputeContext::RUNNING; std::exception_ptr exc_ptr_; std::string exc_info_; @@ -91,9 +101,42 @@ struct ProcessingState::Itl { JOB // There is a queued job }; + void stop_work() + { + for (int i = 0; i <= max_parallelism_; ++i) { + work_.enqueue(Itl::WorkType::STOP); + } + } + + void submit(int priority, std::string info, std::function fn) + { + ExcCheckGreaterEqual(priority, 0, "invalid priority for submitted function"); + { + std::unique_lock guard(queue_mutex_); + queue_.emplace(priority, std::move(info), std::move(fn)); + work_.enqueue(WorkType::JOB); + } + } + + void work() + { + tp_.work(); + } + + void work_until_finished() + { + tp_.waitForAll(); + } + + void rethrow_if_exception() + { + if (exc_ptr_) + std::rethrow_exception(exc_ptr_); + } + // All work is put here so that the threads know when to wake up and look for some. BlockingConcurrentQueue work_; - ThreadWorkGroup tp_; + ThreadPool tp_; }; /*****************************************************************************/ @@ -101,66 +144,78 @@ struct ProcessingState::Itl { /*****************************************************************************/ -ProcessingState(int maxParallelism = -1) - : max_parallelism_(maxParallelism == -1 ? numCpus() : maxParallelism), - itl(new Itl(max_parallelism_)) +ComputeContext::ComputeContext(int maxParallelism) + : itl_(new Itl(maxParallelism)), state_(itl_->state_) { - // Start the threads to do the work (they will sit there waiting for it) - for (int i = 0; i < max_parallelism_; ++i) { - tp_.add(std::bind(&ProcessingState::runThread, this)); - } } -ProcessingState::~ProcessingState() +ComputeContext::ComputeContext(ComputeContext & parent, int maxParallelism) + : itl_(new Itl(*parent.itl_)), state_(itl_->state_) +{ +} + +ComputeContext::~ComputeContext() { } // Must be called from a catch statement. This takes ownership of the currently active -// exception and stops the processing. -void ProcessingState::takeException(std::string info) +// exception and stops the processing, unless it has already been stopped for another +// reason (exception, explicit stop). +void ComputeContext::take_exception(std::string info) { using namespace std; cerr << "taking exception in " << info << endl; ExcAssert(std::current_exception()); - if (has_exception_.fetch_add(1) == 0) { - exc_ptr_ = std::current_exception(); - exc_info_ = std::move(info); + auto current_state = state_.load(std::memory_order_relaxed); + while (current_state == RUNNING) { + if (state_.compare_exchange_weak(current_state, STOPPED_EXCEPTION)) { + itl_->exc_ptr_ = std::current_exception(); + itl_->exc_info_ = std::move(info); + } } + stop(); } -bool ProcessingState::hasException() const +bool ComputeContext::has_exception() const { - return has_exception_; + return state_.load(std::memory_order_relaxed) == STOPPED_EXCEPTION; } -void ProcessingState::stop() +void ComputeContext::stop() { - stop_ = true; - for (int i = 0; i <= max_parallelism_; ++i) { - work_.enqueue(WorkType::STOP); + auto current_state = state_.load(std::memory_order_relaxed); + while (current_state == RUNNING) { + if (state_.compare_exchange_weak(current_state, STOPPED_EXCEPTION)) + break; } + + itl_->stop_work(); } -void ProcessingState::submit(int priority, std::string info, std::function fn) +void ComputeContext::submit(int priority, std::string info, std::function fn) { - ExcCheckGreaterEqual(priority, 0, "invalid priority for submitted function"); - { - std::unique_lock guard(queue_mutex_); - queue_.emplace(priority, std::move(info), std::move(fn)); - work_.enqueue(WorkType::JOB); - } + itl_->submit(priority, info, std::move(fn)); +} + +void ComputeContext::work() +{ + itl_->work(); +} + +void ComputeContext::work_until_finished() +{ + itl_->work_until_finished(); } -void ProcessingState::waitForAll() +void ComputeContext::rethrow_if_exception() { - tp_.waitForAll(); + itl_->rethrow_if_exception(); } -void ProcessingState::rethrowIfException() +bool ComputeContext::single_threaded() const { - if (exc_ptr_) - std::rethrow_exception(exc_ptr_); + return itl_->max_parallelism_ == 1; } } // namespace MLDB diff --git a/base/compute_context.h b/base/compute_context.h index 9f2a2a213..233e459c4 100644 --- a/base/compute_context.h +++ b/base/compute_context.h @@ -1,3 +1,158 @@ +/** compute_context.h + Jeremy Barnes, 29 November 2013 + Copyright (c) 2013 mldb.ai inc. All rights reserved. + This file is part of MLDB. Copyright 2015 mldb.ai inc. All rights reserved. + +*/ + #pragma once + #include "compute_context_fwd.h" -#include "processing_state.h" +#include +#include +#include +#include +#include +#include + +namespace MLDB { + + +/**********************************************************************/ +/* PRIORITY FUNCTION */ +/**********************************************************************/ + +// Function to generate a priority, that may be constructed from: +// - a lambda function +// - a priority value +// - nullptr + +template +struct PriorityFn { + PriorityFn() = default; + PriorityFn(int priority) : priority_(priority) { } + PriorityFn(std::nullptr_t) {} + + template + PriorityFn(Callable && fn, decltype(fn(std::declval()...)) = 1) : fn_(std::move(fn)) { } + + template + int operator () (Args&&... args) const + { + if (this->fn_) + return this->fn_(std::forward(args)...); + else return this->priority_; + } + + std::function fn_; + int priority_ = -1; + + operator bool() const { return bool(fn_) || priority_ != -1; } +}; + + +/**********************************************************************/ +/* CONTINUATION FUNCTION */ +/**********************************************************************/ + +// Function to call a continuation for when work is done and processing needs to +// continue. This can also indicate that the processing should stop. It can be +// constructed from: +// - a lambda function returning a bool, indicating whether to continue +// - a lambda function returning void, indicating that the processing should continue +// - nullptr + +template +struct ContinuationFn { + // Default constructor: ignore + ContinuationFn() = default; + + // nullptr constructor: ignore + ContinuationFn(std::nullptr_t) {} + + // Constructor for a function that returns a bool + template + ContinuationFn(Callable && fn, std::enable_if_t()...)), bool>> * = 0) + : bool_fn_(std::move(fn)) { } + + // Constructor for a function that returns void + template + ContinuationFn(Callable && fn, std::enable_if_t()...))>> * = 0) + : void_fn_(std::move(fn)) { } + + template + bool operator () (Args&&... args) const + { + if (this->bool_fn_) + return this->bool_fn_(std::forward(args)...); + else if (this->void_fn_) + this->void_fn_(std::forward(args)...); + return true; + } + + std::function bool_fn_; + std::function void_fn_; + + operator bool() const { return bool_fn_ || void_fn_; } +}; + + +/**********************************************************************/ +/* COMPUTE CONTEXT */ +/**********************************************************************/ + +// Controls the computation available for a particular job +struct ComputeContext { + + enum State { + RUNNING, + STOPPED_FINISHED, + STOPPED_EXCEPTION, + STOPPED_USER + }; + + ComputeContext(int maxParallelism = -1); + ComputeContext(ComputeContext & parent, int maxParallelism = -1); + ~ComputeContext(); + + // Must be called from a catch statement. This takes ownership of the currently active + // exception and stops the processing. + void take_exception(std::string info); + + bool has_exception() const; + + // Return an authorative answer to whether the processing has stopped. This is an expensive + // call in a multi-threaded and especially multi-processor environment. + bool is_stopped() const { return state_.load(std::memory_order_seq_cst) != RUNNING; } + + // Return a fast answer to whether the processing has stopped. This may return false negatives. + bool relaxed_stopped() const { return state_.load(std::memory_order_relaxed) != RUNNING; } + + // Stop the processing + void stop(); + + // Submit a job with the given priority to be processed. + void submit(int priority, std::string info, std::function fn); + + // If we have captured an exception, rethrow it now. Otherwise it's a no-op. + void rethrow_if_exception(); + + // Is the processing single-threaded? If so, we need to ensure that we never block in any + // of the jobs. Note that using this function is usually a design flaw on the processing + // function. + bool single_threaded() const; + + // Perform some useful work and return immediately if none is available or otherwise once + // some forward progress has been made. + void work(); + + // Perform work until there is nothing outstanding in this pool of work. + void work_until_finished(); + +protected: + struct Itl; + std::unique_ptr itl_; + std::atomic & state_; +}; + +} // namespace MLDB diff --git a/base/compute_context_fwd.h b/base/compute_context_fwd.h index 5b9bb8f0e..0da4193e1 100644 --- a/base/compute_context_fwd.h +++ b/base/compute_context_fwd.h @@ -1,6 +1,16 @@ +/** compute_context_fwd.h + Jeremy Barnes, 29 November 2013 + Copyright (c) 2013 mldb.ai inc. All rights reserved. + This file is part of MLDB. Copyright 2015 mldb.ai inc. All rights reserved. + +*/ + #pragma once -#include "processing_state_fwd.h" namespace MLDB { -using ComputeContext = ProcessingState; -} + +struct ComputeContext; +template struct PriorityFn; +template struct ContinuationFn; + +} // namespace MLDB diff --git a/base/processing_state.h b/base/processing_state.h index 9cdaea087..e69de29bb 100644 --- a/base/processing_state.h +++ b/base/processing_state.h @@ -1,142 +0,0 @@ -/** processing_state.h - Jeremy Barnes, 29 November 2013 - Copyright (c) 2013 mldb.ai inc. All rights reserved. - This file is part of MLDB. Copyright 2015 mldb.ai inc. All rights reserved. - -*/ - -#pragma once - -#include "processing_state_fwd.h" -#include -#include -#include -#include -#include -#include - -namespace MLDB { - -// Function to generate a priority, that may be constructed from: -// - a lambda function -// - a priority value -// - nullptr - -template -struct PriorityFn { - PriorityFn() = default; - PriorityFn(int priority) : priority_(priority) { } - PriorityFn(std::nullptr_t) {} - - template - PriorityFn(Callable && fn, decltype(fn(std::declval()...)) = 1) : fn_(std::move(fn)) { } - - template - int operator () (Args&&... args) const - { - if (this->fn_) - return this->fn_(std::forward(args)...); - else return this->priority_; - } - - std::function fn_; - int priority_ = 0; -}; - -// Function to call a continuation for when work is done and processing needs to -// continue. This can also indicate that the processing should stop. It can be -// constructed from: -// - a lambda function returning a bool, indicating whether to continue -// - a lambda function returning void, indicating that the processing should continue -// - nullptr - -template -struct ContinuationFn { - // Default constructor: ignore - ContinuationFn() = default; - - // nullptr constructor: ignore - ContinuationFn(std::nullptr_t) {} - - // Constructor for a function that returns a bool - template - ContinuationFn(Callable && fn, std::enable_if_t()...)), bool>> * = 0) - : bool_fn_(std::move(fn)) { } - - // Constructor for a function that returns void - template - ContinuationFn(Callable && fn, std::enable_if_t()...))>> * = 0) - : void_fn_(std::move(fn)) { } - - template - bool operator () (Args&&... args) const - { - if (this->bool_fn_) - return this->bool_fn_(std::forward(args)...); - else if (this->void_fn_) - this->void_fn_(std::forward(args)...); - return true; - } - - std::function bool_fn_; - std::function void_fn_; -}; - -// Structure that keep track of the overall state of processing -struct ProcessingState { - - enum State { - RUNNING, - STOPPED_FINISHED, - STOPPED_EXCEPTION, - STOPPED_USER - }; - - ProcessingState(int maxParallelism = -1); - ProcessingState(ProcessingState & parent, int maxParallelism = -1); - ~ProcessingState(); - - // Must be called from a catch statement. This takes ownership of the currently active - // exception and stops the processing. - void takeException(std::string info); - - bool hasException() const; - - // Return an authorative answer to whether the processing has stopped. This is an expensive - // call in a multi-threaded and especially multi-processor environment. - bool is_stopped() const { return state_.load(std::memory_order_seq_cst) != RUNNING; } - - // Return a fast answer to whether the processing has stopped. This may return false negatives. - bool relaxed_stopped() const { return state_.load(std::memory_order_relaxed) != RUNNING; } - - // Stop the processing - void stop(); - - // Submit a job with the given priority to be processed. - void submit(int priority, std::string info, std::function fn); - - void waitForAll(); - - void rethrowIfException(); - - // Is the processing single-threaded? If so, we need to ensure that we never block in any - // of the jobs. Note that using this function is usually a design flaw on the processing - // function. - bool single_threaded() const; - - // Perform some useful work and return immediately if none is available or otherwise once - // some forward progress has been made. - void work() const; - - // Perform work until there is nothing outstanding in this pool of work. - void work_until_finished() const; - -protected: - std::atomic state_ = RUNNING; - struct Itl; - std::unique_ptr itl; - - void runThread(); -}; - -} // namespace MLDB diff --git a/base/processing_state_fwd.h b/base/processing_state_fwd.h index 8cb5000b3..e69de29bb 100644 --- a/base/processing_state_fwd.h +++ b/base/processing_state_fwd.h @@ -1,17 +0,0 @@ -/** processing_state.h - Jeremy Barnes, 29 November 2013 - Copyright (c) 2013 mldb.ai inc. All rights reserved. - This file is part of MLDB. Copyright 2015 mldb.ai inc. All rights reserved. - -*/ - -#pragma once - -namespace MLDB { - -struct ProcessingState; -template struct PriorityFn; -template struct ContinuationFn; - - -} // namespace MLDB diff --git a/base/testing/base_testing.mk b/base/testing/base_testing.mk index 9d959e627..e36c8123d 100644 --- a/base/testing/base_testing.mk +++ b/base/testing/base_testing.mk @@ -5,4 +5,4 @@ $(eval $(call test,thread_pool_test,base arch,boost timed)) $(eval $(call test,thread_queue_test,base arch,boost timed)) $(eval $(call test,per_thread_accumulator_test,base arch,boost)) $(eval $(call test,iostream_adaptors_test,arch base, catch2)) -$(eval $(call test,processing_state_test,arch base,catch2)) +$(eval $(call test,compute_context_test,arch base,catch2)) diff --git a/base/testing/processing_state_test.cc b/base/testing/compute_context_test.cc similarity index 68% rename from base/testing/processing_state_test.cc rename to base/testing/compute_context_test.cc index 6dfc36e52..edee7c2ec 100644 --- a/base/testing/processing_state_test.cc +++ b/base/testing/compute_context_test.cc @@ -1,4 +1,4 @@ -/* processing_state_test.cc +/* compute_context_test.cc Wolfgang Sourdeau, 28 August 2014 Copyright (c) 2014 mldb.ai inc. All rights reserved. This file is part of MLDB. Copyright 2015 mldb.ai inc. All rights reserved. @@ -7,7 +7,7 @@ */ -#include "mldb/base/processing_state.h" +#include "mldb/base/compute_context.h" #include "mldb/utils/testing/mldb_catch2.h" using namespace std; @@ -15,7 +15,7 @@ using namespace MLDB; TEST_CASE("basics") { - ProcessingState state(0 /* max parallelism */); - state.waitForAll(); + ComputeContext state(0 /* max parallelism */); + state.work_until_finished(); } diff --git a/base/testing/thread_pool_test.cc b/base/testing/thread_pool_test.cc index 4a6cd3721..103474231 100644 --- a/base/testing/thread_pool_test.cc +++ b/base/testing/thread_pool_test.cc @@ -190,7 +190,7 @@ BOOST_AUTO_TEST_CASE(threadPoolBindingAdd) BOOST_AUTO_TEST_CASE(threadPoolExceptionCatching) { - ThreadWorkGroup workGroup; + ThreadPool workGroup(-1 /* num threads */, true /* catch exceptions */); workGroup.add([] () { throw Exception("hello"); }); @@ -208,7 +208,7 @@ BOOST_AUTO_TEST_CASE(threadPoolExceptionCatching) BOOST_AUTO_TEST_CASE(threadPoolMultiExceptionCatching) { - ThreadWorkGroup workGroup; + ThreadPool workGroup(-1 /* num threads */, true /* catch exceptions */); for (size_t i = 0; i < 100; ++i) { workGroup.add([] () { throw Exception("hello"); }); diff --git a/base/thread_pool.h b/base/thread_pool.h index 441a067da..270f1481b 100644 --- a/base/thread_pool.h +++ b/base/thread_pool.h @@ -130,23 +130,4 @@ struct ThreadPool { std::shared_ptr itl; }; -#if 0 -/*****************************************************************************/ -/* THREAD WORK GROUP */ -/*****************************************************************************/ - -struct ThreadWorkGroup: public ThreadPool { - - ThreadWorkGroup(int maxParallelism = -1) - : ThreadPool(ThreadPool::instance(), maxParallelism, true /* handle exceptions */) - { - } - - ThreadWorkGroup(ThreadPool & parent, int maxParallelism = -1) - : ThreadPool(parent, maxParallelism, true /* handle exceptions */) - { - } -}; -#endif - } // namespace MLDB diff --git a/block/content_descriptor.cc b/block/content_descriptor.cc index a0720bd6b..c81688072 100644 --- a/block/content_descriptor.cc +++ b/block/content_descriptor.cc @@ -15,7 +15,7 @@ #include "mldb/watch/watch_impl.h" #include "mldb/base/thread_pool.h" #include "mldb/base/iostream_adaptors.h" -#include "mldb/base/processing_state.h" +#include "mldb/base/compute_context.h" using namespace std; diff --git a/block/testing/content_descriptor_test.cc b/block/testing/content_descriptor_test.cc index 857ee8552..43956e47e 100644 --- a/block/testing/content_descriptor_test.cc +++ b/block/testing/content_descriptor_test.cc @@ -176,7 +176,9 @@ BOOST_AUTO_TEST_CASE( test_parallel_decompress_zstd ) return true; }; - handler->forEachBlockParallel(0, 1024 * 1024 /* requested block size */, 16 /* maxParallelism */, onBlock); + ComputeContext compute(16 /* maxParallelism */); + + handler->forEachBlockParallel(0, 1024 * 1024 /* requested block size */, compute, 1 /* priority */, onBlock); cerr << "maxNumParallel = " << maxNumParallel << endl; diff --git a/utils/for_each_line.cc b/utils/for_each_line.cc index 1b930a8c6..a5182bd1c 100644 --- a/utils/for_each_line.cc +++ b/utils/for_each_line.cc @@ -327,7 +327,7 @@ struct ForEachLineProcessor: public ComputeContext { try { job(); } MLDB_CATCH_ALL { - takeException("handle_line_block"); + take_exception("handle_line_block"); } } ++outputChunkNumber; @@ -353,25 +353,35 @@ struct ForEachLineProcessor: public ComputeContext { std::function handle_line_block; template - bool process(Source&& source, - std::function onLine, - std::function startBlock, - std::function endBlock) + bool process(Source&& source, + const LineContinuationFn & onLine, + const BlockContinuationFn & startBlock, + const BlockContinuationFn & endBlock) { - handle_line_block = [onLine,startBlock,endBlock] (LineBlock block) + handle_line_block = [&] (LineBlock block) { - if (startBlock && !startBlock(block.blockNumber, block.startLine, block.lines.size())) + LineBlockInfo blockInfo { + .blockNumber = static_cast(block.blockNumber), + .startOffset = static_cast(block.startOffset), + .lineNumber = static_cast(block.startLine), + .numLinesInBlock = static_cast(block.lines.size()), + }; + + if (startBlock && !startBlock(blockInfo)) return false; for (size_t i = 0; i < block.lines.size(); ++i) { - if (onLine && !onLine(block.lines[i].data(), block.lines[i].size(), block.blockNumber, block.startLine + i)) + LineInfo lineInfo { + .line = std::string_view(block.lines[i].data(), block.lines[i].size()), + .lineNumber = static_cast(block.startLine + i), + .blockNumber = static_cast(block.blockNumber), + }; + + if (onLine && !onLine(lineInfo)) return false; } - if (endBlock && !endBlock(block.blockNumber, block.startLine, block.lines.size())) + if (endBlock && !endBlock(blockInfo)) return false; return true; @@ -402,30 +412,12 @@ struct ForEachLineProcessor: public ComputeContext { size_t forEachLine(std::istream & stream, - const std::function & processLine, + const LineContinuationFn & processLine, shared_ptr logger, int numThreads, bool ignoreStreamExceptions, int64_t maxLines) { - auto onLineStr = [&] (const string & line, int64_t lineNum) { - processLine(line.c_str(), line.size(), lineNum); - }; - - return forEachLine(stream, onLineStr, logger, numThreads, - ignoreStreamExceptions, maxLines); -} - -size_t -forEachLineStr(std::istream & stream, - const std::function & processLine, - shared_ptr logger, - int numThreads, - bool ignoreStreamExceptions, - int64_t maxLines) -{ ForEachLineOptions options; options.maxParallelism = numThreads; @@ -442,9 +434,11 @@ forEachLineStr(std::istream & stream, auto onLine = [&] (const char * line, size_t length, int64_t blockNumber, int64_t lineNumber) -> bool { - string lineStr(line, length); + LineInfo lineInfo { std::string_view(line, length), lineNumber, blockNumber }; try { - processLine(lineStr, lineNumber); + bool res = processLine(lineInfo); + if (!res) + return false; auto new_done = done.fetch_add(1) + 1; if (new_done % 1000000 == 0 && @@ -461,7 +455,7 @@ forEachLineStr(std::istream & stream, lastCheck = now; } } MLDB_CATCH_ALL { - WARNING_MSG(logger) << "error dealing with line " << lineStr + WARNING_MSG(logger) << "error dealing with line " << lineInfo.line << ": " << getExceptionString(); if (!ignoreStreamExceptions) { throw; @@ -473,46 +467,17 @@ forEachLineStr(std::istream & stream, return processor.process(stream, onLine, nullptr /* startBlock */, nullptr /* endBlock */); } -size_t -forEachLine(const std::string & filename, - const std::function & processLine, - shared_ptr logger, - int numThreads, - bool ignoreStreamExceptions, - int64_t maxLines) -{ - filter_istream stream(filename); - return forEachLine(stream, processLine, logger, numThreads, - ignoreStreamExceptions, maxLines); -} - -size_t -forEachLineStr(const std::string & filename, - const std::function & processLine, - shared_ptr logger, - int numThreads, - bool ignoreStreamExceptions, - int64_t maxLines) -{ - filter_istream stream(filename); - return forEachLineStr(stream, processLine, logger, numThreads, - ignoreStreamExceptions, maxLines); -} - /*****************************************************************************/ /* FOR EACH LINE BLOCK (ISTREAM) */ /*****************************************************************************/ bool forEachLineBlock(std::istream & stream, - std::function onLine, + const LineContinuationFn & onLine, int64_t maxLines, int maxParallelism, - std::function startBlock, - std::function endBlock, + const BlockContinuationFn & startBlock, + const BlockContinuationFn & endBlock, ssize_t defaultBlockSize, const BlockSplitter & splitter) { @@ -534,18 +499,11 @@ bool forEachLineBlock(std::istream & stream, bool forEachLineBlock(std::shared_ptr content, uint64_t startOffset, - std::function onLine, + const LineContinuationFn & onLine, int64_t maxLines, int maxParallelism, - std::function startBlock, - std::function endBlock, + const BlockContinuationFn & startBlock, + const BlockContinuationFn & endBlock, size_t blockSize, const BlockSplitter & splitter) { @@ -567,9 +525,7 @@ bool forEachLineBlock(std::shared_ptr content, /*****************************************************************************/ void forEachChunk(std::istream & stream, - std::function onChunk, + const ChunkContinuationFn & onChunk, size_t chunkLength, int64_t maxChunks, int maxParallelism) @@ -611,7 +567,14 @@ void forEachChunk(std::istream & stream, tp.add(doBlock); } - if (!onChunk(block.get(), bytesRead, myChunkNumber)) { + MLDB::ChunkInfo chunkInfo { + .data = std::span(block.get(), bytesRead), + .chunkNumber = static_cast(myChunkNumber), + .startOffset = static_cast(myChunkNumber * chunkLength), + .lastChunk = !stream || stream.eof(), + }; + + if (!onChunk(chunkInfo)) { // We decided to stop. We should probably stop everything // else, too. stop = true; diff --git a/utils/for_each_line.h b/utils/for_each_line.h index 24a9c33dd..5328e5c5a 100644 --- a/utils/for_each_line.h +++ b/utils/for_each_line.h @@ -24,13 +24,24 @@ namespace MLDB { +template +struct is_callable_with { + template static auto test(int) -> decltype(std::declval()(std::declval()...), std::true_type()); + template static auto test(...) -> std::false_type; + using type = decltype(test(0)); + static constexpr bool value = type::value; +}; + +template constexpr bool is_callable_with_v = is_callable_with::value; +template using is_callable_with_t = is_callable_with::type; + struct ContentHandler; struct LineInfo { std::string_view line; int64_t lineNumber = -1; int64_t blockNumber = -1; - int64_t startOffset = -1; + //int64_t startOffset = -1; }; struct LineContinuationFn: public ContinuationFn { @@ -38,28 +49,29 @@ struct LineContinuationFn: public ContinuationFn { //template LineContinuationFn(Args&&... args, std::enable_if_t> * = 0): Base(std::forward(args)...) {} using Base::Base; -#if 1 // Constructor for a function - template()(std::declval(), std::declval(), std::declval(), std::declval()))*/> - LineContinuationFn(Callable fn, std::enable_if_t || std::is_convertible_v> * = 0) + template + LineContinuationFn(Callable fn, std::enable_if_t + && !is_callable_with_v> * = 0) : Base([fn = std::forward(fn)] (LineInfo line) { return fn(line.line.data(), line.line.size(), line.blockNumber, line.lineNumber); }) { } - template()(std::declval(), std::declval(), std::declval(), std::declval()))*/> - LineContinuationFn(Callable fn, std::enable_if_t(),2))> || std::is_convertible_v(),2))>> * = 0) + // Constructor for a function + template + LineContinuationFn(Callable fn, std::enable_if_t> * = 0) : Base([fn = std::forward(fn)] (LineInfo line) { return fn(std::string(line.line.data(), line.line.data() + line.line.size()), line.lineNumber); }) { } + // Constructor for a function template - LineContinuationFn(Callable fn, std::enable_if_t || std::is_convertible_v> * = 0) + LineContinuationFn(Callable fn, std::enable_if_t> * = 0) : Base([fn = std::forward(fn)] (LineInfo line) { return fn(line.line.data(), line.line.size(), line.lineNumber); }) { } -#endif }; struct LineBlockInfo { - std::span block; int64_t blockNumber = -1; int64_t startOffset = -1; int64_t lineNumber = -1; int64_t numLinesInBlock = -1; + bool lastBlock = false; }; struct BlockContinuationFn: public ContinuationFn { @@ -75,9 +87,10 @@ struct BlockContinuationFn: public ContinuationFn { }; struct ChunkInfo { - std::span chunk; + std::span data; int64_t chunkNumber = -1; int64_t startOffset = -1; + bool lastChunk = false; }; struct ChunkContinuationFn: public ContinuationFn { @@ -124,10 +137,7 @@ forEachLine(std::istream & stream, */ bool forEachLineBlock(std::istream & stream, - std::function onLine, + const LineContinuationFn & onLine, int64_t maxLines = -1, int maxParallelism = 8, const BlockContinuationFn & startBlock = nullptr, @@ -155,8 +165,8 @@ bool forEachLineBlock(std::shared_ptr content, const LineContinuationFn & onLine, int64_t maxLines = -1, int maxParallelism = 8, - BlockContinuationFn startBlock = nullptr, - BlockContinuationFn endBlock = nullptr, + const BlockContinuationFn & startBlock = nullptr, + const BlockContinuationFn & endBlock = nullptr, size_t blockSize = 20'000'000, const BlockSplitter & splitter = newLineSplitter); From b2876a0f7ccf44f08e6f0662ec67023bd412214a Mon Sep 17 00:00:00 2001 From: Jeremy Barnes Date: Sat, 1 Feb 2025 06:34:37 -0500 Subject: [PATCH 33/39] SQUASH for_each_line (12) --- base/processing_state.h | 0 base/processing_state_fwd.h | 0 2 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 base/processing_state.h delete mode 100644 base/processing_state_fwd.h diff --git a/base/processing_state.h b/base/processing_state.h deleted file mode 100644 index e69de29bb..000000000 diff --git a/base/processing_state_fwd.h b/base/processing_state_fwd.h deleted file mode 100644 index e69de29bb..000000000 From bda8334ce83dc8f65949e9358e74ce0ec9500fd9 Mon Sep 17 00:00:00 2001 From: Jeremy Barnes Date: Sun, 2 Feb 2025 21:31:50 -0500 Subject: [PATCH 34/39] SQUASH for_each_line (13) --- base/compute_context.cc | 164 ++++++++++++++++++----- base/compute_context.h | 2 +- base/thread_pool.h | 4 + block/content_descriptor.cc | 34 +++-- block/content_descriptor.h | 4 +- block/testing/content_descriptor_test.cc | 92 ++++++++++--- block/testing/testing.mk | 2 +- utils/coalesced_range.h | 26 +++- utils/for_each_line.cc | 150 +++++++++++++-------- utils/for_each_line.h | 1 + utils/testing/coalesced_range_test.cc | 47 +++++++ utils/testing/for_each_line_test.cc | 87 ++++++------ utils/testing/mldb_catch2.h | 24 ++++ vfs/compressor.cc | 44 ++++-- vfs/compressor.h | 3 +- vfs/lz4.cc | 19 +-- 16 files changed, 515 insertions(+), 188 deletions(-) diff --git a/base/compute_context.cc b/base/compute_context.cc index 6d2a7d726..68dc7a524 100644 --- a/base/compute_context.cc +++ b/base/compute_context.cc @@ -20,6 +20,8 @@ #include "mldb/base/thread_pool.h" #include "mldb/base/exc_assert.h" #include "mldb/base/exc_check.h" +#include "mldb/base/scope.h" + #include "mldb/arch/spinlock.h" #include "mldb/ext/concurrentqueue/blockingconcurrentqueue.h" @@ -95,37 +97,156 @@ struct ComputeContext::Itl { Spinlock queue_mutex_; std::priority_queue queue_; + int jobs_running_ = 0; - enum class WorkType { - STOP, // The queue should stop running - JOB // There is a queued job - }; + //enum class WorkType { + // STOP, // The queue should stop running + // JOB // There is a queued job + //}; + + // All work is put here so that the threads know when to wake up and look for some. + //BlockingConcurrentQueue work_; + + ThreadPool tp_; + + bool single_threaded() const + { + return max_parallelism_ == 0; + } + + void stop(State reason) + { + ExcCheck(reason != RUNNING, "invalid reason for stopping"); + auto current_state = state_.load(std::memory_order_relaxed); + while (current_state == RUNNING) { + if (state_.compare_exchange_weak(current_state, reason)) + break; + } + + stop_work(); + } + + void take_exception(std::string info) + { + ExcAssert(std::current_exception()); + auto current_state = state_.load(std::memory_order_relaxed); + while (current_state == RUNNING) { + if (state_.compare_exchange_weak(current_state, STOPPED_EXCEPTION)) { + exc_ptr_ = std::current_exception(); + exc_info_ = std::move(info); + } + } + + stop(STOPPED_EXCEPTION); + } void stop_work() { - for (int i = 0; i <= max_parallelism_; ++i) { - work_.enqueue(Itl::WorkType::STOP); + return; + ExcCheck(state_.load(std::memory_order_seq_cst) != ComputeContext::RUNNING, "invalid state for stopping work"); + + for (;;) { + std::unique_lock guard{queue_mutex_}; + if (jobs_running_ == 0) + break; + + guard.unlock(); + tp_.work(); + std::this_thread::yield(); + } + } + + bool run_one() + { + bool result = false; + //cerr << "running one in state " << state_ << endl; + + while (state_.load(std::memory_order_relaxed) == ComputeContext::RUNNING) { + Job job; + { + std::unique_lock guard(queue_mutex_); + if (queue_.empty()) + return result; + job = queue_.top(); + queue_.pop(); + result = true; + } + + try { + Scope_Exit(std::unique_lock guard{this->queue_mutex_}; --this->jobs_running_); + job.fn(); + } MLDB_CATCH_ALL { + this->take_exception(job.info); + return result; + } } + return result; } void submit(int priority, std::string info, std::function fn) { + auto runOne = [this] () + { + this->run_one(); + }; + ExcCheckGreaterEqual(priority, 0, "invalid priority for submitted function"); { std::unique_lock guard(queue_mutex_); queue_.emplace(priority, std::move(info), std::move(fn)); - work_.enqueue(WorkType::JOB); + ++jobs_running_; + } + + if (single_threaded()) { + runOne(); + return; + } + + try { + tp_.add(runOne); + } MLDB_CATCH_ALL { + std::unique_lock guard(queue_mutex_); + --jobs_running_; + throw; } } void work() { + run_one(); + // Contribute to thread pool in case there is something there that is blocking the + // work here tp_.work(); } void work_until_finished() { + // Note: race condition here... each job can submit more jobs, which means we can only + // finish this loop when both a) there is nothing more to run in the thread pool and + // b) there is nothing more to submit in the queue. However, these two are not + // synchronized behind the same lock, so we can't check them atomically. + //cerr << "working until finished" << endl; + + for (;;) { + { + std::unique_lock guard{queue_mutex_}; + if (jobs_running_ == 0 && queue_.empty()) { + break; + } + } + + if (!run_one()) { + tp_.waitForAll(); + } + tp_.work(); + std::this_thread::yield(); + } + tp_.waitForAll(); + { + std::unique_lock guard{queue_mutex_}; + ExcAssertEqual(jobs_running_, 0); + } } void rethrow_if_exception() @@ -133,10 +254,6 @@ struct ComputeContext::Itl { if (exc_ptr_) std::rethrow_exception(exc_ptr_); } - - // All work is put here so that the threads know when to wake up and look for some. - BlockingConcurrentQueue work_; - ThreadPool tp_; }; /*****************************************************************************/ @@ -163,18 +280,7 @@ ComputeContext::~ComputeContext() // reason (exception, explicit stop). void ComputeContext::take_exception(std::string info) { - using namespace std; - cerr << "taking exception in " << info << endl; - ExcAssert(std::current_exception()); - auto current_state = state_.load(std::memory_order_relaxed); - while (current_state == RUNNING) { - if (state_.compare_exchange_weak(current_state, STOPPED_EXCEPTION)) { - itl_->exc_ptr_ = std::current_exception(); - itl_->exc_info_ = std::move(info); - } - } - - stop(); + itl_->take_exception(info); } bool ComputeContext::has_exception() const @@ -182,15 +288,9 @@ bool ComputeContext::has_exception() const return state_.load(std::memory_order_relaxed) == STOPPED_EXCEPTION; } -void ComputeContext::stop() +void ComputeContext::stop(State reason) { - auto current_state = state_.load(std::memory_order_relaxed); - while (current_state == RUNNING) { - if (state_.compare_exchange_weak(current_state, STOPPED_EXCEPTION)) - break; - } - - itl_->stop_work(); + itl_->stop(reason); } void ComputeContext::submit(int priority, std::string info, std::function fn) @@ -215,7 +315,7 @@ void ComputeContext::rethrow_if_exception() bool ComputeContext::single_threaded() const { - return itl_->max_parallelism_ == 1; + return itl_->single_threaded(); } } // namespace MLDB diff --git a/base/compute_context.h b/base/compute_context.h index 233e459c4..25d248723 100644 --- a/base/compute_context.h +++ b/base/compute_context.h @@ -129,7 +129,7 @@ struct ComputeContext { bool relaxed_stopped() const { return state_.load(std::memory_order_relaxed) != RUNNING; } // Stop the processing - void stop(); + void stop(State reason); // Submit a job with the given priority to be processed. void submit(int priority, std::string info, std::function fn); diff --git a/base/thread_pool.h b/base/thread_pool.h index 270f1481b..85e4566ed 100644 --- a/base/thread_pool.h +++ b/base/thread_pool.h @@ -112,6 +112,10 @@ struct ThreadPool { /** Lend the calling thread to the thread pool for one job. */ void work() const; + /** Lend the calling thread to the thread pool for one job, or return + immediately if there is no work to do. */ + void tryWork() const; + size_t numThreads() const; uint64_t jobsRunning() const; diff --git a/block/content_descriptor.cc b/block/content_descriptor.cc index c81688072..9d7de1b40 100644 --- a/block/content_descriptor.cc +++ b/block/content_descriptor.cc @@ -383,7 +383,7 @@ forEachBlockParallel(uint64_t startOffset, uint64_t requestedBlockSize, ComputeContext & compute, const PriorityFn & priority, - const ContinuationFn & onBlock) const + const OnBlockFn & onBlock) const { constexpr bool debug = false; if (debug) cerr << "ContentHandler foreachblockparallel" << endl; @@ -395,6 +395,14 @@ forEachBlockParallel(uint64_t startOffset, size_t blockNumber = 0; + auto submitBlockJob = [&] (auto && block) + { + if (compute.single_threaded()) + block(); + else + block_compute.submit(priority(blockNumber), "ContentHandler::forEachBlockParallel", std::move(block)); + }; + while (!finished && !compute.relaxed_stopped()) { uint64_t startOffset; FrozenMemoryRegion region; @@ -404,8 +412,15 @@ forEachBlockParallel(uint64_t startOffset, if (debug) cerr << "startOffset = " << startOffset << " region = " << (bool)region << endl; - if (!region) + if (!region && !finished) { + // This is the last block + submitBlockJob([blockNumber, startOffset, &onBlock, &finished] () + { + if (!onBlock(blockNumber, startOffset, FrozenMemoryRegion(), true /* lastBlock */)) + finished = true; + }); break; + } uint64_t toSkip = startOffset - offset; ExcAssertEqual(toSkip, 0); @@ -417,14 +432,12 @@ forEachBlockParallel(uint64_t startOffset, auto processBlock = [myBlockNumber, startOffset, region, &onBlock, &finished] () { - if (!onBlock(myBlockNumber, startOffset, region)) + if (!onBlock(myBlockNumber, startOffset, region, false /* lastBlock */)) { finished = true; + } }; - if (compute.single_threaded()) - processBlock(); - else - block_compute.submit(priority(blockNumber), "ContentHandler::forEachBlockParallel", std::move(processBlock)); + submitBlockJob(std::move(processBlock)); offset = startOffset + region.length(); } @@ -854,7 +867,7 @@ struct ContentDecompressor uint64_t requestedBlockSize, ComputeContext & compute, const PriorityFn & priority, - const ContinuationFn & fn) const override + const OnBlockFn & fn) const override { //maxParallelism = 1; @@ -894,7 +907,8 @@ struct ContentDecompressor auto onBlock = [&] (size_t blockNumber, uint64_t blockStartOffset, std::shared_ptr mem, - size_t length) -> bool + size_t length, + bool lastBlock) -> bool { if (blockStartOffset + length < startOffset) return true; @@ -907,7 +921,7 @@ struct ContentDecompressor } FrozenMemoryRegion region(mem, mem.get(), length); - return fn(blockNumber, blockStartOffset, std::move(region)); + return fn(blockNumber, blockStartOffset, std::move(region), lastBlock); }; auto allocate = [&] (size_t len) -> std::shared_ptr diff --git a/block/content_descriptor.h b/block/content_descriptor.h index daf028c0d..e43602d0f 100644 --- a/block/content_descriptor.h +++ b/block/content_descriptor.h @@ -162,12 +162,14 @@ struct ContentHandler { virtual AccessPattern getPattern() const = 0; + using OnBlockFn = ContinuationFn; + virtual bool forEachBlockParallel(uint64_t startOffset, uint64_t requestedBlockSize, ComputeContext & compute, const PriorityFn & priority, - const ContinuationFn & onBlock) const; + const OnBlockFn & onBlock) const; virtual FrozenMemoryRegion getRange(uint64_t offset = 0, int64_t length = -1) const; diff --git a/block/testing/content_descriptor_test.cc b/block/testing/content_descriptor_test.cc index 43956e47e..c936a577b 100644 --- a/block/testing/content_descriptor_test.cc +++ b/block/testing/content_descriptor_test.cc @@ -6,16 +6,12 @@ This file is part of MLDB. Copyright 2015 mldb.ai inc. All rights reserved. */ -#define BOOST_TEST_MAIN -#define BOOST_TEST_DYN_LINK - #include "mldb/vfs/filter_streams.h" #include "mldb/block/content_descriptor.h" #include "mldb/types/value_description.h" #include "mldb/types/json.h" #include "mldb/arch/atomic_min_max.h" - -#include +#include "mldb/utils/testing/mldb_catch2.h" using namespace std; using namespace MLDB; @@ -149,17 +145,27 @@ BOOST_AUTO_TEST_CASE( test_compressed_random_access ) } -BOOST_AUTO_TEST_CASE( test_parallel_decompress_zstd ) + +struct TestParallelDecompressData { + size_t numBlocks = 0, totalLength = 0, maxNumParallel = 0, minBlock = 10000000, maxBlock = 0; + bool hasLastBlock = false; +}; + +TestParallelDecompressData testParallelDecompress(string input_file, int maxParallelism = 16) { - string input_file = "mldb_test_data/reviews_Digital_Music_5.json.zstd"; ContentDescriptor descriptor = jsonDecode("file://" + input_file); std::shared_ptr handler = getDecompressedContent(descriptor); std::atomic numBlocks{0}, totalLength{0}, numParallel{0}, maxNumParallel{0}, minBlock(10000000), maxBlock(0); + bool hasLastBlock = false; auto onBlock = [&] (size_t blockNum, uint64_t blockOffset, - FrozenMemoryRegion block) + FrozenMemoryRegion block, bool lastBlock) { + if (lastBlock) { + BOOST_CHECK(!hasLastBlock); + hasLastBlock = true; + } auto par = numParallel.fetch_add(1) + 1; atomic_max(maxNumParallel, par); atomic_min(minBlock, blockNum); @@ -176,16 +182,72 @@ BOOST_AUTO_TEST_CASE( test_parallel_decompress_zstd ) return true; }; - ComputeContext compute(16 /* maxParallelism */); + ComputeContext compute(maxParallelism); handler->forEachBlockParallel(0, 1024 * 1024 /* requested block size */, compute, 1 /* priority */, onBlock); + BOOST_CHECK_EQUAL(numParallel, 0); cerr << "maxNumParallel = " << maxNumParallel << endl; + return { numBlocks, totalLength, maxNumParallel, minBlock, maxBlock, hasLastBlock }; +} - BOOST_CHECK_EQUAL(numBlocks, 679); - BOOST_CHECK_EQUAL(totalLength, 88964528); - BOOST_CHECK_EQUAL(numParallel, 0); - BOOST_CHECK_GT(maxNumParallel, 1); - BOOST_CHECK_EQUAL(minBlock, 0); - BOOST_CHECK_EQUAL(maxBlock, 678); + +BOOST_AUTO_TEST_CASE( test_parallel_decompress_zstd ) +{ + string input_file = "mldb_test_data/reviews_Digital_Music_5.json.zstd"; + + for (auto maxParallelism: {0, 1, 4, 16}) { + SECTION("maxParallelism = " + to_string(maxParallelism)) { + + auto [numBlocks, totalLength, maxNumParallel, minBlock, maxBlock, hasLastBlock] + = testParallelDecompress(input_file, 16 /* maxParallelism */); + + BOOST_CHECK_EQUAL(hasLastBlock, true); + BOOST_CHECK_EQUAL(numBlocks, 680); + BOOST_CHECK_EQUAL(totalLength, 88964528); + if (maxParallelism > 0) + BOOST_CHECK_GT(maxNumParallel, 1); + BOOST_CHECK_EQUAL(minBlock, 0); + BOOST_CHECK_EQUAL(maxBlock, 679); + } + } +} + +BOOST_AUTO_TEST_CASE( test_parallel_decompress_lz4 ) +{ + string input_file = "mldb_test_data/train-1m.csv.lz4"; + for (auto maxParallelism: {0, 1, 4, 16}) { + SECTION("maxParallelism = " + to_string(maxParallelism)) { + + auto [numBlocks, totalLength, maxNumParallel, minBlock, maxBlock, hasLastBlock] + = testParallelDecompress(input_file, maxParallelism); + + BOOST_CHECK_EQUAL(hasLastBlock, true); + BOOST_CHECK_EQUAL(numBlocks, 13); + BOOST_CHECK_EQUAL(totalLength, 48882727); + if (maxParallelism > 0) + BOOST_CHECK_GT(maxNumParallel, 1); + BOOST_CHECK_EQUAL(minBlock, 0); + BOOST_CHECK_EQUAL(maxBlock, 12); + } + } } + +BOOST_AUTO_TEST_CASE( test_parallel_decompress_gzip ) +{ + string input_file = "mldb_test_data/enron.csv.gz"; + for (auto maxParallelism: {0, 1, 4, 16}) { + SECTION("maxParallelism = " + to_string(maxParallelism)) { + auto [numBlocks, totalLength, maxNumParallel, minBlock, maxBlock, hasLastBlock] + = testParallelDecompress(input_file, 16 /* maxParallelism */); + + BOOST_CHECK_EQUAL(hasLastBlock, true); + BOOST_CHECK_EQUAL(numBlocks, 408); + BOOST_CHECK_EQUAL(totalLength, 52229289); + if (maxParallelism > 0) + BOOST_CHECK_GT(maxNumParallel, 1); + BOOST_CHECK_EQUAL(minBlock, 0); + BOOST_CHECK_EQUAL(maxBlock, 407); + } + } +} \ No newline at end of file diff --git a/block/testing/testing.mk b/block/testing/testing.mk index 65e57f95b..0363dff0d 100644 --- a/block/testing/testing.mk +++ b/block/testing/testing.mk @@ -1,3 +1,3 @@ # This file is part of MLDB. Copyright 2015 mldb.ai inc. All rights reserved. -$(eval $(call test,content_descriptor_test,vfs block types value_description vfs base,boost)) +$(eval $(call test,content_descriptor_test,vfs block types value_description vfs base,catch2)) diff --git a/utils/coalesced_range.h b/utils/coalesced_range.h index 58d684b7e..a5389492f 100644 --- a/utils/coalesced_range.h +++ b/utils/coalesced_range.h @@ -180,6 +180,12 @@ struct CoalescedRangeIterator { size_t block_offset() const { return offset_; } bool at_the_end() const { return range_ == ranges_->size(); } + // Used in the implementation of some algorithms which work better if the off_the_end is represented + // by a range_ pointing to the last range and offset_ pointing to the end of that range. Note that + // the iterator to which this is done is no longer usable as an iterator. + + void flip_ate() { if (at_the_end() && range_ > 0) { --range_; offset_ = range_size(); } } + template friend struct CoalescedRange; }; @@ -200,18 +206,21 @@ struct CoalescedRange { // Add something to the ranges. Invalidates iterators. // If it is empty, it will not be added. // If it is an extension of the previous range, then it will be extended. - template void add(Args&&... args) { return add(range_type(std::forward(args)...)); } + // Returns true if and only if the length of ranges_ increased + template bool add(Args&&... args) { return add(range_type(std::forward(args)...)); } - void add(range_type range) + bool add(range_type range) { if (range.empty()) - return; + return false; else if (!ranges_.empty() && ranges_.back().data() + ranges_.back().size() == range.data()) { // Contiguous, combine them ranges_.back() = {ranges_.back().data(), ranges_.back().size() + range.size()}; + return false; } else { ranges_.push_back(range); + return true; } } @@ -292,12 +301,17 @@ struct CoalescedRange { // span of memory between them. Otherwise, a null option is returned. std::optional get_span(const_iterator begin, const_iterator end) const { - ExcCheck(begin < end, "Attempt to extract backwards span"); + ExcCheck(begin <= end, "Attempt to extract backwards span"); ExcCheck(begin.ranges_ == &ranges_ && end.ranges_ == &ranges_, "Attempt to extract span from wrong ranges"); + + if (begin == end) + return range_type(); + + end.flip_ate(); + if (begin.range_ != end.range_) return std::nullopt; - if (begin.range_ == ranges_.size()) - return range_type(); + auto first = begin.range_it(); auto last = end.range_it(); return range_type(first, last - first); diff --git a/utils/for_each_line.cc b/utils/for_each_line.cc index a5182bd1c..6331a604b 100644 --- a/utils/for_each_line.cc +++ b/utils/for_each_line.cc @@ -13,7 +13,6 @@ #include #include #include -#include "mldb/ext/concurrentqueue/blockingconcurrentqueue.h" #include #include "mldb/vfs/filter_streams.h" #include "mldb/base/thread_pool.h" @@ -30,7 +29,6 @@ #include "mldb/base/compute_context.h" using namespace std; -using moodycamel::BlockingConcurrentQueue; namespace MLDB { @@ -89,6 +87,7 @@ struct ForEachLineProcessor: public ComputeContext { }; // Pushes a series of jobs that call onChunk + // Returns true if and only if all continuations returned true bool chunk_source(std::istream & stream) { filter_istream * fistream = dynamic_cast(&stream); @@ -116,7 +115,7 @@ struct ForEachLineProcessor: public ComputeContext { bool lastChunk = false; for (size_t chunkNumber = 0; stream; ++chunkNumber) { - if (relaxed_stopped()) return false; + if (relaxed_stopped() || chunks_in_finished_ || chunks_out_finished_) return false; size_t chunkOffset = stream.tellg(); stream.read(reinterpret_cast(block.get()), blockSize + extraCapacity); ssize_t bytesRead = stream.gcount(); @@ -125,7 +124,7 @@ struct ForEachLineProcessor: public ComputeContext { if (!stream) lastChunk = true; std::span mem(block.get(), bytesRead); - if (!handle_chunk({chunkNumber, chunkOffset, lastChunk, mem, {block}})) + if (!handle_out_of_order_chunk({chunkNumber, chunkOffset, lastChunk, mem, {block}})) return false; } return true; @@ -141,6 +140,7 @@ struct ForEachLineProcessor: public ComputeContext { return blockSize; } + // Returns true if and only if all continuations returned true bool chunk_source(std::span mem, size_t startOffset) { size_t numBytes = mem.size(); @@ -149,13 +149,13 @@ struct ForEachLineProcessor: public ComputeContext { const std::byte * p = mem.data(); const std::byte * e = p + mem.size(); - for (size_t chunkNumber = 0; p < e; p += blockSize) { - if (relaxed_stopped()) return false; + for (size_t chunkNumber = 0; p < e; p += blockSize, ++chunkNumber) { + if (relaxed_stopped() || chunks_in_finished_ || chunks_out_finished_) return false; const std::byte * eb = std::min(e, p + blockSize); std::span mem(p, eb-p); size_t chunkOffset = startOffset + p - mem.data(); bool lastChunk = eb == e; - if (!handle_chunk({chunkNumber, chunkOffset, lastChunk, mem, {}})) + if (!handle_out_of_order_chunk({chunkNumber, chunkOffset, lastChunk, mem, {}})) return false; } return true; @@ -166,12 +166,12 @@ struct ForEachLineProcessor: public ComputeContext { size_t contentSize = content.getSize(); size_t blockSize = block_size_for_content_length(contentSize); - auto doBlock = [&] (size_t chunkNumber, uint64_t chunkOffset, FrozenMemoryRegion region) + auto doBlock = [&] (size_t chunkNumber, uint64_t chunkOffset, FrozenMemoryRegion region, bool lastBlock) { - if (relaxed_stopped()) return false; - bool lastChunk = chunkOffset + region.length() == contentSize; + if (relaxed_stopped() || chunks_in_finished_ || chunks_out_finished_) return false; + bool lastChunk = lastBlock || chunkOffset + region.length() == contentSize; std::span mem(reinterpret_cast(region.data()), region.length()); - return handle_chunk({chunkNumber, chunkOffset, lastChunk, mem, {}}); + return handle_out_of_order_chunk({chunkNumber, chunkOffset, lastChunk, mem, {}}); }; auto getPriority = [] (size_t chunkNumber) -> int { return CHUNK_STREAM_PRIORITY; }; @@ -179,32 +179,64 @@ struct ForEachLineProcessor: public ComputeContext { return res; } - bool handle_chunk(Chunk chunk) + bool handle_out_of_order_chunk(Chunk chunk) { - cerr << "handling chunk " << chunk.chunkNumber << " last " << chunk.lastChunk << endl; - size_t numChunksOutstanding = 0; - { - std::unique_lock guard{chunks_mutex_}; - if (chunk.chunkNumber == chunks_done_) { - if (chunksFinished) - return true; - guard.unlock(); - return handle_next_chunk(std::move(chunk)); - } - else { - chunks_.emplace(chunk.chunkNumber, std::move(chunk)); - numChunksOutstanding = chunks_.size(); + // The chunks need to be processed in order by handle_next_chunk + // This function is called from multiple threads, so we need to reassemble and sychronize them. + // + // Basically: + // - Take a lock on the queue + // - Add it to the queue + // - For as long as the chunk at the beginning of the queue is the next in-order one + // - drop the lock + // - process it (only we will do se because no other thread will get the next in-order chunk) + // - grab the lock again + // - Otherwise + // Note that this is the ONLY function which touches the queue. No other functions should touch it. + + std::unique_lock guard{chunks_mutex_}; + auto [it, inserted] = chunks_.emplace(chunk.chunkNumber, std::move(chunk)); + ExcAssert(inserted); // Failure means that chunk numbers are repeated by the upstream functions + + while (!chunks_.empty() && it->first == chunks_done_) { + Chunk & chunk = it->second; + + guard.unlock(); + handle_next_chunk(it->second); + guard.lock(); + + // Nothing should have happened in the meantime... + ExcAssertEqual(chunks_done_, chunk.chunkNumber); + + if (chunk.lastChunk || (options.maxLines != -1 && outputLineNumber >= options.maxLines)) { + chunks_in_finished_ = true; + chunks_out_finished_ = true; + chunks_.clear(); + break; } + chunks_.erase(it); + ++chunks_done_; + it = chunks_.begin(); } - + guard.unlock(); + + // At this point, we have processed all the chunks we can + // TODO: if the list of chunks is too big, start slowing down the chunk producers by making them + // contribute to work + + //work(); + + return !relaxed_stopped() && !chunks_out_finished_; + +#if 0 // Slow down the production of chunks if there are too many by contributing to // other work. - while (numChunksOutstanding > numCpus() && !relaxed_stopped()) { + while (numChunksOutstanding > numCpus() && !relaxed_stopped() && !chunks_out_finished_) { { - // Make sure there is no data race on chunksFinished + // Make sure there is no data race on chunks_out_finished_ // We could remove this lock if it becomes a problem by using the right sequencing std::unique_lock guard{chunks_mutex_}; - if (chunksFinished) + if (chunks_out_finished_) break; } @@ -212,9 +244,17 @@ struct ForEachLineProcessor: public ComputeContext { std::unique_lock guard{chunks_mutex_}; numChunksOutstanding = chunks_.size(); + if (!chunks_.empty() && chunks_.begin()->first == chunks_done_) { + if (chunks_.begin()->second.lastChunk) + chunks_in_finished_ = true; + guard.unlock(); + if (!handle_next_chunk(chunks_.begin()->second)) + return false; + } } return true; +#endif } struct LineBlock { @@ -235,19 +275,24 @@ struct ForEachLineProcessor: public ComputeContext { std::any splitterState; std::vector> keep; // pins for each block in chunkData - bool handle_next_chunk(Chunk chunk) + // Handle the next chunk, which will be done in-order and one at a time. This should do the + // smallest amount of work possible, submitting any further processing as a job to be + // handled by another thread (if there is one). + void handle_next_chunk(Chunk chunk) { - cerr << "handling in-order chunk " << chunk.chunkNumber << endl; - cerr << "chunkData.range_count() = " << chunkData.range_count() << endl; - cerr << "keep.size() = " << keep.size() << endl; + if (chunks_out_finished_ || relaxed_stopped()) + return; + + // TODO: If there are too many chunks, then consolidate them + // (needs careful thought as to how...) // Precondition: chunks_done_ is equal to this chunk number // Only one thread in this block at a time, which is staisfied by the condition above ExcAssertEqual(chunks_done_, chunk.chunkNumber); ExcAssertEqual(chunkData.range_count(), keep.size()); - chunkData.add(reinterpret_cast(chunk.data.data()), chunk.data.size()); - keep.emplace_back(chunk.keep); + if (chunkData.add(reinterpret_cast(chunk.data.data()), chunk.data.size())) + keep.emplace_back(chunk.keep); LineBlock lineBlock; lineBlock.keep = keep; @@ -285,10 +330,6 @@ struct ForEachLineProcessor: public ComputeContext { size_t lineCount = lines.size(); - cerr << "found " << lineCount << " lines" << endl; - cerr << "outputLineNumber = " << outputLineNumber << endl; - cerr << "options.maxLines = " << options.maxLines << endl; - if (options.maxLines != -1 && lineCount + outputLineNumber >= options.maxLines) { // We've reached the maximum number of lines lines.resize(options.maxLines - outputLineNumber); @@ -300,7 +341,6 @@ struct ForEachLineProcessor: public ComputeContext { ExcAssertEqual(keep.size(), chunkData.range_count()); auto [firstChunk, lastChunk] = chunkData.reduce(it, end); - cerr << "keeping chunks " << firstChunk << " to " << lastChunk << " of " << keep.size() << endl; keep.erase(keep.begin() + lastChunk, keep.end()); keep.erase(keep.begin(), keep.begin() + firstChunk); @@ -316,10 +356,10 @@ struct ForEachLineProcessor: public ComputeContext { if (this->relaxed_stopped()) return; if (!this->handle_line_block(std::move(lineBlock))) - this->stop(); + this->stop(ComputeContext::STOPPED_USER); }; - if (options.maxParallelism > 1) { + if (options.maxParallelism > 0) { submit(priority, "process_line_block " + std::to_string(chunk.chunkNumber), std::move(job)); } else { @@ -335,19 +375,6 @@ struct ForEachLineProcessor: public ComputeContext { outputLineNumber += lineCount; outputStartOffset = chunk.startOffset + chunk.data.size(); - // Allow another chunk to happen - { - std::unique_lock guard{chunks_mutex_}; - // Nothing should have happened in the meantime... - ExcAssertEqual(chunks_done_, chunk.chunkNumber); - ++chunks_done_; - if (lineBlock.lastBlock) { - // We're done - chunksFinished = true; - } - } - - return true; } std::function handle_line_block; @@ -365,16 +392,19 @@ struct ForEachLineProcessor: public ComputeContext { .startOffset = static_cast(block.startOffset), .lineNumber = static_cast(block.startLine), .numLinesInBlock = static_cast(block.lines.size()), + .lastBlock = block.lastBlock, }; if (startBlock && !startBlock(blockInfo)) return false; for (size_t i = 0; i < block.lines.size(); ++i) { + auto fixedup = options.splitter->fixupBlock({block.lines[i].data(), block.lines[i].size()}); LineInfo lineInfo { - .line = std::string_view(block.lines[i].data(), block.lines[i].size()), + .line = { fixedup.data(), fixedup.size() }, .lineNumber = static_cast(block.startLine + i), .blockNumber = static_cast(block.blockNumber), + .lastLine = block.lastBlock && i == block.lines.size() - 1, }; if (onLine && !onLine(lineInfo)) @@ -387,7 +417,10 @@ struct ForEachLineProcessor: public ComputeContext { return true; }; - return chunk_source(source); + bool res = chunk_source(source); + work_until_finished(); + rethrow_if_exception(); + return res && !is_stopped(); #if 0 @@ -405,7 +438,8 @@ struct ForEachLineProcessor: public ComputeContext { mutable std::mutex chunks_mutex_; std::map chunks_; std::atomic chunks_done_ = 0; - std::atomic chunksFinished = false; + std::atomic chunks_in_finished_ = false; + std::atomic chunks_out_finished_ = false; }; } // file scope diff --git a/utils/for_each_line.h b/utils/for_each_line.h index 5328e5c5a..47004e03c 100644 --- a/utils/for_each_line.h +++ b/utils/for_each_line.h @@ -41,6 +41,7 @@ struct LineInfo { std::string_view line; int64_t lineNumber = -1; int64_t blockNumber = -1; + bool lastLine = false; //int64_t startOffset = -1; }; diff --git a/utils/testing/coalesced_range_test.cc b/utils/testing/coalesced_range_test.cc index 339591cdd..a1b9fd1b5 100644 --- a/utils/testing/coalesced_range_test.cc +++ b/utils/testing/coalesced_range_test.cc @@ -168,3 +168,50 @@ TEST_CASE("coalesced range to_string()") } } } + +TEST_CASE("coalesced range get_span") +{ + CoalescedRange range; + + range.add(span("hello, world!", 13)); + + SECTION("full range") { + auto found = range.get_span(range.begin(), range.end()); + REQUIRE(found.has_value()); + CHECK(std::string(found->data(), found->data() + found->size()) == "hello, world!"); + } + + SECTION("partial range at end") { + auto found = range.get_span(range.begin() + 7, range.end()); + REQUIRE(found.has_value()); + CHECK(std::string(found->data(), found->data() + found->size()) == "world!"); + } + + SECTION("partial range at beginning") { + auto found = range.get_span(range.begin(), range.begin() + 5); + REQUIRE(found.has_value()); + CHECK(std::string(found->data(), found->data() + found->size()) == "hello"); + } + + SECTION("empty range at beginning") { + auto found = range.get_span(range.begin(), range.begin()); + CHECK(found.has_value()); + CHECK(found->size() == 0); + } + + SECTION("empty range at end") { + auto found = range.get_span(range.end(), range.end()); + CHECK(found.has_value()); + CHECK(found->size() == 0); + } + + SECTION("empty range in middle") { + auto found = range.get_span(range.begin() + 5, range.begin() + 5); + CHECK(found.has_value()); + CHECK(found->size() == 0); + } + + SECTION("backwards range") { + CHECK_THROWS(range.get_span(range.end(), range.begin())); + } +} \ No newline at end of file diff --git a/utils/testing/for_each_line_test.cc b/utils/testing/for_each_line_test.cc index 533eeb909..1fdd68df9 100644 --- a/utils/testing/for_each_line_test.cc +++ b/utils/testing/for_each_line_test.cc @@ -30,7 +30,8 @@ namespace { void testForEachLineBlock(const std::string & data, size_t blockSize, size_t startOffset, - int64_t maxLines = -1) + int64_t maxLines = -1, + int maxParallelism = 1) { std::vector splitLines = split(string(data, startOffset), '\n'); for (auto & l: splitLines) { @@ -85,11 +86,16 @@ void testForEachLineBlock(const std::string & data, ++numBlocksFinished; return true; }; - + + std::mutex onLineMutex; + auto onLine = [&] (const char * line, size_t length, int64_t blockNumber, int64_t lineNumber) -> bool { - CHECK(lineNumber == numLines); + std::unique_lock lock{onLineMutex}; + if (maxParallelism == 0) { + CHECK(lineNumber == numLines); + } CHECK(lineNumber < splitLines.size()); if (lineNumber < splitLines.size()) { if (splitLines[lineNumber] != string(line, length)) @@ -100,8 +106,6 @@ void testForEachLineBlock(const std::string & data, return true; }; - int maxParallelism = 1; - forEachLineBlock(content, startOffset, onLine, maxLines, maxParallelism, onStartBlock, onEndBlock, blockSize); @@ -115,32 +119,39 @@ void testForEachLineBlock(const std::string & data, TEST_CASE("test_forEachLineBlock") { - /* 1 */ testForEachLineBlock("", 1 /* blockSize */, 0 /* startOffset */); - /* 2 */ testForEachLineBlock("\n", 1 /* blockSize */, 0 /* startOffset */); - /* 3 */ testForEachLineBlock("\n", 1 /* blockSize */, 1 /* startOffset */); - /* 4 */ testForEachLineBlock(" ", 1 /* blockSize */, 0 /* startOffset */); - /* 5 */ testForEachLineBlock("\n\n\n\n\n\n\n\n\n\n", 1 /* blockSize */, 0 /* startOffset */); - /* 6 */ testForEachLineBlock("\n\n\n\n\n\n\n\n\n\n", 100 /* blockSize */, 0 /* startOffset */); - /* 7 */ testForEachLineBlock("\n\n\n\n\n\n\n\n\n\n", 100 /* blockSize */, 10 /* startOffset */); - /* 8 */ testForEachLineBlock("\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n", 1 /* blockSize */, 10 /* startOffset */); - /* 9 */ testForEachLineBlock("\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n", 2 /* blockSize */, 0 /* startOffset */); - /* 10 */ testForEachLineBlock("\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n", 2 /* blockSize */, 1 /* startOffset */); - /* 11 */ testForEachLineBlock("a\nab\nabc\nabcd\nabcde\nabcd\nabc\nab\na\n\n", 100 /* blockSize */, 0 /* startOffset */); - /* 12 */ testForEachLineBlock("a\nab\nabc\nabcd\nabcde\nabcd\nabc\nab\na\n\n", 1 /* blockSize */, 0 /* startOffset */); - /* 13 */ testForEachLineBlock("a\nab\nabc\nabcd\nabcde\nabcd\nabc\nab\na\n\n", 2 /* blockSize */, 0 /* startOffset */); - /* 14 */ testForEachLineBlock("a\nab\nabc\nabcd\nabcde\nabcd\nabc\nab\na\n\n", 5 /* blockSize */, 0 /* startOffset */); - - /* 15 */ testForEachLineBlock("", 1 /* blockSize */, 0 /* startOffset */, 0 /* max lines */); - /* 16 */ testForEachLineBlock("\n", 1 /* blockSize */, 0 /* startOffset */, 0 /* max lines */); - /* 17 */ testForEachLineBlock("\n", 1 /* blockSize */, 0 /* startOffset */, 1 /* max lines */); - /* 18 */ testForEachLineBlock("\n", 1 /* blockSize */, 0 /* startOffset */, 2 /* max lines */); - /* 19 */ testForEachLineBlock("a\nb\nc\n", 1 /* blockSize */, 0 /* startOffset */, 0 /* max lines */); - /* 20 */ testForEachLineBlock("a\nb\nc\n", 1 /* blockSize */, 0 /* startOffset */, 1 /* max lines */); - /* 21 */ testForEachLineBlock("a\nb\nc\n", 1 /* blockSize */, 0 /* startOffset */, 2 /* max lines */); - /* 22 */ testForEachLineBlock("a\nb\nc\n", 1 /* blockSize */, 0 /* startOffset */, 3 /* max lines */); - /* 23 */ testForEachLineBlock("a\nb\nc\n", 1 /* blockSize */, 0 /* startOffset */, 4 /* max lines */); - - /* 24 */ testForEachLineBlock("a\r\nab\r\nabc\r\nabcd\r\nabcde\r\nabcd\r\nabc\r\nab\r\na\r\n\r\n", 5 /* blockSize */, 0 /* startOffset */); + for (auto parallelism: { 0 , 1, -1 }) { + SECTION("parallelism " + std::to_string(parallelism)) { +#if 1 + SECTION("test 1") { testForEachLineBlock("", 1 /* blockSize */, 0 /* startOffset */, -1, parallelism); } + SECTION("test 2") { testForEachLineBlock("\n", 1 /* blockSize */, 0 /* startOffset */, -1, parallelism); } + SECTION("test 3") { testForEachLineBlock("\n", 1 /* blockSize */, 1 /* startOffset */, -1, parallelism); } +#endif + SECTION("test 4") { testForEachLineBlock(" ", 1 /* blockSize */, 0 /* startOffset */, -1, parallelism); } +#if 1 + SECTION("test 5") { testForEachLineBlock("\n\n\n\n\n\n\n\n\n\n", 1 /* blockSize */, 0 /* startOffset */, -1, parallelism); } + SECTION("test 6") { testForEachLineBlock("\n\n\n\n\n\n\n\n\n\n", 100 /* blockSize */, 0 /* startOffset */, -1, parallelism); } + SECTION("test 7") { testForEachLineBlock("\n\n\n\n\n\n\n\n\n\n", 100 /* blockSize */, 10 /* startOffset */, -1, parallelism); } + SECTION("test 8") { testForEachLineBlock("\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n", 1 /* blockSize */, 10 /* startOffset */, -1, parallelism); } + SECTION("test 9") { testForEachLineBlock("\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n", 2 /* blockSize */, 0 /* startOffset */, -1, parallelism); } + SECTION("test 10") { testForEachLineBlock("\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n", 2 /* blockSize */, 1 /* startOffset */, -1, parallelism); } + SECTION("test 11") { testForEachLineBlock("a\nab\nabc\nabcd\nabcde\nabcd\nabc\nab\na\n\n", 100 /* blockSize */, 0 /* startOffset */, -1, parallelism); } + SECTION("test 12") { testForEachLineBlock("a\nab\nabc\nabcd\nabcde\nabcd\nabc\nab\na\n\n", 1 /* blockSize */, 0 /* startOffset */, -1, parallelism); } + SECTION("test 13") { testForEachLineBlock("a\nab\nabc\nabcd\nabcde\nabcd\nabc\nab\na\n\n", 2 /* blockSize */, 0 /* startOffset */, -1, parallelism); } + SECTION("test 14") { testForEachLineBlock("a\nab\nabc\nabcd\nabcde\nabcd\nabc\nab\na\n\n", 5 /* blockSize */, 0 /* startOffset */, -1, parallelism); } + SECTION("test 15") { testForEachLineBlock("", 1 /* blockSize */, 0 /* startOffset */, 0 /* max lines */, parallelism); } + SECTION("test 16") { testForEachLineBlock("\n", 1 /* blockSize */, 0 /* startOffset */, 0 /* max lines */, parallelism); } + SECTION("test 17") { testForEachLineBlock("\n", 1 /* blockSize */, 0 /* startOffset */, 1 /* max lines */, parallelism); } + SECTION("test 18") { testForEachLineBlock("\n", 1 /* blockSize */, 0 /* startOffset */, 2 /* max lines */, parallelism); } + SECTION("test 19") { testForEachLineBlock("a\nb\nc\n", 1 /* blockSize */, 0 /* startOffset */, 0 /* max lines */, parallelism); } + SECTION("test 20") { testForEachLineBlock("a\nb\nc\n", 1 /* blockSize */, 0 /* startOffset */, 1 /* max lines */, parallelism); } + SECTION("test 21") { testForEachLineBlock("a\nb\nc\n", 1 /* blockSize */, 0 /* startOffset */, 2 /* max lines */, parallelism); } + SECTION("test 22") { testForEachLineBlock("a\nb\nc\n", 1 /* blockSize */, 0 /* startOffset */, 3 /* max lines */, parallelism); } + SECTION("test 23") { testForEachLineBlock("a\nb\nc\n", 1 /* blockSize */, 0 /* startOffset */, 4 /* max lines */, parallelism); } + SECTION("test 24") { testForEachLineBlock("a\r\nab\r\nabc\r\nabcd\r\nabcde\r\nabcd\r\nabc\r\nab\r\na\r\n\r\n", 5 /* blockSize */, 0 /* startOffset */, parallelism); } + SECTION("test 24") { testForEachLineBlock("a\r\nab\r\nabc\r\nabcd\r\nabcde\r\nabcd\r\nabc\r\nab\r\na\r\n\r\n", 5 /* blockSize */, 0 /* startOffset */, -1, parallelism); } +#endif + } + } } vector dataStrings{"line1", "line2", "", "line forty 2"}; @@ -489,11 +500,11 @@ TEST_CASE("for_each_line newline splitter") { for (auto parallelism: { 0, 1, -1 }) { SECTION("parallelism " + std::to_string(parallelism)) { - cerr << "parallelism " << parallelism << endl; + //cerr << "parallelism " << parallelism << endl; for (auto blockSize: { -1, 1, 2, 3, 5, 17, 1000000 }) { SECTION("blockSize " + std::to_string(blockSize)) { - cerr << "blockSize " << blockSize << endl; -#if 1 + //cerr << "blockSize " << blockSize << endl; + SECTION("blocked stream") { ForEachLineTester tester; tester.processUsingBlockedStream("file://mldb/testing/MLDB-1043-bucketize-data.csv", blockSize); @@ -506,23 +517,19 @@ TEST_CASE("for_each_line newline splitter") tester.processUsingBlockedMappedStream("file://mldb/testing/MLDB-1043-bucketize-data.csv", blockSize); tester.validate(); } -#endif SECTION("blocked gzip stream") { ForEachLineTester tester; - tester.processUsingBlockedMappedStream("file://mldb/mldb_test_data/reviews_Digital_Music_5.json.zstd", blockSize, 64000 /* maxLines */); + tester.processUsingBlockedMappedStream("file://mldb/mldb_test_data/reviews_Digital_Music_5.json.zstd", blockSize, blockSize > 5 ? 64000: 640 /* maxLines */); tester.validate(); } -#if 1 SECTION("line by line") { ForEachLineTester tester; tester.processUsingLineByLine("file://mldb/mldb_test_data/reviews_Digital_Music_5.json.zstd", 1000 /* maxLines */); tester.validate(); }; -#endif -#if 1 SECTION("blocked content descriptor") { ForEachLineTester tester; tester.processUsingContentDescriptor("file://mldb/testing/MLDB-1043-bucketize-data.csv", blockSize); @@ -536,11 +543,11 @@ TEST_CASE("for_each_line newline splitter") tester.validate(); } } -#endif } } } } + #if 0 SECTION("blocked filter stream") { ForEachLineTester tester; diff --git a/utils/testing/mldb_catch2.h b/utils/testing/mldb_catch2.h index 33f28822f..14737fa22 100644 --- a/utils/testing/mldb_catch2.h +++ b/utils/testing/mldb_catch2.h @@ -13,3 +13,27 @@ #undef REQUIRE_THROWS #define REQUIRE_THROWS(...) do { MLDB_TRACE_EXCEPTIONS(false); CATCH2_REQUIRE_THROWS(__VA_ARGS__); } while (0) + +#define BOOST_CHECK_EQUAL(x, y) CHECK(x == y) +#define BOOST_CHECK(x) CHECK(x) +#define BOOST_CHECK_GT(x, y) CHECK(x > y) +#define BOOST_CHECK_LT(x, y) CHECK(x < y) +#define BOOST_CHECK_GE(x, y) CHECK(x >= y) +#define BOOST_CHECK_LE(x, y) CHECK(x <= y) + +#define BOOST_REQUIRE_EQUAL(x, y) REQUIRE(x == y) +#define BOOST_REQUIRE(x) REQUIRE(x) +#define BOOST_REQUIRE_GT(x, y) REQUIRE(x > y) +#define BOOST_REQUIRE_LT(x, y) REQUIRE(x < y) +#define BOOST_REQUIRE_GE(x, y) REQUIRE(x >= y) +#define BOOST_REQUIRE_LE(x, y) REQUIRE(x <= y) + +#define BOOST_AUTO_TEST_CASE(name) TEST_CASE(#name) + +namespace boost { + namespace unit_test { + struct test_suite { + test_suite(const char * name = "") { } + }; + } +} diff --git a/vfs/compressor.cc b/vfs/compressor.cc index 303191bb5..b077fce20 100644 --- a/vfs/compressor.cc +++ b/vfs/compressor.cc @@ -184,7 +184,7 @@ forEachBlockParallel(size_t requestedBlockSize, ComputeContext & compute, const PriorityFn & priority) { - bool finished = false; + std::atomic finished = false; size_t blockNumber = 0; size_t currentOffset = 0; size_t numChars = 0; @@ -206,7 +206,21 @@ forEachBlockParallel(size_t requestedBlockSize, job(); }; - while (std::get<0>((std::tie(buf, numChars) = getData(requestedBlockSize)))) { + auto submitJob = [&] (ThreadJob job) + { + if (!compute.single_threaded()) { + { + std::unique_lock guard{jobsMutex}; + jobs.push_back(std::move(job)); + } + compute.submit(priority(blockNumber), "Decompressor::forEachBlockParallel", doOne); + } + else { + job(); + } + }; + + while (!finished.load(std::memory_order_relaxed) && std::get<0>((std::tie(buf, numChars) = getData(requestedBlockSize)))) { auto onData = [&] (std::shared_ptr data, size_t len) -> size_t { if (finished) @@ -218,23 +232,14 @@ forEachBlockParallel(size_t requestedBlockSize, auto doBlock = [myBlockNumber, myOffset, data = std::move(data), len, &finished, &onBlock] () { - if (finished) + if (finished.load(std::memory_order_relaxed)) return; - if (!onBlock(myBlockNumber, myOffset, std::move(data), len)) { + if (!onBlock(myBlockNumber, myOffset, std::move(data), len, false /* lastBlock */)) { finished = true; } }; - if (!compute.single_threaded()) { - { - std::unique_lock guard{jobsMutex}; - jobs.push_back(std::move(doBlock)); - } - compute.submit(priority(myBlockNumber), "Decompressor::forEachBlockParallel", doOne); - } - else { - doBlock(); - } + submitJob(doBlock); currentOffset += len; return len; @@ -243,6 +248,17 @@ forEachBlockParallel(size_t requestedBlockSize, decompress(buf, numChars, onData, allocate); } + if (!finished) { + auto doLastBlock = [&] () + { + if (finished.load(std::memory_order_relaxed)) + return; + if (!onBlock(blockNumber, currentOffset, std::shared_ptr(), 0, true /* lastBlock */)) + finished = true; + }; + submitJob(doLastBlock); + } + compute.work_until_finished(); return !finished; diff --git a/vfs/compressor.h b/vfs/compressor.h index be4e04345..0886dcff3 100644 --- a/vfs/compressor.h +++ b/vfs/compressor.h @@ -190,7 +190,8 @@ struct Decompressor { typedef ContinuationFn blockStart, - size_t blockLength)> + size_t blockLength, + bool lastBlock)> ForEachBlockFunction; typedef std::function, size_t> (size_t)> diff --git a/vfs/lz4.cc b/vfs/lz4.cc index e1a345e74..3efd10815 100644 --- a/vfs/lz4.cc +++ b/vfs/lz4.cc @@ -678,14 +678,16 @@ struct Lz4Decompressor: public Decompressor { size_t blockNumber = 0; size_t blockOffset = 0; size_t blockSize = header.blockSize(); - - while (state != FINISHED && state != STREAM_CHECKSUM && !aborted) { + while (!aborted) { while (state != FINISHED && state != STREAM_CHECKSUM && state != BLOCK_DATA) pumpState(); - if (state == FINISHED || state == STREAM_CHECKSUM || aborted) + if (state == FINISHED || state == STREAM_CHECKSUM) { + if (!onBlock(blockNumber, blockOffset, nullptr, 0, true)) + aborted = true; break; + } std::shared_ptr ourBlockData; @@ -716,9 +718,9 @@ struct Lz4Decompressor: public Decompressor { &aborted, &onBlock, &allocate, - &compute] () + &block_compute] () { - if (compute.relaxed_stopped()) + if (block_compute.relaxed_stopped()) return; std::shared_ptr outputData; @@ -727,8 +729,7 @@ struct Lz4Decompressor: public Decompressor { std::tie(outputData, outputLength) = decompressBlock(std::move(ourBlockData), blockHeader, blockChecksum, allocate); - if (!onBlock(blockNumber, blockOffset, - outputData, outputLength)) + if (!onBlock(blockNumber, blockOffset, outputData, outputLength, false /* lastBlock */)) aborted = true; //if (header.streamChecksum()) { @@ -740,10 +741,10 @@ struct Lz4Decompressor: public Decompressor { blockOffset += blockSize; // Finish processing in a new thread - if (compute.single_threaded()) + if (block_compute.single_threaded()) processBlock(); else - compute.submit(priority(blockNumber), "lz4 decompress block", std::move(processBlock)); + block_compute.submit(priority(blockNumber), "lz4 decompress block", std::move(processBlock)); // Start of a new block again setCur(BLOCK_HEADER, blockHeader); From 2cfb2ef1c0570c149779d4f44ab1a7f5f59b2ff3 Mon Sep 17 00:00:00 2001 From: Jeremy Barnes Date: Mon, 3 Feb 2025 19:36:59 -0500 Subject: [PATCH 35/39] SQUASH for_each_line (14) --- builtin/python/python_plugin_context.cc | 5 +- plugins/textual/importtext_procedure.cc | 5 +- plugins/textual/json_importer.cc | 5 +- utils/block_splitter.cc | 42 +++---- utils/block_splitter.h | 63 ++++++++-- utils/block_splitter_impl.h | 16 ++- utils/coalesced_range.h | 4 +- utils/for_each_line.cc | 143 ++++++++-------------- utils/for_each_line.h | 153 ++++++++++++++++++++---- utils/is_callable_with.h | 27 +++++ utils/testing/coalesced_range_test.cc | 44 +++++++ utils/testing/for_each_line_test.cc | 109 +++-------------- utils/testing/newline_splitter_test.cc | 82 +++++++++++++ utils/testing/testing.mk | 1 + 14 files changed, 433 insertions(+), 266 deletions(-) create mode 100644 utils/is_callable_with.h create mode 100644 utils/testing/newline_splitter_test.cc diff --git a/builtin/python/python_plugin_context.cc b/builtin/python/python_plugin_context.cc index 4ee80c192..54fbcc318 100644 --- a/builtin/python/python_plugin_context.cc +++ b/builtin/python/python_plugin_context.cc @@ -728,9 +728,8 @@ readLines(const std::string & path, int maxLines) lines.append(line); }; - auto logger = getMldbLog("python"); - forEachLine(stream, onLine, logger, 1 /* numThreads */, false /* ignore exc */, - maxLines); + namespace o = ForEachLine::options; + forEachLine(stream, onLine, o::maxParallelism = 0, o::maxLines = maxLines); return lines; } diff --git a/plugins/textual/importtext_procedure.cc b/plugins/textual/importtext_procedure.cc index 8b1b451b2..6fe1e84d8 100644 --- a/plugins/textual/importtext_procedure.cc +++ b/plugins/textual/importtext_procedure.cc @@ -1313,9 +1313,8 @@ struct ImportTextProcedureWorkInstance if(!config.allowMultiLines) { - forEachLineBlock(stream, onLine, config.limit, - numCpus() /* parallelism */, - startChunk, doneChunk); + namespace o = ForEachLine::options; + forEachLineBlock(stream, onLine, startChunk, doneChunk, o::maxLines = config.limit); } else { // very simplistic and not efficient way of doing multi-line. we send diff --git a/plugins/textual/json_importer.cc b/plugins/textual/json_importer.cc index 0b8fd87e9..9ed44eb8a 100644 --- a/plugins/textual/json_importer.cc +++ b/plugins/textual/json_importer.cc @@ -392,8 +392,9 @@ struct JSONImporter: public Procedure { return keepGoing; }; - forEachLineBlock(stream, onLine, runProcConf.limit, 32, - startChunk, doneChunk); + namespace o = ForEachLine::options; + forEachLineBlock(stream, onLine, startChunk, doneChunk, o::maxLines=runProcConf.limit); + if (!keepGoing) { throw MLDB::CancellationException("Procedure import.json cancelled"); } diff --git a/utils/block_splitter.cc b/utils/block_splitter.cc index 212129282..48395e0fb 100644 --- a/utils/block_splitter.cc +++ b/utils/block_splitter.cc @@ -14,31 +14,38 @@ namespace MLDB { -const NewlineSplitter newLineSplitter; +using namespace std; -std::span -BlockSplitter:: -fixupBlock(std::span block) const -{ - return block; -} +const NewlineSplitter newLineSplitter; -std::optional +NewlineSplitter::NextRecordResultT NewlineSplitter:: nextRecordT(const TextBlock & data, TextBlockIterator curr, bool noMoreData) const { auto result = data.find(curr, data.end(), '\n'); + if (result != data.end()) { + // Found a newline, skip it and return + size_t skip = 1; // skip the newline + size_t record_end = result - curr; + + // Skip back through the \r if it's a DOS line ending + if (result != curr && result[-1] == '\r') { + ++skip; + --record_end; + }; - // Found a newline, skip it and return - if (result != data.end()) - return result + 1; + return { true, record_end, skip }; + } // No newline but EOF, return up to the last character - if (noMoreData) - return data.end(); + if (noMoreData) { + size_t skip = 0; + if (curr != data.end() && result[-1] == '\r') { ++skip; --result; }; + return { true, data.end() - curr - skip, skip }; + } // No newline and not EOF, we need more data - return std::nullopt; + return { false }; } std::span @@ -52,11 +59,4 @@ removeNewlines(std::span block) return { p, size_t(e - p) }; } -std::span -NewlineSplitter:: -fixupBlock(std::span block) const -{ - return removeNewlines(block); -} - } // namespace MLDB diff --git a/utils/block_splitter.h b/utils/block_splitter.h index beffb54d3..76b479808 100644 --- a/utils/block_splitter.h +++ b/utils/block_splitter.h @@ -13,7 +13,6 @@ #include #include #include -#include #include "mldb/utils/coalesced_range_fwd.h" namespace MLDB { @@ -29,12 +28,55 @@ using TextBlockIterator = CoalescedRangeIterator> + + // Result of the NextRecord function + template + struct NextRecordResultT { + bool foundRecord = false; // True if a new record was found within the data bounds + size_t skipToEndOfRecord = 0; // Number of bytes to skip from the iterator to the end of the record + size_t skipSeparators = 0; // Number of extra bytes to skip over the separator + + operator bool() const { return foundRecord; } + State newState; // New splitter state corresponding to the beginning of the next record + }; + + // Result of the stateless next record function + template<> + struct NextRecordResultT { + bool foundRecord = false; // True if a new record was found within the data bounds + size_t skipToEndOfRecord = 0; // Number of bytes to skip from the iterator to the end of the record + size_t skipSeparators = 0; // Number of extra bytes to skip over the separator + + operator bool() const { return foundRecord; } + }; + + using NextRecordResult = NextRecordResultT; + + + // Jump the iterator to the beginning of the next record. If a new record has not begun, foundRecord will be + // false. + // + // If foundRecord is true, then the output contains: + // - The iterator position of the end of the current record + // - The new splitter state to pass to the splitter + // - The number of bytes to skip the separator (if any) to get to the next record. The iterator must be + // advanced by this number of bytes before this function is called again. + virtual NextRecordResult nextRecord(const TextBlock & data, TextBlockIterator curr, bool noMoreData, const std::any & state) const = 0; - virtual std::span fixupBlock(std::span block) const; }; /* BlockSplitter with a specific state type. */ @@ -42,15 +84,17 @@ template struct BlockSplitterT: public BlockSplitter { virtual ~BlockSplitterT() = default; virtual State newStateT() const { return State(); } - virtual std::optional> + + virtual NextRecordResultT nextRecordT(const TextBlock & data, TextBlockIterator curr, bool noMoreData, const State & state) const = 0; + virtual std::any newState() const override { return newStateT(); } // in block_splitter_impl.h - virtual std::optional> + virtual NextRecordResult nextRecord(const TextBlock & data, TextBlockIterator curr, bool noMoreData, const std::any & state) const override; }; @@ -63,22 +107,21 @@ struct BlockSplitterT: public BlockSplitter { return {}; } virtual bool isStateless() const override { return true; }; - virtual std::optional + + virtual NextRecordResultT nextRecordT(const TextBlock & data, TextBlockIterator curr, bool noMoreData) const = 0; // in block_splitter_impl.h - virtual std::optional> + virtual NextRecordResult nextRecord(const TextBlock & data, TextBlockIterator curr, bool noMoreData, const std::any & state) const override; }; /* BlockSplitter that splits on the newline character. */ struct NewlineSplitter: public BlockSplitterT { - virtual std::optional + virtual NextRecordResultT nextRecordT(const TextBlock & data, TextBlockIterator curr, bool noMoreData) const override; static std::span removeNewlines(std::span block); - - virtual std::span fixupBlock(std::span block) const override; }; /* Instance of the newline splitter that we can use for default reference arguments. */ diff --git a/utils/block_splitter_impl.h b/utils/block_splitter_impl.h index 37dfb952b..9aeb69f26 100644 --- a/utils/block_splitter_impl.h +++ b/utils/block_splitter_impl.h @@ -17,25 +17,23 @@ namespace MLDB { /* BlockSplitter with a specific state type. */ template -std::optional> +BlockSplitterT::NextRecordResult BlockSplitterT:: nextRecord(const TextBlock & data, TextBlockIterator curr, bool noMoreData, const std::any & state) const { const State & stateT = std::any_cast(state); - auto [newPos, newState] = nextRecordT(data, noMoreData, stateT); - return { newPos, std::move(newState) }; + auto [found, skip_end, skip_sep, new_state] = nextRecordT(data, noMoreData, stateT); + return { found, skip_end, skip_sep, std::move(new_state) }; }; /* BlockSplitter with no state. */ -std::optional> +BlockSplitterT::NextRecordResult BlockSplitterT:: nextRecord(const TextBlock & data, TextBlockIterator curr, bool noMoreData, const std::any & state) const { - auto newPos = nextRecordT(data, curr, noMoreData); - if (!newPos) - return std::nullopt; - std::tuple result(*newPos, std::any()); - return result; + auto [found, skip_end, skip_sep] = nextRecordT(data, curr, noMoreData); + if (!found) return { false }; + return { true, skip_end, skip_sep, std::any() }; } } // namespace MLDB \ No newline at end of file diff --git a/utils/coalesced_range.h b/utils/coalesced_range.h index a5389492f..3622ec981 100644 --- a/utils/coalesced_range.h +++ b/utils/coalesced_range.h @@ -98,14 +98,14 @@ struct CoalescedRangeIterator { } return *this; } - else return operator -= (ofs); + else return operator -= (-ofs); } CoalescedRangeIterator & operator -= (ssize_t ofs) { if (ofs >= 0) { while (ofs) { - if (ofs >= offset_) { + if (ofs > offset_) { ofs -= offset_; ExcCheckGreater(range_, 0, "Coalesced range iterator before beginning"); --range_; diff --git a/utils/for_each_line.cc b/utils/for_each_line.cc index 6331a604b..8367b60a8 100644 --- a/utils/for_each_line.cc +++ b/utils/for_each_line.cc @@ -40,29 +40,22 @@ namespace MLDB { namespace { - -struct ForEachLineOptions { - int maxParallelism = -1; - ssize_t defaultBlockSize = -1; - size_t startOffset = 0; - size_t skipLines = 0; - ssize_t maxLines = -1; - const BlockSplitter * splitter = &newLineSplitter; -}; - struct ForEachLineProcessor: public ComputeContext { ForEachLineProcessor(ForEachLineOptions options) - : ComputeContext(options.maxParallelism), options(options) + : ComputeContext(options.maxParallelism), options(std::move(options)) { } ForEachLineOptions options; +#if 0 enum { CHUNK_STREAM_PRIORITY = 5, }; +#endif +#if 0 struct JobPromise; struct CoroutineJob: public std::coroutine_handle { @@ -76,6 +69,7 @@ struct ForEachLineProcessor: public ComputeContext { void return_void() {} void unhandled_exception() {} }; +#endif // A chunk of memory plus metadata struct Chunk { @@ -174,8 +168,7 @@ struct ForEachLineProcessor: public ComputeContext { return handle_out_of_order_chunk({chunkNumber, chunkOffset, lastChunk, mem, {}}); }; - auto getPriority = [] (size_t chunkNumber) -> int { return CHUNK_STREAM_PRIORITY; }; - auto res = content.forEachBlockParallel(options.startOffset, blockSize, *this /*compute*/, getPriority, doBlock); + auto res = content.forEachBlockParallel(options.startOffset, blockSize, *this /*compute*/, 5 /* priority */, doBlock); return res; } @@ -304,12 +297,14 @@ struct ForEachLineProcessor: public ComputeContext { auto & lines = lineBlock.lines; auto it = chunkData.begin(), end = chunkData.end(); + bool trailingSeparator = false; while (it != end) { - auto another = options.splitter->nextRecord(chunkData, it, chunk.lastChunk, splitterState); - if (!another) + auto [found_record, skip_to_end, skip_separator, next_state] + = options.splitter->nextRecord(chunkData, it, chunk.lastChunk, splitterState); + if (!found_record) break; - auto [next_it, next_state] = another.value(); + auto next_it = it + skip_to_end; if (auto lineSpan = chunkData.get_span(it, next_it)) { // Push the contiguous line @@ -325,7 +320,14 @@ struct ForEachLineProcessor: public ComputeContext { lineBlock.keep.emplace_back(std::move(contiguous)); } splitterState = std::move(next_state); - it = next_it; + it = next_it + skip_separator; + trailingSeparator = skip_separator > 0; + } + + if (options.outputTrailingEmptyLine && trailingSeparator && chunk.lastChunk) { + // We have a trailing separator at the end of the last chunk + // We need to add an empty line + lines.push_back({}); } size_t lineCount = lines.size(); @@ -385,6 +387,9 @@ struct ForEachLineProcessor: public ComputeContext { const BlockContinuationFn & startBlock, const BlockContinuationFn & endBlock) { + std::atomic done = 0; + Date start = Date::now(), lastCheck = start; + handle_line_block = [&] (LineBlock block) { LineBlockInfo blockInfo { @@ -399,9 +404,26 @@ struct ForEachLineProcessor: public ComputeContext { return false; for (size_t i = 0; i < block.lines.size(); ++i) { - auto fixedup = options.splitter->fixupBlock({block.lines[i].data(), block.lines[i].size()}); + if (options.logger) { + auto new_done = done.fetch_add(1) + 1; + + if (new_done % options.logInterval == 0 && + options.logger->should_log(spdlog::level::info)) { + + options.logger->info() << "done " << new_done << " lines"; + Date now = Date::now(); + + double elapsed = now.secondsSince(start); + double instElapsed = now.secondsSince(lastCheck); + options.logger->info() << MLDB::format("doing %.3fMlines/second total, %.3f instantaneous", + done / elapsed / 1000000.0, + options.logInterval / instElapsed / 1000000.0); + lastCheck = now; + } + } + LineInfo lineInfo { - .line = { fixedup.data(), fixedup.size() }, + .line = { block.lines[i].data(), block.lines[i].size() }, .lineNumber = static_cast(block.startLine + i), .blockNumber = static_cast(block.blockNumber), .lastLine = block.lastBlock && i == block.lines.size() - 1, @@ -447,58 +469,10 @@ struct ForEachLineProcessor: public ComputeContext { size_t forEachLine(std::istream & stream, const LineContinuationFn & processLine, - shared_ptr logger, - int numThreads, - bool ignoreStreamExceptions, - int64_t maxLines) + const ForEachLineOptions & options) { - - ForEachLineOptions options; - options.maxParallelism = numThreads; - options.defaultBlockSize = -1; - options.startOffset = 0; - options.skipLines = 0; - options.maxLines = maxLines; - options.splitter = &newLineSplitter; - ForEachLineProcessor processor(options); - std::atomic done(0); - Date start = Date::now(); - Date lastCheck = start; - - auto onLine = [&] (const char * line, size_t length, int64_t blockNumber, int64_t lineNumber) -> bool - { - LineInfo lineInfo { std::string_view(line, length), lineNumber, blockNumber }; - try { - bool res = processLine(lineInfo); - if (!res) - return false; - auto new_done = done.fetch_add(1) + 1; - - if (new_done % 1000000 == 0 && - logger->should_log(spdlog::level::info)) { - - logger->info() << "done " << new_done << " lines"; - Date now = Date::now(); - - double elapsed = now.secondsSince(start); - double instElapsed = now.secondsSince(lastCheck); - logger->info() << MLDB::format("doing %.3fMlines/second total, %.3f instantaneous", - done / elapsed / 1000000.0, - 1000000 / instElapsed / 1000000.0); - lastCheck = now; - } - } MLDB_CATCH_ALL { - WARNING_MSG(logger) << "error dealing with line " << lineInfo.line - << ": " << getExceptionString(); - if (!ignoreStreamExceptions) { - throw; - } - } - return true; - }; - - return processor.process(stream, onLine, nullptr /* startBlock */, nullptr /* endBlock */); + return processor.process(stream, processLine, nullptr /* startBlock */, nullptr /* endBlock */); } @@ -508,52 +482,30 @@ forEachLine(std::istream & stream, bool forEachLineBlock(std::istream & stream, const LineContinuationFn & onLine, - int64_t maxLines, - int maxParallelism, const BlockContinuationFn & startBlock, const BlockContinuationFn & endBlock, - ssize_t defaultBlockSize, - const BlockSplitter & splitter) + const ForEachLineOptions & options) { - ForEachLineOptions options; - options.maxParallelism = maxParallelism; - options.defaultBlockSize = defaultBlockSize; - options.startOffset = 0; - options.skipLines = 0; - options.maxLines = maxLines; - options.splitter = &splitter; - ForEachLineProcessor processor(options); return processor.process(stream, onLine, startBlock, endBlock); } + /*****************************************************************************/ /* FOR EACH LINE BLOCK (CONTENT HANDLER) */ /*****************************************************************************/ bool forEachLineBlock(std::shared_ptr content, - uint64_t startOffset, const LineContinuationFn & onLine, - int64_t maxLines, - int maxParallelism, const BlockContinuationFn & startBlock, const BlockContinuationFn & endBlock, - size_t blockSize, - const BlockSplitter & splitter) + const ForEachLineOptions & options) { - ForEachLineOptions options; - options.maxParallelism = maxParallelism; - options.defaultBlockSize = blockSize; - options.startOffset = startOffset; - options.skipLines = 0; - options.maxLines = maxLines; - options.splitter = &splitter; - ForEachLineProcessor processor(options); return processor.process(*content, onLine, startBlock, endBlock); } - +#if 0 /*****************************************************************************/ /* FOR EACH CHUNK */ /*****************************************************************************/ @@ -630,5 +582,6 @@ void forEachChunk(std::istream & stream, std::rethrow_exception(exc); } } +#endif } // namespace MLDB diff --git a/utils/for_each_line.h b/utils/for_each_line.h index 47004e03c..160042f9f 100644 --- a/utils/for_each_line.h +++ b/utils/for_each_line.h @@ -10,7 +10,9 @@ #pragma once #include "mldb/utils/log_fwd.h" +#include "mldb/block/content_descriptor_fwd.h" #include "mldb/utils/block_splitter.h" +#include "mldb/utils/is_callable_with.h" #include "mldb/base/compute_context.h" #include #include @@ -24,18 +26,83 @@ namespace MLDB { -template -struct is_callable_with { - template static auto test(int) -> decltype(std::declval()(std::declval()...), std::true_type()); - template static auto test(...) -> std::false_type; - using type = decltype(test(0)); - static constexpr bool value = type::value; + +/*************************************************************************/ +/* FOR EACH LINE OPTIONS */ +/*************************************************************************/ + +// Options for the for_each_line functions. Not all options apply to all +// functions. +struct ForEachLineOptions { + int maxParallelism = -1; // Controls the number of extra threads; 0 = use the main thread only, -1 = all available cores + ssize_t defaultBlockSize = -1; // Granularity of blocks being passed to the processing function + size_t startOffset = 0; // How much of the file to skip at the beginning + size_t skipLines = 0; // How many lines to skip at the beginning + ssize_t maxLines = -1; // Maximum number of lines to process + bool outputTrailingEmptyLine = false; // Whether to output a trailing empty line if the file ends with a newline + std::shared_ptr logger = nullptr; // Logger to use for logging + size_t logInterval = 1000000; // How often to log a progress message to the logger (every n lines) + const BlockSplitter * splitter = &newLineSplitter; // Block splitter to split into lines +}; + + +template +struct OptionValue { + using Member = Result Struct::*; + Member member; + Result value; + + constexpr OptionValue(Member member, Result value): member(member), value(std::move(value)) { } + void apply(ForEachLineOptions & opts) const { opts.*member = value; } +}; + +template +struct OptionSpec { + using Type = Result Struct::*; + Type member; + + template + constexpr OptionValue operator = (Arg&& val) const { + return { member, Result(std::move(val)) }; + } }; -template constexpr bool is_callable_with_v = is_callable_with::value; -template using is_callable_with_t = is_callable_with::type; +#define DECLARE_OPTION_SPEC(Struct, Member) \ + constexpr OptionSpec Member = { &Struct::Member } + +namespace ForEachLine { +namespace options { + +DECLARE_OPTION_SPEC(ForEachLineOptions, maxParallelism); +DECLARE_OPTION_SPEC(ForEachLineOptions, defaultBlockSize); +DECLARE_OPTION_SPEC(ForEachLineOptions, startOffset); +DECLARE_OPTION_SPEC(ForEachLineOptions, skipLines); +DECLARE_OPTION_SPEC(ForEachLineOptions, maxLines); +DECLARE_OPTION_SPEC(ForEachLineOptions, outputTrailingEmptyLine); +DECLARE_OPTION_SPEC(ForEachLineOptions, logger); +DECLARE_OPTION_SPEC(ForEachLineOptions, logInterval); +DECLARE_OPTION_SPEC(ForEachLineOptions, splitter); + +template +const inline ForEachLineOptions & apply_options(ForEachLineOptions & opts, Options&&... options) +{ + (void)std::initializer_list { (void(options.apply(opts)), 0)... }; + return opts; +} + +const inline ForEachLineOptions & apply_options(ForEachLineOptions & opts, ForEachLineOptions & real_opts) +{ + return real_opts; +} -struct ContentHandler; +} // namespace ForEachLine +} // namespace options + +using namespace ForEachLine; + +/*************************************************************************/ +/* LINE CONTINUATION FUNCTION */ +/*************************************************************************/ struct LineInfo { std::string_view line; @@ -67,6 +134,11 @@ struct LineContinuationFn: public ContinuationFn { : Base([fn = std::forward(fn)] (LineInfo line) { return fn(line.line.data(), line.line.size(), line.lineNumber); }) { } }; + +/*************************************************************************/ +/* BLOCK CONTINUATION FUNCTION */ +/*************************************************************************/ + struct LineBlockInfo { int64_t blockNumber = -1; int64_t startOffset = -1; @@ -79,14 +151,17 @@ struct BlockContinuationFn: public ContinuationFn { using Base = ContinuationFn; using Base::Base; -#if 1 // Constructor for a function template BlockContinuationFn(Callable && fn, decltype(fn(1,2,3)) * = 0) : Base([fn = std::move(fn)] (LineBlockInfo block) { return fn(block.blockNumber, block.lineNumber, block.numLinesInBlock); }) { } -#endif }; +#if 0 +/*************************************************************************/ +/* CHUNK CONTINUATION FUNCTION */ +/*************************************************************************/ + struct ChunkInfo { std::span data; int64_t chunkNumber = -1; @@ -98,6 +173,11 @@ struct ChunkContinuationFn: public ContinuationFn { using Base = ContinuationFn; using Base::Base; }; +#endif + +/*************************************************************************/ +/* FOR EACH LINE FUNCTIONS */ +/*************************************************************************/ /** Run the given lambda over every line read from the stream, with the work distributed over the given number of threads. @@ -110,10 +190,16 @@ struct ChunkContinuationFn: public ContinuationFn { size_t forEachLine(std::istream & stream, const LineContinuationFn & processLine, - std::shared_ptr logger, - int numThreads = 4, - bool ignoreStreamExceptions = false, - int64_t maxLines = -1); + const ForEachLineOptions & options); + +template +size_t forEachLine(std::istream & stream, + const LineContinuationFn & processLine, + Options&&... options) +{ + ForEachLineOptions opts; + return forEachLine(stream, processLine, ForEachLine::options::apply_options(opts, std::forward(options)...)); +} /** Run the given lambda over every line read from the file, with the @@ -139,12 +225,20 @@ forEachLine(std::istream & stream, bool forEachLineBlock(std::istream & stream, const LineContinuationFn & onLine, - int64_t maxLines = -1, - int maxParallelism = 8, const BlockContinuationFn & startBlock = nullptr, const BlockContinuationFn & endBlock = nullptr, - ssize_t blockSize = -1, - const BlockSplitter & splitter = newLineSplitter); + const ForEachLineOptions & options = ForEachLineOptions()); + +template +size_t forEachLineBlock(std::istream & stream, + const LineContinuationFn & onLine, + const BlockContinuationFn & startBlock = nullptr, + const BlockContinuationFn & endBlock = nullptr, + Options&&... options) +{ + ForEachLineOptions opts; + return forEachLineBlock(stream, onLine, startBlock, endBlock, ForEachLine::options::apply_options(opts, std::forward(options)...)); +} /** Run the given lambda over every line read from the file, with the work distributed over threads each of which receive one block. The @@ -162,15 +256,22 @@ bool forEachLineBlock(std::istream & stream, */ bool forEachLineBlock(std::shared_ptr content, - uint64_t startOffset, const LineContinuationFn & onLine, - int64_t maxLines = -1, - int maxParallelism = 8, const BlockContinuationFn & startBlock = nullptr, const BlockContinuationFn & endBlock = nullptr, - size_t blockSize = 20'000'000, - const BlockSplitter & splitter = newLineSplitter); - + const ForEachLineOptions & options = ForEachLineOptions()); + +template +size_t forEachLineBlock(std::shared_ptr content, + const LineContinuationFn & onLine, + const BlockContinuationFn & startBlock = nullptr, + const BlockContinuationFn & endBlock = nullptr, + Options&&... options) +{ + ForEachLineOptions opts; + return forEachLineBlock(content, onLine, startBlock, endBlock, ForEachLine::options::apply_options(opts, std::forward(options)...)); +} +#if 0 /** Run the given lambda over fixed size chunks read from the stream, in parallel as much as possible. If there is a smaller chunk at the end (EOF is obtained), then the smaller chunk will be returned by itself. @@ -186,5 +287,5 @@ void forEachChunk(std::istream & stream, size_t chunkLength, int64_t maxChunks, int maxParallelism); - +#endif } // namespace MLDB diff --git a/utils/is_callable_with.h b/utils/is_callable_with.h new file mode 100644 index 000000000..11b829d53 --- /dev/null +++ b/utils/is_callable_with.h @@ -0,0 +1,27 @@ +/** is_callable_with.h -*- C++ -*- + Jeremy Barnes, 29 November 2013 + Copyright (c) 2013 mldb.ai inc. All rights reserved. + + This file is part of MLDB. Copyright 2015 mldb.ai inc. All rights reserved. + + Class to process each line in a file in parallel. +*/ + +#pragma once + +#include + +namespace MLDB { + +template +struct is_callable_with { + template static auto test(int) -> decltype(std::declval()(std::declval()...), std::true_type()); + template static auto test(...) -> std::false_type; + using type = decltype(test(0)); + static constexpr bool value = type::value; +}; + +template constexpr bool is_callable_with_v = is_callable_with::value; +template using is_callable_with_t = is_callable_with::type; + +} // namespace MLDB \ No newline at end of file diff --git a/utils/testing/coalesced_range_test.cc b/utils/testing/coalesced_range_test.cc index a1b9fd1b5..a0f44ac24 100644 --- a/utils/testing/coalesced_range_test.cc +++ b/utils/testing/coalesced_range_test.cc @@ -214,4 +214,48 @@ TEST_CASE("coalesced range get_span") SECTION("backwards range") { CHECK_THROWS(range.get_span(range.end(), range.begin())); } +} + +TEST_CASE("iterators") +{ + CoalescedRange range; + range.add(span("hello, world!", 13)); + + SECTION("at begin") { + auto it = range.begin(); + CHECK_THROWS(it[-1]); + CHECK(it[0] == 'h'); + CHECK(it[1] == 'e'); + CHECK(it[2] == 'l'); + CHECK(it[12] == '!'); + CHECK_THROWS(it[13]); + } + + SECTION("at end") { + auto it = range.end(); + CHECK_THROWS(it[0]); + CHECK(it[-1] == '!'); + CHECK(it[-13] == 'h'); + CHECK_THROWS(it[-14]); + } + + range.add(span("\n", 1)); + + SECTION("at begin with newline") { + auto it = range.begin(); + CHECK_THROWS(it[-1]); + CHECK(it[0] == 'h'); + CHECK(it[1] == 'e'); + CHECK(it[2] == 'l'); + CHECK(it[13] == '\n'); + CHECK_THROWS(it[14]); + } + + SECTION("at end with newline") { + auto it = range.end(); + CHECK_THROWS(it[0]); + CHECK(it[-14] == 'h'); + CHECK(it[-1] == '\n'); + CHECK(it[-2] == '!'); + } } \ No newline at end of file diff --git a/utils/testing/for_each_line_test.cc b/utils/testing/for_each_line_test.cc index 1fdd68df9..31d96342c 100644 --- a/utils/testing/for_each_line_test.cc +++ b/utils/testing/for_each_line_test.cc @@ -23,7 +23,7 @@ using namespace std; using namespace std::placeholders; using namespace MLDB; - +namespace o = ForEachLine::options; namespace { @@ -106,8 +106,8 @@ void testForEachLineBlock(const std::string & data, return true; }; - forEachLineBlock(content, startOffset, onLine, maxLines, maxParallelism, - onStartBlock, onEndBlock, blockSize); + forEachLineBlock(content, onLine, onStartBlock, onEndBlock, + o::maxParallelism=maxParallelism, o::defaultBlockSize=blockSize, o::startOffset=startOffset, o::maxLines=maxLines); CHECK(numLines == splitLines.size()); if (maxLines == -1) @@ -158,7 +158,7 @@ vector dataStrings{"line1", "line2", "", "line forty 2"}; } -TEST_CASE(" test_forEachLine_data ") +TEST_CASE("test_forEachLine_data trailing newline") { vector expected(dataStrings); expected.emplace_back(""); @@ -174,20 +174,19 @@ TEST_CASE(" test_forEachLine_data ") result.emplace_back(data, dataSize); }; - auto logger = getMldbLog("test"); - forEachLine(stream, processLine, logger); + forEachLine(stream, processLine, o::outputTrailingEmptyLine=true); CHECK(result == expected); } -TEST_CASE(" test_forEachLineStr_data ") +TEST_CASE("test_forEachLine_data no trailing newline") { vector expected(dataStrings); - expected.emplace_back(""); string data; for (const auto & line: dataStrings) { data += line + "\n"; } + data.pop_back(); istringstream stream(data); vector result; @@ -195,12 +194,11 @@ TEST_CASE(" test_forEachLineStr_data ") result.emplace_back(data); }; - auto logger = getMldbLog("test"); - forEachLine(stream, processLine, logger); + forEachLine(stream, processLine); CHECK(result == expected); } -TEST_CASE(" test_forEachLine_throw ") +TEST_CASE("test_forEachLine_throw") { string data; for (int i = 0; i < 1000; i++) { @@ -216,76 +214,7 @@ TEST_CASE(" test_forEachLine_throw ") } }; - auto logger = getMldbLog("test"); - CHECK_THROWS(forEachLine(stream, processLine, logger)); -} - -TEST_CASE("split newlines") -{ - return; - const auto & splitter = newLineSplitter; - - for (auto filename: { "file://mldb/testing/MLDB-1043-bucketize-data.csv"}) { - filter_istream stream(filename); - - std::vector lines; - std::string withNewLines; - std::string withDosNewLines; - - while (stream) { - std::string line; - std::getline(stream, line); - lines.push_back(line); - withNewLines += line + "\n"; - withDosNewLines += line + "\r\n"; - } - - // Make sure the block padding is respected - withNewLines.reserve(withNewLines.size() + splitter.requiredBlockPadding()); - withDosNewLines.reserve(withDosNewLines.size() + splitter.requiredBlockPadding()); - - auto testSplitter = [&] (size_t blockSize, const char * data, const char * end) - { - int lineNum = 0; - auto checkLine = [&] (const std::string & line) - { - CHECK(line == lines[lineNum]); - ++lineNum; - }; - - const char * p = data; - - auto currentState = splitter.newState(); - TextBlock block; - - for (; p < end; p += blockSize) { - // Add a new block - block.add(p, std::min(p + blockSize, end)); - bool isLastBlock = p + blockSize == end; - - auto splitter_res = splitter.nextRecord(block, block.begin(), isLastBlock, currentState); - if (!splitter_res) continue; // No newline, we need a new block - auto [newline_pos, newState] = splitter_res.value(); - currentState = std::move(newState); - CHECK(*newline_pos == '\n'); - std::string line = block.to_string(block.begin(), newline_pos); - block.reduce(newline_pos + 1, block.end()); - - checkLine(line); - } - }; - - for (auto blockSize: { 1, 5, 8, 11, 17, 231, 1024 }) { - SECTION("blockSize " + std::to_string(blockSize)) { - SECTION("Unix line endings") { - testSplitter(blockSize, withNewLines.c_str(), withNewLines.c_str() + withNewLines.size()); - } - SECTION("DOS line endings") { - testSplitter(blockSize, withDosNewLines.c_str(), withDosNewLines.c_str() + withDosNewLines.size()); - } - } - } - } + CHECK_THROWS(forEachLine(stream, processLine)); } struct ForEachLineTester { @@ -375,11 +304,9 @@ struct ForEachLineTester { forEachLineBlock(stream, std::bind(&ForEachLineTester::processLine, this, _1, _2, _3, _4), - maxLines, maxParallelism, std::bind(&ForEachLineTester::startBlock, this, _1, _2, _3), std::bind(&ForEachLineTester::endBlock, this, _1, _2, _3), - blockSize, - *splitter); + o::maxParallelism=maxParallelism, o::defaultBlockSize=blockSize, o::maxLines=maxLines, o::splitter=splitter.get()); this->maxLines = maxLines; } @@ -391,11 +318,9 @@ struct ForEachLineTester { forEachLineBlock(stream, std::bind(&ForEachLineTester::processLine, this, _1, _2, _3, _4), - maxLines, maxParallelism, std::bind(&ForEachLineTester::startBlock, this, _1, _2, _3), std::bind(&ForEachLineTester::endBlock, this, _1, _2, _3), - blockSize, - *splitter); + o::maxParallelism=maxParallelism, o::defaultBlockSize=blockSize, o::maxLines=maxLines, o::splitter=splitter.get()); this->maxLines = maxLines; } @@ -408,10 +333,7 @@ struct ForEachLineTester { forEachLine(stream, std::bind(&ForEachLineTester::processLine, this, _1, _2, 0, _3), - getMldbLog("test"), - maxParallelism, - false /* ignore exceptions */, - maxLines); + o::maxParallelism=maxParallelism, o::maxLines=maxLines, o::splitter=splitter.get()); this->maxLines = maxLines; } @@ -423,13 +345,10 @@ struct ForEachLineTester { auto content = getContent(descriptor); forEachLineBlock(content, - 0 /* startOffset */, std::bind(&ForEachLineTester::processLine, this, _1, _2, _3, _4), - maxLines, maxParallelism, std::bind(&ForEachLineTester::startBlock, this, _1, _2, _3), std::bind(&ForEachLineTester::endBlock, this, _1, _2, _3), - blockSize, - *splitter); + o::maxParallelism=maxParallelism, o::defaultBlockSize=blockSize, o::maxLines=maxLines, o::splitter=splitter.get()); this->maxLines = maxLines; } diff --git a/utils/testing/newline_splitter_test.cc b/utils/testing/newline_splitter_test.cc new file mode 100644 index 000000000..7aa315f91 --- /dev/null +++ b/utils/testing/newline_splitter_test.cc @@ -0,0 +1,82 @@ +/* for_each_line_test.cc + Wolfgang Sourdeau, 28 August 2014 + Copyright (c) 2014 mldb.ai inc. All rights reserved. + This file is part of MLDB. Copyright 2015 mldb.ai inc. All rights reserved. + + Test for_each_line +*/ + +#include "mldb/utils/testing/mldb_catch2.h" +#include "mldb/utils/block_splitter.h" +#include "mldb/vfs/filter_streams.h" +#include "mldb/utils/coalesced_range.h" + +using namespace std; +using namespace MLDB; + +TEST_CASE("split newlines") +{ + const auto & splitter = newLineSplitter; + + for (auto filename: { "file://mldb/testing/MLDB-1043-bucketize-data.csv"}) { + filter_istream stream(filename); + + std::vector lines; + std::string withNewLines; + std::string withDosNewLines; + + while (stream) { + std::string line; + std::getline(stream, line); + lines.push_back(line); + withNewLines += line + "\n"; + withDosNewLines += line + "\r\n"; + } + + // Make sure the block padding is respected + withNewLines.reserve(withNewLines.size() + splitter.requiredBlockPadding()); + withDosNewLines.reserve(withDosNewLines.size() + splitter.requiredBlockPadding()); + + auto testSplitter = [&] (size_t blockSize, const char * data, const char * end) + { + int lineNum = 0; + auto checkLine = [&] (const std::string & line) + { + CHECK(line == lines[lineNum]); + ++lineNum; + }; + + const char * p = data; + + auto currentState = splitter.newState(); + TextBlock block; + + for (; p < end; p += blockSize) { + // Add a new block + block.add(p, std::min(p + blockSize, end)); + bool isLastBlock = p + blockSize == end; + + auto [found_split, skip_to_end, skip_separator, newState] = splitter.nextRecord(block, block.begin(), isLastBlock, currentState); + if (!found_split) continue; // No newline, we need a new block + currentState = std::move(newState); + auto newline_pos = block.begin() + skip_to_end; + CHECK(newline_pos[skip_separator-1] == '\n'); + std::string line = block.to_string(block.begin(), newline_pos); + block.reduce(newline_pos + skip_separator, block.end()); + + checkLine(line); + } + }; + + for (auto blockSize: { 1, 5, 8, 11, 17, 231, 1024 }) { + SECTION("blockSize " + std::to_string(blockSize)) { + SECTION("Unix line endings") { + testSplitter(blockSize, withNewLines.c_str(), withNewLines.c_str() + withNewLines.size()); + } + SECTION("DOS line endings") { + testSplitter(blockSize, withDosNewLines.c_str(), withDosNewLines.c_str() + withDosNewLines.size()); + } + } + } + } +} diff --git a/utils/testing/testing.mk b/utils/testing/testing.mk index 0960a365a..eaddf9282 100644 --- a/utils/testing/testing.mk +++ b/utils/testing/testing.mk @@ -41,3 +41,4 @@ $(eval $(call test,lexical_cast_test,arch types value_description,catch2)) $(eval $(call test,safe_clamp_test,utils log arch,catch2)) $(eval $(call test,scoreboard_test,utils log arch,catch2)) $(eval $(call test,coalesced_range_test,arch,catch2)) +$(eval $(call test,newline_splitter_test,arch utils,catch2)) From df516a1ad6622dd715bbdd36cc98cb4fdb71e375 Mon Sep 17 00:00:00 2001 From: Jeremy Barnes Date: Mon, 3 Feb 2025 19:43:55 -0500 Subject: [PATCH 36/39] TODO: fix this bug: make for_each_line_test SANITIZERS=address --- utils/for_each_line.cc | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/utils/for_each_line.cc b/utils/for_each_line.cc index 8367b60a8..4262e4d5e 100644 --- a/utils/for_each_line.cc +++ b/utils/for_each_line.cc @@ -217,7 +217,9 @@ struct ForEachLineProcessor: public ComputeContext { // TODO: if the list of chunks is too big, start slowing down the chunk producers by making them // contribute to work - //work(); + // TODO: uncommenting this and running with ASAN uncovers a bug in the ThreadPool whereby one + // thread trying to steal work from another has its data freed. We should deal with that bug! + work(); return !relaxed_stopped() && !chunks_out_finished_; From d1d7cf80289bedb9d7d7f26d80d6d394706ed55d Mon Sep 17 00:00:00 2001 From: Jeremy Barnes Date: Mon, 3 Feb 2025 19:45:40 -0500 Subject: [PATCH 37/39] Undo ThreadPool ASAN bug trigger --- utils/for_each_line.cc | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/utils/for_each_line.cc b/utils/for_each_line.cc index 4262e4d5e..9b3bcf307 100644 --- a/utils/for_each_line.cc +++ b/utils/for_each_line.cc @@ -219,7 +219,8 @@ struct ForEachLineProcessor: public ComputeContext { // TODO: uncommenting this and running with ASAN uncovers a bug in the ThreadPool whereby one // thread trying to steal work from another has its data freed. We should deal with that bug! - work(); + // nice make -j16 -k SANITIZERS=address for_each_line_test + //work(); return !relaxed_stopped() && !chunks_out_finished_; From fbf23abe50163bd6821d3469e74b43a87cf92135 Mon Sep 17 00:00:00 2001 From: Jeremy Barnes Date: Tue, 4 Feb 2025 09:41:48 -0500 Subject: [PATCH 38/39] SQUASH for_each_line (14) --- plugins/textual/importtext_procedure.cc | 26 ++-- utils/coalesced_range.h | 8 ++ utils/for_each_line.cc | 160 +++++++++++++++++++----- utils/for_each_line.h | 11 +- utils/testing/coalesced_range_test.cc | 15 +++ utils/testing/for_each_line_test.cc | 80 ++++++------ 6 files changed, 221 insertions(+), 79 deletions(-) diff --git a/plugins/textual/importtext_procedure.cc b/plugins/textual/importtext_procedure.cc index 6fe1e84d8..4bebb4ff1 100644 --- a/plugins/textual/importtext_procedure.cc +++ b/plugins/textual/importtext_procedure.cc @@ -1038,11 +1038,13 @@ struct ImportTextProcedureWorkInstance atomic lineCount(0); atomic byteCount(0); - auto onLine = [&] (const char * line, - size_t length, - int chunkNum, - int64_t lineNum) + + auto onLine = [&] (LineInfo lineInfo) { + auto lineNum = lineInfo.lineNumber; + const char * line = lineInfo.line.data(); + size_t length = lineInfo.line.size(); + try { auto & threadAccum = accum.get(); @@ -1083,9 +1085,11 @@ struct ImportTextProcedureWorkInstance return true; } - // MLDB-1111 empty lines are treated as error - if (length == 0) + // MLDB-1111 empty lines are treated as error, unless they are + // at the end of the file + if (length == 0) { return handleError("empty line", actualLineNum, 0, ""); + } // Values that come in from the CSV file @@ -1314,7 +1318,7 @@ struct ImportTextProcedureWorkInstance if(!config.allowMultiLines) { namespace o = ForEachLine::options; - forEachLineBlock(stream, onLine, startChunk, doneChunk, o::maxLines = config.limit); + forEachLineBlock(stream, onLine, startChunk, doneChunk, o::maxLines=config.limit, o::outputTrailingEmptyLine=false); } else { // very simplistic and not efficient way of doing multi-line. we send @@ -1336,8 +1340,12 @@ struct ImportTextProcedureWorkInstance line += ' ' + t_line; } - if(!onLine(line.c_str(), line.size(), - 0 /* chunkNum */, lineNum)) { + LineInfo lineInfo { + .line = line, + .lineNumber = lineNum, + .lastLine = false, + }; + if(!onLine(lineInfo)) { prevLine.assign(std::move(line)); } else { prevLine.erase(); diff --git a/utils/coalesced_range.h b/utils/coalesced_range.h index 3622ec981..900db3cfb 100644 --- a/utils/coalesced_range.h +++ b/utils/coalesced_range.h @@ -317,6 +317,14 @@ struct CoalescedRange { return range_type(first, last - first); } + std::optional>> get_string_view(const_iterator begin, const_iterator end) const + { + auto span = get_span(begin, end); + if (!span) + return std::nullopt; + return std::basic_string_view>(span->data(), span->size()); + } + iterator find(const value_type & what) { return find(begin(), end(), what); } const_iterator find(const value_type & what) const { return find(begin(), end(), what); } diff --git a/utils/for_each_line.cc b/utils/for_each_line.cc index 9b3bcf307..6bf8a14ff 100644 --- a/utils/for_each_line.cc +++ b/utils/for_each_line.cc @@ -104,13 +104,13 @@ struct ForEachLineProcessor: public ComputeContext { size_t blockSize = options.defaultBlockSize == -1 ? 2'000'000 : options.defaultBlockSize; if (options.startOffset > 0) stream.seekg(options.startOffset); - std::shared_ptr block(new std::byte[blockSize]); bool lastChunk = false; for (size_t chunkNumber = 0; stream; ++chunkNumber) { if (relaxed_stopped() || chunks_in_finished_ || chunks_out_finished_) return false; size_t chunkOffset = stream.tellg(); + std::shared_ptr block(new std::byte[blockSize]); stream.read(reinterpret_cast(block.get()), blockSize + extraCapacity); ssize_t bytesRead = stream.gcount(); if (bytesRead <= 0) @@ -259,8 +259,64 @@ struct ForEachLineProcessor: public ComputeContext { size_t startOffset = 0; size_t endOffset = 0; bool lastBlock = false; - std::vector> lines; + size_t numLeadingEmptyLines = 0; + std::vector lines; std::vector> keep; + size_t numTrailingEmptyLines = 0; // only for the last block + size_t lineCount() const { return numLeadingEmptyLines + lines.size() + numTrailingEmptyLines; } + + void addLine(std::string_view line, std::shared_ptr keep = nullptr) + { + if (line.empty()) { + // Empty line, just accumulate it + ++numTrailingEmptyLines; + } + else { + // Add the empty line block we accumulated so far as it's no longer trailing + lines.resize(lines.size() + numTrailingEmptyLines); + numTrailingEmptyLines = 0; + lines.push_back(line); + } + if (keep) + this->keep.push_back(keep); + } + + // Truncate to the given number of lines + void truncate(size_t maxLines) + { + if (lineCount() <= maxLines) + return; + if (maxLines <= numLeadingEmptyLines) { + numLeadingEmptyLines = maxLines; + lines.clear(); + numTrailingEmptyLines = 0; + return; + } + maxLines -= numLeadingEmptyLines; + if (maxLines <= lines.size()) { + lines.resize(maxLines); + numTrailingEmptyLines = 0; + return; + } + maxLines -= lines.size(); + ExcAssertLessEqual(maxLines, numTrailingEmptyLines); + numTrailingEmptyLines -= maxLines; + } + + void pushEmptyLinesToTrailing() + { + if (lines.empty()) { + numTrailingEmptyLines += numLeadingEmptyLines; + numLeadingEmptyLines = 0; + } + } + + void removeTrailingEmptyLines() + { + numTrailingEmptyLines = 0; + if (lines.empty()) + numLeadingEmptyLines = 0; + } }; // Information passed from one chunk to the next @@ -270,6 +326,7 @@ struct ForEachLineProcessor: public ComputeContext { CoalescedRange chunkData; std::any splitterState; std::vector> keep; // pins for each block in chunkData + size_t numTrailingEmptyLines = 0; // Handle the next chunk, which will be done in-order and one at a time. This should do the // smallest amount of work possible, submitting any further processing as a job to be @@ -290,14 +347,15 @@ struct ForEachLineProcessor: public ComputeContext { if (chunkData.add(reinterpret_cast(chunk.data.data()), chunk.data.size())) keep.emplace_back(chunk.keep); - LineBlock lineBlock; - lineBlock.keep = keep; - lineBlock.blockNumber = outputChunkNumber; - lineBlock.startLine = outputLineNumber; - lineBlock.startOffset = outputStartOffset; - lineBlock.lastBlock = chunk.lastChunk; - auto & lines = lineBlock.lines; + LineBlock lineBlock { + .blockNumber = outputChunkNumber, + .startLine = outputLineNumber, + .startOffset = outputStartOffset, + .lastBlock = chunk.lastChunk, + .numLeadingEmptyLines = numTrailingEmptyLines, + .keep = keep, + }; auto it = chunkData.begin(), end = chunkData.end(); bool trailingSeparator = false; @@ -309,9 +367,9 @@ struct ForEachLineProcessor: public ComputeContext { break; auto next_it = it + skip_to_end; - if (auto lineSpan = chunkData.get_span(it, next_it)) { + if (auto lineView = chunkData.get_string_view(it, next_it)) { // Push the contiguous line - lines.push_back(std::move(lineSpan.value())); + lineBlock.addLine(lineView.value()); } else { // Line is not in a contiguous range; need to extract as a string @@ -319,26 +377,45 @@ struct ForEachLineProcessor: public ComputeContext { std::shared_ptr contiguous(new char[len]); using std::copy; copy(it, next_it, contiguous.get()); - lineBlock.lines.emplace_back(contiguous.get(), len); - lineBlock.keep.emplace_back(std::move(contiguous)); + std::string_view line(contiguous.get(), len); + lineBlock.addLine(line, std::move(contiguous)); } + splitterState = std::move(next_state); it = next_it + skip_separator; trailingSeparator = skip_separator > 0; } - if (options.outputTrailingEmptyLine && trailingSeparator && chunk.lastChunk) { - // We have a trailing separator at the end of the last chunk - // We need to add an empty line - lines.push_back({}); + // If there is a trailing separator and this is the last block, we need to add an empty + // line. + if (trailingSeparator && chunk.lastChunk) { + lineBlock.addLine({}); } - size_t lineCount = lines.size(); + // The output block consists of: + // - numLeadingEmptyLines empty lines from the previous block + // - lines.size() lines from this block + // - numTrailingEmptyLines empty lines from this block + // + // We output the first and the second in this block; the rest are the responsibility of + // the next block (unless this is the last block). + + lineBlock.pushEmptyLinesToTrailing(); + + if (chunk.lastChunk && !options.outputTrailingEmptyLines) { + lineBlock.removeTrailingEmptyLines(); + } - if (options.maxLines != -1 && lineCount + outputLineNumber >= options.maxLines) { + if (options.maxLines != -1 && outputLineNumber + lineBlock.lineCount() >= options.maxLines) { // We've reached the maximum number of lines - lines.resize(options.maxLines - outputLineNumber); + lineBlock.truncate(options.maxLines - outputLineNumber); lineBlock.lastBlock = true; + numTrailingEmptyLines = 0; + } + else if (!chunk.lastChunk) { + // The next block deals with trailing empty lines + numTrailingEmptyLines = lineBlock.numTrailingEmptyLines; + lineBlock.numTrailingEmptyLines = 0; } // Reduce the chunk data to the leftover parts and remove the associated @@ -350,8 +427,11 @@ struct ForEachLineProcessor: public ComputeContext { keep.erase(keep.begin(), keep.begin() + firstChunk); ExcAssertEqual(keep.size(), chunkData.range_count()); + outputLineNumber += lineBlock.lineCount(); + outputStartOffset = chunk.startOffset + chunk.data.size(); + + if (lineBlock.lineCount() > 0) { - if (lineCount > 0) { // Submit the line block for processing before we schedule another chunk so // we don't get ahead of ourselves. int priority = 1; @@ -377,9 +457,6 @@ struct ForEachLineProcessor: public ComputeContext { } ++outputChunkNumber; } - outputLineNumber += lineCount; - outputStartOffset = chunk.startOffset + chunk.data.size(); - } std::function handle_line_block; @@ -406,7 +483,8 @@ struct ForEachLineProcessor: public ComputeContext { if (startBlock && !startBlock(blockInfo)) return false; - for (size_t i = 0; i < block.lines.size(); ++i) { + auto outputLine = [&] (std::string_view line, int64_t lineNumber, int64_t blockNumber, bool lastLine) + { if (options.logger) { auto new_done = done.fetch_add(1) + 1; @@ -425,15 +503,35 @@ struct ForEachLineProcessor: public ComputeContext { } } - LineInfo lineInfo { - .line = { block.lines[i].data(), block.lines[i].size() }, - .lineNumber = static_cast(block.startLine + i), - .blockNumber = static_cast(block.blockNumber), - .lastLine = block.lastBlock && i == block.lines.size() - 1, - }; + LineInfo lineInfo { line, lineNumber, blockNumber, lastLine }; if (onLine && !onLine(lineInfo)) return false; + + return true; + }; + + size_t l = 0; + + // Leading empty lines + for (size_t i = 0; i < block.numLeadingEmptyLines; ++i, ++l) { + bool lastLine = block.lastBlock && i == block.numLeadingEmptyLines - 1 && block.lines.empty() && block.numTrailingEmptyLines == 0; + if (!outputLine({}, block.startLine + l, block.blockNumber, lastLine)) + return false; + } + + // Block lines + for (size_t i = 0; i < block.lines.size(); ++i, ++l) { + bool lastLine = i == block.lines.size() - 1 && block.lastBlock && block.numTrailingEmptyLines == 0; + if (!outputLine(block.lines[i], block.startLine + l, block.blockNumber, lastLine)) + return false; + } + + // Trailing empty lines + for (size_t i = 0; i < block.numTrailingEmptyLines; ++i, ++l) { + bool lastLine = block.lastBlock && i == block.numTrailingEmptyLines - 1; + if (!outputLine({}, block.startLine + l, block.blockNumber, lastLine)) + return false; } if (endBlock && !endBlock(blockInfo)) diff --git a/utils/for_each_line.h b/utils/for_each_line.h index 160042f9f..14e781b16 100644 --- a/utils/for_each_line.h +++ b/utils/for_each_line.h @@ -39,7 +39,7 @@ struct ForEachLineOptions { size_t startOffset = 0; // How much of the file to skip at the beginning size_t skipLines = 0; // How many lines to skip at the beginning ssize_t maxLines = -1; // Maximum number of lines to process - bool outputTrailingEmptyLine = false; // Whether to output a trailing empty line if the file ends with a newline + bool outputTrailingEmptyLines = false; // Whether to output trailing empty lines if the file ends with blank lines std::shared_ptr logger = nullptr; // Logger to use for logging size_t logInterval = 1000000; // How often to log a progress message to the logger (every n lines) const BlockSplitter * splitter = &newLineSplitter; // Block splitter to split into lines @@ -78,7 +78,7 @@ DECLARE_OPTION_SPEC(ForEachLineOptions, defaultBlockSize); DECLARE_OPTION_SPEC(ForEachLineOptions, startOffset); DECLARE_OPTION_SPEC(ForEachLineOptions, skipLines); DECLARE_OPTION_SPEC(ForEachLineOptions, maxLines); -DECLARE_OPTION_SPEC(ForEachLineOptions, outputTrailingEmptyLine); +DECLARE_OPTION_SPEC(ForEachLineOptions, outputTrailingEmptyLines); DECLARE_OPTION_SPEC(ForEachLineOptions, logger); DECLARE_OPTION_SPEC(ForEachLineOptions, logInterval); DECLARE_OPTION_SPEC(ForEachLineOptions, splitter); @@ -114,8 +114,11 @@ struct LineInfo { struct LineContinuationFn: public ContinuationFn { using Base = ContinuationFn; - //template LineContinuationFn(Args&&... args, std::enable_if_t> * = 0): Base(std::forward(args)...) {} - using Base::Base; + + // Forward the base constructor + template + LineContinuationFn(Callable&& fn, std::enable_if_t> * = 0) + : Base(std::forward(fn)) {} // Constructor for a function template diff --git a/utils/testing/coalesced_range_test.cc b/utils/testing/coalesced_range_test.cc index a0f44ac24..12af733fc 100644 --- a/utils/testing/coalesced_range_test.cc +++ b/utils/testing/coalesced_range_test.cc @@ -258,4 +258,19 @@ TEST_CASE("iterators") CHECK(it[-1] == '\n'); CHECK(it[-2] == '!'); } +} + +TEST_CASE("one character ranges") +{ + std::string s = "hello, world!"; + std::string data; + for (char c: s) { data.push_back(c); data.push_back(0); } + + CoalescedRange range; + for (size_t i = 0; i < s.size(); ++i) { + range.add(span(data.data() + 2 * i, 1)); + } + + CHECK(range.size() == s.size()); + CHECK(range.to_string() == s); } \ No newline at end of file diff --git a/utils/testing/for_each_line_test.cc b/utils/testing/for_each_line_test.cc index 31d96342c..2d77ee01f 100644 --- a/utils/testing/for_each_line_test.cc +++ b/utils/testing/for_each_line_test.cc @@ -30,8 +30,9 @@ namespace { void testForEachLineBlock(const std::string & data, size_t blockSize, size_t startOffset, - int64_t maxLines = -1, - int maxParallelism = 1) + int64_t maxLines, + int maxParallelism, + bool outputTrailingEmptyLines) { std::vector splitLines = split(string(data, startOffset), '\n'); for (auto & l: splitLines) { @@ -40,7 +41,7 @@ void testForEachLineBlock(const std::string & data, } } - if (!data.empty() && data.back() == '\n' && !splitLines.empty()) + while (!outputTrailingEmptyLines && !splitLines.empty() && splitLines.back().empty()) splitLines.pop_back(); if (maxLines >= 0 && maxLines < splitLines.size()) { @@ -107,49 +108,57 @@ void testForEachLineBlock(const std::string & data, }; forEachLineBlock(content, onLine, onStartBlock, onEndBlock, - o::maxParallelism=maxParallelism, o::defaultBlockSize=blockSize, o::startOffset=startOffset, o::maxLines=maxLines); + o::maxParallelism=maxParallelism, + o::defaultBlockSize=blockSize, + o::startOffset=startOffset, + o::maxLines=maxLines, + o::outputTrailingEmptyLines=outputTrailingEmptyLines); CHECK(numLines == splitLines.size()); if (maxLines == -1) CHECK(numLinesInBlockTotal == numLines); CHECK(numBlocksStarted == numBlocksFinished); - - //cerr << "did " << numBlocksStarted << " blocks" << endl; } TEST_CASE("test_forEachLineBlock") { - for (auto parallelism: { 0 , 1, -1 }) { - SECTION("parallelism " + std::to_string(parallelism)) { + for (auto empty: { false, true }) { + SECTION("output empty " + std::to_string(empty)) { + for (auto parallelism: { 0 /*, 1, -1*/ }) { + SECTION("parallelism " + std::to_string(parallelism)) { // blkSz startOfs maxLns empty parallelism #if 1 - SECTION("test 1") { testForEachLineBlock("", 1 /* blockSize */, 0 /* startOffset */, -1, parallelism); } - SECTION("test 2") { testForEachLineBlock("\n", 1 /* blockSize */, 0 /* startOffset */, -1, parallelism); } - SECTION("test 3") { testForEachLineBlock("\n", 1 /* blockSize */, 1 /* startOffset */, -1, parallelism); } + SECTION("test 01") { testForEachLineBlock("", 1, 0, -1, empty, parallelism); } + SECTION("test 02") { testForEachLineBlock("\n", 1, 0, -1, empty, parallelism); } + SECTION("test 03") { testForEachLineBlock("\n", 1, 1, -1, empty, parallelism); } + SECTION("test 04") { testForEachLineBlock(" ", 1, 0, -1, empty, parallelism); } + SECTION("test 05") { testForEachLineBlock("\n\n\n\n\n\n\n\n\n\n", 1, 0, -1, empty, parallelism); } + SECTION("test 06") { testForEachLineBlock("\n\n\n\n\n\n\n\n\n\n", 100, 0, -1, empty, parallelism); } + SECTION("test 07") { testForEachLineBlock("\n\n\n\n\n\n\n\n\n\n", 100, 10, -1, empty, parallelism); } + SECTION("test 08") { testForEachLineBlock("\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n", 1, 10, -1, empty, parallelism); } + SECTION("test 09") { testForEachLineBlock("\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n", 2, 0, -1, empty, parallelism); } + SECTION("test 10") { testForEachLineBlock("\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n", 2, 1, -1, empty, parallelism); } + SECTION("test 11") { testForEachLineBlock("a\nab\nabc\nabcd\nabcde\nabcd\nabc\nab\na\n\n", 100, 0, -1, empty, parallelism); } + SECTION("test 12") { testForEachLineBlock("a\nab\nabc\nabcd\nabcde\nabcd\nabc\nab\na\n\n", 1, 0, -1, empty, parallelism); } + SECTION("test 13") { testForEachLineBlock("a\nab\nabc\nabcd\nabcde\nabcd\nabc\nab\na\n\n", 2, 0, -1, empty, parallelism); } + SECTION("test 14") { testForEachLineBlock("a\nab\nabc\nabcd\nabcde\nabcd\nabc\nab\na\n\n", 5, 0, -1, empty, parallelism); } + SECTION("test 15") { testForEachLineBlock("", 1, 0, 0, empty, parallelism); } + SECTION("test 16") { testForEachLineBlock("\n", 1, 0, 0, empty, parallelism); } #endif - SECTION("test 4") { testForEachLineBlock(" ", 1 /* blockSize */, 0 /* startOffset */, -1, parallelism); } + SECTION("test 17") { testForEachLineBlock("\n", 1, 0, 1, empty, parallelism); } + SECTION("test 18") { testForEachLineBlock("\n", 1, 0, 2, empty, parallelism); } #if 1 - SECTION("test 5") { testForEachLineBlock("\n\n\n\n\n\n\n\n\n\n", 1 /* blockSize */, 0 /* startOffset */, -1, parallelism); } - SECTION("test 6") { testForEachLineBlock("\n\n\n\n\n\n\n\n\n\n", 100 /* blockSize */, 0 /* startOffset */, -1, parallelism); } - SECTION("test 7") { testForEachLineBlock("\n\n\n\n\n\n\n\n\n\n", 100 /* blockSize */, 10 /* startOffset */, -1, parallelism); } - SECTION("test 8") { testForEachLineBlock("\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n", 1 /* blockSize */, 10 /* startOffset */, -1, parallelism); } - SECTION("test 9") { testForEachLineBlock("\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n", 2 /* blockSize */, 0 /* startOffset */, -1, parallelism); } - SECTION("test 10") { testForEachLineBlock("\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n", 2 /* blockSize */, 1 /* startOffset */, -1, parallelism); } - SECTION("test 11") { testForEachLineBlock("a\nab\nabc\nabcd\nabcde\nabcd\nabc\nab\na\n\n", 100 /* blockSize */, 0 /* startOffset */, -1, parallelism); } - SECTION("test 12") { testForEachLineBlock("a\nab\nabc\nabcd\nabcde\nabcd\nabc\nab\na\n\n", 1 /* blockSize */, 0 /* startOffset */, -1, parallelism); } - SECTION("test 13") { testForEachLineBlock("a\nab\nabc\nabcd\nabcde\nabcd\nabc\nab\na\n\n", 2 /* blockSize */, 0 /* startOffset */, -1, parallelism); } - SECTION("test 14") { testForEachLineBlock("a\nab\nabc\nabcd\nabcde\nabcd\nabc\nab\na\n\n", 5 /* blockSize */, 0 /* startOffset */, -1, parallelism); } - SECTION("test 15") { testForEachLineBlock("", 1 /* blockSize */, 0 /* startOffset */, 0 /* max lines */, parallelism); } - SECTION("test 16") { testForEachLineBlock("\n", 1 /* blockSize */, 0 /* startOffset */, 0 /* max lines */, parallelism); } - SECTION("test 17") { testForEachLineBlock("\n", 1 /* blockSize */, 0 /* startOffset */, 1 /* max lines */, parallelism); } - SECTION("test 18") { testForEachLineBlock("\n", 1 /* blockSize */, 0 /* startOffset */, 2 /* max lines */, parallelism); } - SECTION("test 19") { testForEachLineBlock("a\nb\nc\n", 1 /* blockSize */, 0 /* startOffset */, 0 /* max lines */, parallelism); } - SECTION("test 20") { testForEachLineBlock("a\nb\nc\n", 1 /* blockSize */, 0 /* startOffset */, 1 /* max lines */, parallelism); } - SECTION("test 21") { testForEachLineBlock("a\nb\nc\n", 1 /* blockSize */, 0 /* startOffset */, 2 /* max lines */, parallelism); } - SECTION("test 22") { testForEachLineBlock("a\nb\nc\n", 1 /* blockSize */, 0 /* startOffset */, 3 /* max lines */, parallelism); } - SECTION("test 23") { testForEachLineBlock("a\nb\nc\n", 1 /* blockSize */, 0 /* startOffset */, 4 /* max lines */, parallelism); } - SECTION("test 24") { testForEachLineBlock("a\r\nab\r\nabc\r\nabcd\r\nabcde\r\nabcd\r\nabc\r\nab\r\na\r\n\r\n", 5 /* blockSize */, 0 /* startOffset */, parallelism); } - SECTION("test 24") { testForEachLineBlock("a\r\nab\r\nabc\r\nabcd\r\nabcde\r\nabcd\r\nabc\r\nab\r\na\r\n\r\n", 5 /* blockSize */, 0 /* startOffset */, -1, parallelism); } + SECTION("test 19") { testForEachLineBlock("a\nb\nc\n", 1, 0, 0, empty, parallelism); } + SECTION("test 20") { testForEachLineBlock("a\nb\nc\n", 1, 0, 1, empty, parallelism); } + SECTION("test 21") { testForEachLineBlock("a\nb\nc\n", 1, 0, 2, empty, parallelism); } + SECTION("test 22") { testForEachLineBlock("a\nb\nc\n", 1, 0, 3, empty, parallelism); } + SECTION("test 23") { testForEachLineBlock("a\nb\nc\n", 1, 0, 4, empty, parallelism); } + SECTION("test 24") { testForEachLineBlock("a\r\nab\r\nabc\r\nabcd\r\nabcde\r\nabcd\r\nabc\r\nab\r\na\r\n\r\n", 5, 0, -1, empty, parallelism); } + SECTION("test 24") { testForEachLineBlock("a\r\nab\r\nabc\r\nabcd\r\nabcde\r\nabcd\r\nabc\r\nab\r\na\r\n\r\n", 5, 0, 0, empty, parallelism); } + SECTION("test 24") { testForEachLineBlock("a\r\nab\r\nabc\r\nabcd\r\nabcde\r\nabcd\r\nabc\r\nab\r\na\r\n\r\n", 5, 0, 1, empty, parallelism); } + SECTION("test 24") { testForEachLineBlock("a\r\nab\r\nabc\r\nabcd\r\nabcde\r\nabcd\r\nabc\r\nab\r\na\r\n\r\n", 5, 0, -1, empty, parallelism); } #endif + } + } } } } @@ -158,6 +167,7 @@ vector dataStrings{"line1", "line2", "", "line forty 2"}; } + TEST_CASE("test_forEachLine_data trailing newline") { vector expected(dataStrings); @@ -174,7 +184,7 @@ TEST_CASE("test_forEachLine_data trailing newline") result.emplace_back(data, dataSize); }; - forEachLine(stream, processLine, o::outputTrailingEmptyLine=true); + forEachLine(stream, processLine, o::outputTrailingEmptyLines=true); CHECK(result == expected); } @@ -194,7 +204,7 @@ TEST_CASE("test_forEachLine_data no trailing newline") result.emplace_back(data); }; - forEachLine(stream, processLine); + forEachLine(stream, processLine, o::outputTrailingEmptyLines=false); CHECK(result == expected); } From ec503c2f695168f72b45afa9b6698fd0214091a8 Mon Sep 17 00:00:00 2001 From: Jeremy Barnes Date: Tue, 4 Feb 2025 11:18:22 -0500 Subject: [PATCH 39/39] SQUASH for_each_line (15) --- plugins/textual/importtext_procedure.cc | 2 +- utils/coalesced_range.h | 2 ++ utils/for_each_line.cc | 40 +++++++++++++++++++++++-- utils/testing/for_each_line_test.cc | 4 +-- 4 files changed, 41 insertions(+), 7 deletions(-) diff --git a/plugins/textual/importtext_procedure.cc b/plugins/textual/importtext_procedure.cc index 4bebb4ff1..cb7204f6e 100644 --- a/plugins/textual/importtext_procedure.cc +++ b/plugins/textual/importtext_procedure.cc @@ -1318,7 +1318,7 @@ struct ImportTextProcedureWorkInstance if(!config.allowMultiLines) { namespace o = ForEachLine::options; - forEachLineBlock(stream, onLine, startChunk, doneChunk, o::maxLines=config.limit, o::outputTrailingEmptyLine=false); + forEachLineBlock(stream, onLine, startChunk, doneChunk, o::maxLines=config.limit, o::outputTrailingEmptyLines=false); } else { // very simplistic and not efficient way of doing multi-line. we send diff --git a/utils/coalesced_range.h b/utils/coalesced_range.h index 900db3cfb..80174bbed 100644 --- a/utils/coalesced_range.h +++ b/utils/coalesced_range.h @@ -203,6 +203,8 @@ struct CoalescedRange { const_iterator begin() const { return {&ranges_, 0, 0}; } const_iterator end() const { return {&ranges_, ranges_.size(), 0}; } + void clear() { ranges_.clear(); } + // Add something to the ranges. Invalidates iterators. // If it is empty, it will not be added. // If it is an extension of the previous range, then it will be extended. diff --git a/utils/for_each_line.cc b/utils/for_each_line.cc index 6bf8a14ff..10ff3aa12 100644 --- a/utils/for_each_line.cc +++ b/utils/for_each_line.cc @@ -327,6 +327,10 @@ struct ForEachLineProcessor: public ComputeContext { std::any splitterState; std::vector> keep; // pins for each block in chunkData size_t numTrailingEmptyLines = 0; + std::shared_ptr consolidated_; + size_t consolidated_size_ = 0; + size_t consolidated_capacity_ = 0; + size_t consolidated_allocate_ = 1024; // Handle the next chunk, which will be done in-order and one at a time. This should do the // smallest amount of work possible, submitting any further processing as a job to be @@ -344,8 +348,36 @@ struct ForEachLineProcessor: public ComputeContext { ExcAssertEqual(chunks_done_, chunk.chunkNumber); ExcAssertEqual(chunkData.range_count(), keep.size()); - if (chunkData.add(reinterpret_cast(chunk.data.data()), chunk.data.size())) - keep.emplace_back(chunk.keep); + // If our chunk size is much smaller than our line size, the algorithm becomes + // inefficient. We need to consolidate chunks until we have a reasonable size. + if (consolidated_ || chunkData.range_count() > 10) { + if (!consolidated_ || consolidated_size_ + chunk.data.size() > consolidated_capacity_) { + + // Doesn't fit. Make consolidated bigger + auto required_capacity = consolidated_size_ + chunk.data.size(); + if (required_capacity > consolidated_allocate_) + consolidated_allocate_ = std::max(required_capacity, consolidated_allocate_ * 2); + std::shared_ptr new_consolidated(new char[consolidated_allocate_]); + std::copy(consolidated_.get(), consolidated_.get() + consolidated_size_, new_consolidated.get()); + consolidated_ = new_consolidated; + consolidated_capacity_ = consolidated_allocate_; + chunkData.clear(); + chunkData.add(consolidated_.get(), consolidated_size_); + keep = { consolidated_ }; + } + + // This new chunk fits in the already-allocated capacity + char * first = consolidated_.get() + consolidated_size_; + std::copy((const char *)chunk.data.data(), (const char *)chunk.data.data() + chunk.data.size(), first); + consolidated_size_ += chunk.data.size(); + chunkData.add({first, chunk.data.size()}); + ExcAssertEqual(chunkData.range_count(), 1); + } + else { + // Add this chunk + if (chunkData.add(reinterpret_cast(chunk.data.data()), chunk.data.size())) + keep.emplace_back(chunk.keep); + } LineBlock lineBlock { @@ -456,6 +488,8 @@ struct ForEachLineProcessor: public ComputeContext { } } ++outputChunkNumber; + consolidated_ = nullptr; + consolidated_size_ = 0; } } @@ -476,7 +510,7 @@ struct ForEachLineProcessor: public ComputeContext { .blockNumber = static_cast(block.blockNumber), .startOffset = static_cast(block.startOffset), .lineNumber = static_cast(block.startLine), - .numLinesInBlock = static_cast(block.lines.size()), + .numLinesInBlock = static_cast(block.lineCount()), .lastBlock = block.lastBlock, }; diff --git a/utils/testing/for_each_line_test.cc b/utils/testing/for_each_line_test.cc index 2d77ee01f..aa35dd180 100644 --- a/utils/testing/for_each_line_test.cc +++ b/utils/testing/for_each_line_test.cc @@ -446,13 +446,11 @@ TEST_CASE("for_each_line newline splitter") tester.processUsingBlockedMappedStream("file://mldb/testing/MLDB-1043-bucketize-data.csv", blockSize); tester.validate(); } - SECTION("blocked gzip stream") { ForEachLineTester tester; - tester.processUsingBlockedMappedStream("file://mldb/mldb_test_data/reviews_Digital_Music_5.json.zstd", blockSize, blockSize > 5 ? 64000: 640 /* maxLines */); + tester.processUsingBlockedMappedStream("file://mldb/mldb_test_data/reviews_Digital_Music_5.json.zstd", blockSize, blockSize > 17 ? 64000: 640 /* maxLines */); tester.validate(); } - SECTION("line by line") { ForEachLineTester tester; tester.processUsingLineByLine("file://mldb/mldb_test_data/reviews_Digital_Music_5.json.zstd", 1000 /* maxLines */);