From 15f8c848fa5a25e8f4cc1ecb90ef4a1b2eb5d062 Mon Sep 17 00:00:00 2001 From: Niels Date: Sun, 10 Apr 2016 18:23:43 +0200 Subject: [PATCH 001/133] fixed typo and indentation --- README.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 2fadefff6..8c100333a 100644 --- a/README.md +++ b/README.md @@ -55,13 +55,13 @@ Please note: - GCC 4.8 does not work because of two bugs ([55817](https://gcc.gnu.org/bugzilla/show_bug.cgi?id=55817) and [57824](https://gcc.gnu.org/bugzilla/show_bug.cgi?id=57824)) in the C++11 support. Note there is a [pull request](https://github.com/nlohmann/json/pull/212) to fix some of the issues. - Android defaults to using very old compilers and C++ libraries. To fix this, add the following to your `Application.mk`. This will switch to the LLVM C++ library, the Clang compiler, and enable C++11 and other features disabled by default. -``` -APP_STL := c++_shared -NDK_TOOLCHAIN_VERSION := clang3.6 -APP_CPPFLAGS += -frtti -fexceptions -``` + ``` + APP_STL := c++_shared + NDK_TOOLCHAIN_VERSION := clang3.6 + APP_CPPFLAGS += -frtti -fexceptions + ``` -- For GCC running on MinGW or Android SDK, the error `'to_string' is not a member of 'std'` (or similarly, for `strtod`) may occur. Note this is not an issue with the code, but rather with the compiler itself. On Android, see above to build with a newer environment. For MingW, please refer to [this site](http://tehsausage.com/mingw-to-string) and [this discussion](https://github.com/nlohmann/json/issues/136) for information on how to fix this bug. +- For GCC running on MinGW or Android SDK, the error `'to_string' is not a member of 'std'` (or similarly, for `strtod`) may occur. Note this is not an issue with the code, but rather with the compiler itself. On Android, see above to build with a newer environment. For MinGW, please refer to [this site](http://tehsausage.com/mingw-to-string) and [this discussion](https://github.com/nlohmann/json/issues/136) for information on how to fix this bug. ## Examples From 507322e6f2f63d028c68b2a666aefe902b77f66e Mon Sep 17 00:00:00 2001 From: Niels Date: Sun, 10 Apr 2016 19:36:09 +0200 Subject: [PATCH 002/133] updated ChangeLog --- ChangeLog.md | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/ChangeLog.md b/ChangeLog.md index bb325598b..0acd10f5a 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -6,17 +6,32 @@ All notable changes to this project will be documented in this file. This projec [Full Changelog](https://github.com/nlohmann/json/compare/v1.1.0...HEAD) - Provide a FAQ [\#163](https://github.com/nlohmann/json/issues/163) +- Create PULL\_REQUEST\_TEMPLATE.md [\#213](https://github.com/nlohmann/json/pull/213) ([whackashoe](https://github.com/whackashoe)) +- fixed noexcept; added constexpr [\#208](https://github.com/nlohmann/json/pull/208) ([nlohmann](https://github.com/nlohmann)) +- Add support for afl-fuzz testing [\#207](https://github.com/nlohmann/json/pull/207) ([msm-](https://github.com/msm-)) - Issue \#178 - Extending support to full uint64\_t/int64\_t range and unsigned type \(updated\) [\#193](https://github.com/nlohmann/json/pull/193) ([twelsby](https://github.com/twelsby)) +- double values are serialized with commas as decimal points [\#228](https://github.com/nlohmann/json/issues/228) +- Move semantics with std::initializer\_list [\#225](https://github.com/nlohmann/json/issues/225) +- abort during getline in yyfill [\#223](https://github.com/nlohmann/json/issues/223) +- Wrong link in the README.md [\#217](https://github.com/nlohmann/json/issues/217) - Small bugs in json.hpp \(get\_number\) and unit.cpp \(non-standard integer type test\) [\#199](https://github.com/nlohmann/json/issues/199) - GCC/clang floating point parsing bug in strtod\(\) [\#195](https://github.com/nlohmann/json/issues/195) - Bugs in miloyip/nativejson-benchmark: roundtrips [\#187](https://github.com/nlohmann/json/issues/187) - Floating point exceptions [\#181](https://github.com/nlohmann/json/issues/181) +- In basic\_json::basic\_json\(const CompatibleArrayType& val\), the requirement of CompatibleArrayType is not strict enough. [\#174](https://github.com/nlohmann/json/issues/174) - Implicit assignment to std::string fails [\#144](https://github.com/nlohmann/json/issues/144) - Issue \#195 - update Travis to Trusty due to gcc/clang strtod\(\) bug [\#196](https://github.com/nlohmann/json/pull/196) ([twelsby](https://github.com/twelsby)) +- Conflicting typedef of ssize\_t on Windows 32 bit when using Boost.Python [\#204](https://github.com/nlohmann/json/issues/204) - Integer conversion to unsigned [\#178](https://github.com/nlohmann/json/issues/178) +- make serialization locale-independent [\#232](https://github.com/nlohmann/json/pull/232) ([nlohmann](https://github.com/nlohmann)) +- fixes \#223 by updating README.md [\#227](https://github.com/nlohmann/json/pull/227) ([kevin--](https://github.com/kevin--)) +- Use namespace std for int64\_t and uint64\_t [\#226](https://github.com/nlohmann/json/pull/226) ([lv-zheng](https://github.com/lv-zheng)) +- Added missing cerrno header to fix ERANGE compile error on android [\#222](https://github.com/nlohmann/json/pull/222) ([Teemperor](https://github.com/Teemperor)) +- Corrected readme [\#218](https://github.com/nlohmann/json/pull/218) ([Annihil](https://github.com/Annihil)) +- replaced ssize\_t occurrences with auto \(addresses \#204\) [\#205](https://github.com/nlohmann/json/pull/205) ([nlohmann](https://github.com/nlohmann)) - Fixed issue \#199 - Small bugs in json.hpp \(get\_number\) and unit.cpp \(non-standard integer type test\) [\#200](https://github.com/nlohmann/json/pull/200) ([twelsby](https://github.com/twelsby)) - Fix broken link [\#197](https://github.com/nlohmann/json/pull/197) ([vog](https://github.com/vog)) From 726051e9b75009e68bb216171ac8e1ad56fdb99a Mon Sep 17 00:00:00 2001 From: Niels Date: Mon, 11 Apr 2016 23:17:03 +0200 Subject: [PATCH 003/133] very first draft of a JSON pointer API --- src/json.hpp | 73 +++++++++++++++++++++++++++++++++++++++++++++++ src/json.hpp.re2c | 73 +++++++++++++++++++++++++++++++++++++++++++++++ test/unit.cpp | 29 +++++++++++++++++++ 3 files changed, 175 insertions(+) diff --git a/src/json.hpp b/src/json.hpp index 8f671fb01..c8b815048 100644 --- a/src/json.hpp +++ b/src/json.hpp @@ -8844,6 +8844,79 @@ basic_json_parser_64: /// the lexer lexer m_lexer; }; + + public: + class json_pointer + { + public: + /// empty reference token + json_pointer() = default; + + /// nonempty reference token + json_pointer(const std::string& s) + { + split(s); + } + + /// return referenced value + reference get(reference j) + { + reference result = j; + + for (const auto& reference_token : reference_tokens) + { + switch (result.m_type) + { + case value_t::object: + result = result[reference_token]; + continue; + + case value_t::array: + result = result[std::stoi(reference_token)]; + continue; + + default: + throw std::domain_error("unresolved reference token '" + reference_token + "'"); + } + } + + return result; + } + + private: + /// the reference tokens + std::vector reference_tokens {}; + + /// split the string input to reference tokens + void split(std::string reference_string) + { + // special case: empty reference string -> no reference tokens + if (reference_string.empty()) + { + return; + } + + // check if nonempty reference string begins with slash + if (reference_string[0] != '/') + { + throw std::domain_error("JSON pointer must be empty or begin with '/'"); + } + + // tokenize reference string + auto ptr = std::strtok(&reference_string[0], "/"); + while (ptr != nullptr) + { + reference_tokens.push_back(ptr); + ptr = std::strtok(NULL, "/"); + } + + // special case: reference string was just "/" + if (reference_tokens.empty()) + { + reference_tokens.push_back(""); + } + } + }; }; diff --git a/src/json.hpp.re2c b/src/json.hpp.re2c index ebf83d831..164f49628 100644 --- a/src/json.hpp.re2c +++ b/src/json.hpp.re2c @@ -8123,6 +8123,79 @@ class basic_json /// the lexer lexer m_lexer; }; + + public: + class json_pointer + { + public: + /// empty reference token + json_pointer() = default; + + /// nonempty reference token + json_pointer(const std::string& s) + { + split(s); + } + + /// return referenced value + reference get(reference j) + { + reference result = j; + + for (const auto& reference_token : reference_tokens) + { + switch (result.m_type) + { + case value_t::object: + result = result[reference_token]; + continue; + + case value_t::array: + result = result[std::stoi(reference_token)]; + continue; + + default: + throw std::domain_error("unresolved reference token '" + reference_token + "'"); + } + } + + return result; + } + + private: + /// the reference tokens + std::vector reference_tokens {}; + + /// split the string input to reference tokens + void split(std::string reference_string) + { + // special case: empty reference string -> no reference tokens + if (reference_string.empty()) + { + return; + } + + // check if nonempty reference string begins with slash + if (reference_string[0] != '/') + { + throw std::domain_error("JSON pointer must be empty or begin with '/'"); + } + + // tokenize reference string + auto ptr = std::strtok(&reference_string[0], "/"); + while (ptr != nullptr) + { + reference_tokens.push_back(ptr); + ptr = std::strtok(NULL, "/"); + } + + // special case: reference string was just "/" + if (reference_tokens.empty()) + { + reference_tokens.push_back(""); + } + } + }; }; diff --git a/test/unit.cpp b/test/unit.cpp index ab96364c8..6051ee3e5 100644 --- a/test/unit.cpp +++ b/test/unit.cpp @@ -12052,6 +12052,35 @@ TEST_CASE("Unicode", "[hide]") } } +TEST_CASE("JSON pointers") +{ + SECTION("examples from RFC 6901") + { + json j = R"( + { + "foo": ["bar", "baz"], + "": 0, + "a/b": 1, + "c%d": 2, + "e^f": 3, + "g|h": 4, + "i\\j": 5, + "k\"l": 6, + " ": 7, + "m~n": 8 + } + )"_json; + + json::json_pointer jp0(""); + json::json_pointer jp1("/foo"); + //json::json_pointer jp2("/foo/0"); + + auto jp0_ = jp0.get(j); + auto jp1_ = jp1.get(j); + //auto jp2_ = jp2.get(j); + } +} + TEST_CASE("regression tests") { SECTION("issue #60 - Double quotation mark is not parsed correctly") From 2197f5f0a6ed9ff1894f1494ca05c1646d46267c Mon Sep 17 00:00:00 2001 From: Robert Marki Date: Wed, 13 Apr 2016 13:49:53 +0200 Subject: [PATCH 004/133] Make the indirection and dereference operators of iterator const fixes #233 --- src/json.hpp | 4 ++-- src/json.hpp.re2c | 4 ++-- test/unit.cpp | 11 +++++++++++ 3 files changed, 15 insertions(+), 4 deletions(-) diff --git a/src/json.hpp b/src/json.hpp index 8f671fb01..6ed82738b 100644 --- a/src/json.hpp +++ b/src/json.hpp @@ -7000,13 +7000,13 @@ class basic_json } /// return a reference to the value pointed to by the iterator - reference operator*() + reference operator*() const { return const_cast(base_iterator::operator*()); } /// dereference the iterator - pointer operator->() + pointer operator->() const { return const_cast(base_iterator::operator->()); } diff --git a/src/json.hpp.re2c b/src/json.hpp.re2c index ebf83d831..33e1a4eb8 100644 --- a/src/json.hpp.re2c +++ b/src/json.hpp.re2c @@ -7000,13 +7000,13 @@ class basic_json } /// return a reference to the value pointed to by the iterator - reference operator*() + reference operator*() const { return const_cast(base_iterator::operator*()); } /// dereference the iterator - pointer operator->() + pointer operator->() const { return const_cast(base_iterator::operator->()); } diff --git a/test/unit.cpp b/test/unit.cpp index ab96364c8..2fa63ea9b 100644 --- a/test/unit.cpp +++ b/test/unit.cpp @@ -12407,5 +12407,16 @@ TEST_CASE("regression tests") CHECK(j3b.dump() == "1E04"); CHECK(j3c.dump() == "1e04"); } + + SECTION("issue #233 - Can't use basic_json::iterator as a base iterator for std::move_iterator") + { + json source = {"a", "b", "c"}; + json expected = {"a", "b"}; + json dest; + + std::copy_n(std::make_move_iterator(source.begin()), 2, std::back_inserter(dest)); + + CHECK(dest == expected); + } } From 2cb925c186e623f19b61fe0ce41bb772406df462 Mon Sep 17 00:00:00 2001 From: Niels Date: Wed, 13 Apr 2016 17:41:19 +0200 Subject: [PATCH 005/133] adding support for escaped reference tokens --- src/json.hpp | 57 ++++++++++++++++++++++++++++++++++++++++++----- src/json.hpp.re2c | 57 ++++++++++++++++++++++++++++++++++++++++++----- test/unit.cpp | 53 +++++++++++++++++++++++++++++++++++++------ 3 files changed, 150 insertions(+), 17 deletions(-) diff --git a/src/json.hpp b/src/json.hpp index c8b815048..f2c3813ac 100644 --- a/src/json.hpp +++ b/src/json.hpp @@ -8861,18 +8861,18 @@ basic_json_parser_64: /// return referenced value reference get(reference j) { - reference result = j; + pointer result = &j; for (const auto& reference_token : reference_tokens) { - switch (result.m_type) + switch (result->m_type) { case value_t::object: - result = result[reference_token]; + result = &result->at(reference_token); continue; case value_t::array: - result = result[std::stoi(reference_token)]; + result = &result->at(static_cast(std::stoi(reference_token))); continue; default: @@ -8880,13 +8880,52 @@ basic_json_parser_64: } } - return result; + return *result; + } + + const_reference get(const_reference j) const + { + const_pointer result = &j; + + for (const auto& reference_token : reference_tokens) + { + switch (result->m_type) + { + case value_t::object: + result = &result->at(reference_token); + continue; + + case value_t::array: + result = &result->at(static_cast(std::stoi(reference_token))); + continue; + + default: + throw std::domain_error("unresolved reference token '" + reference_token + "'"); + } + } + + return *result; } private: /// the reference tokens std::vector reference_tokens {}; + /// replace all occurrences of a substring by another string + void replace_substring(std::string& s, + const std::string& f, + const std::string& t) + { + assert(not f.empty()); + + for ( + size_t pos = s.find(f); // find first occurrence of f + pos != std::string::npos; // make sure f was found + s.replace(pos, f.size(), t), // replace with t + pos = s.find(f, pos + t.size()) // find next occurrence of f + ); + } + /// split the string input to reference tokens void split(std::string reference_string) { @@ -8915,6 +8954,14 @@ basic_json_parser_64: { reference_tokens.push_back(""); } + + for (auto& reference_token : reference_tokens) + { + // first transform any occurrence of the sequence '~1' to '/' + replace_substring(reference_token, "~1", "/"); + // then transform any occurrence of the sequence '~0' to '~' + replace_substring(reference_token, "~0", "~"); + } } }; }; diff --git a/src/json.hpp.re2c b/src/json.hpp.re2c index 164f49628..ea62dca57 100644 --- a/src/json.hpp.re2c +++ b/src/json.hpp.re2c @@ -8140,18 +8140,18 @@ class basic_json /// return referenced value reference get(reference j) { - reference result = j; + pointer result = &j; for (const auto& reference_token : reference_tokens) { - switch (result.m_type) + switch (result->m_type) { case value_t::object: - result = result[reference_token]; + result = &result->at(reference_token); continue; case value_t::array: - result = result[std::stoi(reference_token)]; + result = &result->at(static_cast(std::stoi(reference_token))); continue; default: @@ -8159,13 +8159,52 @@ class basic_json } } - return result; + return *result; + } + + const_reference get(const_reference j) const + { + const_pointer result = &j; + + for (const auto& reference_token : reference_tokens) + { + switch (result->m_type) + { + case value_t::object: + result = &result->at(reference_token); + continue; + + case value_t::array: + result = &result->at(static_cast(std::stoi(reference_token))); + continue; + + default: + throw std::domain_error("unresolved reference token '" + reference_token + "'"); + } + } + + return *result; } private: /// the reference tokens std::vector reference_tokens {}; + /// replace all occurrences of a substring by another string + void replace_substring(std::string& s, + const std::string& f, + const std::string& t) + { + assert(not f.empty()); + + for ( + size_t pos = s.find(f); // find first occurrence of f + pos != std::string::npos; // make sure f was found + s.replace(pos, f.size(), t), // replace with t + pos = s.find(f, pos + t.size()) // find next occurrence of f + ); + } + /// split the string input to reference tokens void split(std::string reference_string) { @@ -8194,6 +8233,14 @@ class basic_json { reference_tokens.push_back(""); } + + for (auto& reference_token : reference_tokens) + { + // first transform any occurrence of the sequence '~1' to '/' + replace_substring(reference_token, "~1", "/"); + // then transform any occurrence of the sequence '~0' to '~' + replace_substring(reference_token, "~0", "~"); + } } }; }; diff --git a/test/unit.cpp b/test/unit.cpp index 6051ee3e5..d6ec00a79 100644 --- a/test/unit.cpp +++ b/test/unit.cpp @@ -12071,13 +12071,53 @@ TEST_CASE("JSON pointers") } )"_json; - json::json_pointer jp0(""); - json::json_pointer jp1("/foo"); - //json::json_pointer jp2("/foo/0"); + const json j_const = j; - auto jp0_ = jp0.get(j); - auto jp1_ = jp1.get(j); - //auto jp2_ = jp2.get(j); + SECTION("nonconst access") + { + // the whole document + CHECK(json::json_pointer().get(j) == j); + CHECK(json::json_pointer("").get(j) == j); + + // array access + CHECK(json::json_pointer("/foo").get(j) == j["foo"]); + CHECK(json::json_pointer("/foo/0").get(j) == j["foo"][0]); + CHECK(json::json_pointer("/foo/1").get(j) == j["foo"][1]); + + // empty string access + CHECK(json::json_pointer("/").get(j) == j[""]); + + // other cases + CHECK(json::json_pointer("/ ").get(j) == j[" "]); + CHECK(json::json_pointer("/c%d").get(j) == j["c%d"]); + CHECK(json::json_pointer("/e^f").get(j) == j["e^f"]); + CHECK(json::json_pointer("/g|h").get(j) == j["g|h"]); + CHECK(json::json_pointer("/i\\j").get(j) == j["i\\j"]); + CHECK(json::json_pointer("/k\"l").get(j) == j["k\"l"]); + + // escaped access + CHECK(json::json_pointer("/a~1b").get(j) == j["a/b"]); + CHECK(json::json_pointer("/m~0n").get(j) == j["m~n"]); + + // unescaped access + CHECK_THROWS_AS(json::json_pointer("/a/b").get(j), std::out_of_range); + CHECK_THROWS_WITH(json::json_pointer("/a/b").get(j), "key 'a' not found"); + // "/a/b" works for JSON {"a": {"b": 42}} + CHECK(json::json_pointer("/a/b").get({{"a", {{"b", 42}}}}) == json(42)); + } + + SECTION("const access") + { + CHECK(j_const == json::json_pointer().get(j_const)); + CHECK(j_const == json::json_pointer("").get(j_const)); + + CHECK(j_const["foo"] == json::json_pointer("/foo").get(j_const)); + CHECK(j_const["foo"][0] == json::json_pointer("/foo/0").get(j_const)); + CHECK(j_const["foo"][1] == json::json_pointer("/foo/1").get(j_const)); + + CHECK(j_const[""] == json::json_pointer("/").get(j_const)); + CHECK(j_const[" "] == json::json_pointer("/ ").get(j_const)); + } } } @@ -12437,4 +12477,3 @@ TEST_CASE("regression tests") CHECK(j3c.dump() == "1e04"); } } - From 94af8abdff77de3526aca2c2ccfd03517ee678e5 Mon Sep 17 00:00:00 2001 From: Niels Date: Wed, 13 Apr 2016 23:23:54 +0200 Subject: [PATCH 006/133] overworked reference token parsing --- src/json.hpp | 84 ++++++++++++++++++++++++++++++++++++----------- src/json.hpp.re2c | 84 ++++++++++++++++++++++++++++++++++++----------- test/unit.cpp | 23 +++++++++++++ 3 files changed, 151 insertions(+), 40 deletions(-) diff --git a/src/json.hpp b/src/json.hpp index f2c3813ac..84e10064f 100644 --- a/src/json.hpp +++ b/src/json.hpp @@ -8911,10 +8911,21 @@ basic_json_parser_64: /// the reference tokens std::vector reference_tokens {}; - /// replace all occurrences of a substring by another string - void replace_substring(std::string& s, - const std::string& f, - const std::string& t) + /*! + @brief replace all occurrences of a substring by another string + + @param[in,out] s the string to manipulate + @param[in] f the substring to replace with @a t + @param[out] t the string to replace @a f + + @return The string @a s where all occurrences of @a f are replaced + with @a t. + + @pre The search string @f must not be empty. + */ + static void replace_substring(std::string& s, + const std::string& f, + const std::string& t) { assert(not f.empty()); @@ -8941,26 +8952,49 @@ basic_json_parser_64: throw std::domain_error("JSON pointer must be empty or begin with '/'"); } - // tokenize reference string - auto ptr = std::strtok(&reference_string[0], "/"); - while (ptr != nullptr) + // extract the reference tokens: + // - slash: position of the last read slash (or end of string) + // - start: position after the previous slash + for ( + // search for the first slash after the first character + size_t slash = reference_string.find_first_of("/", 1), + // set the beginning of the first reference token + start = 1; + // we can stop if start == string::npos+1 = 0 + start != 0; + // set the beginning of the next reference token + // (could be 0 if slash == std::string::npos) + start = slash + 1, + // find next slash + slash = reference_string.find_first_of("/", start)) { - reference_tokens.push_back(ptr); - ptr = std::strtok(NULL, "/"); - } + // use the text between the beginning of the reference token + // (start) and the last slash (slash). + auto reference_token = reference_string.substr(start, slash - start); - // special case: reference string was just "/" - if (reference_tokens.empty()) - { - reference_tokens.push_back(""); - } + // check reference tokens are properly escaped + for (size_t pos = reference_token.find_first_of("~"); + pos != std::string::npos; + pos = reference_token.find_first_of("~", pos + 1)) + { + assert(reference_token[pos] == '~'); + + // ~ must be followed by 0 or 1 + if (pos == reference_token.size() - 1 or + (reference_token[pos + 1] != '0' and + reference_token[pos + 1] != '1')) + { + throw std::domain_error("escape error: '~' must be followed with '0' or '1'"); + } + } - for (auto& reference_token : reference_tokens) - { // first transform any occurrence of the sequence '~1' to '/' replace_substring(reference_token, "~1", "/"); // then transform any occurrence of the sequence '~0' to '~' replace_substring(reference_token, "~0", "~"); + + // store the reference token + reference_tokens.push_back(reference_token); } } }; @@ -9026,9 +9060,9 @@ struct hash /*! @brief user-defined string literal for JSON values -This operator implements a user-defined string literal for JSON objects. It can -be used by adding \p "_json" to a string literal and returns a JSON object if -no parse error occurred. +This operator implements a user-defined string literal for JSON objects. It +can be used by adding \p "_json" to a string literal and returns a JSON object +if no parse error occurred. @param[in] s a string representation of a JSON object @return a JSON object @@ -9040,6 +9074,16 @@ inline nlohmann::json operator "" _json(const char* s, std::size_t) return nlohmann::json::parse(reinterpret_cast(s)); } +/*! +@brief user-defined string literal for JSON pointer + +@since version 2.0.0 +*/ +inline nlohmann::json::json_pointer operator "" _json_pointer(const char* s, std::size_t) +{ + return nlohmann::json::json_pointer(s); +} + // restore GCC/clang diagnostic settings #if defined(__clang__) || defined(__GNUC__) || defined(__GNUG__) #pragma GCC diagnostic pop diff --git a/src/json.hpp.re2c b/src/json.hpp.re2c index ea62dca57..5501b35c1 100644 --- a/src/json.hpp.re2c +++ b/src/json.hpp.re2c @@ -8190,10 +8190,21 @@ class basic_json /// the reference tokens std::vector reference_tokens {}; - /// replace all occurrences of a substring by another string - void replace_substring(std::string& s, - const std::string& f, - const std::string& t) + /*! + @brief replace all occurrences of a substring by another string + + @param[in,out] s the string to manipulate + @param[in] f the substring to replace with @a t + @param[out] t the string to replace @a f + + @return The string @a s where all occurrences of @a f are replaced + with @a t. + + @pre The search string @f must not be empty. + */ + static void replace_substring(std::string& s, + const std::string& f, + const std::string& t) { assert(not f.empty()); @@ -8220,26 +8231,49 @@ class basic_json throw std::domain_error("JSON pointer must be empty or begin with '/'"); } - // tokenize reference string - auto ptr = std::strtok(&reference_string[0], "/"); - while (ptr != nullptr) + // extract the reference tokens: + // - slash: position of the last read slash (or end of string) + // - start: position after the previous slash + for ( + // search for the first slash after the first character + size_t slash = reference_string.find_first_of("/", 1), + // set the beginning of the first reference token + start = 1; + // we can stop if start == string::npos+1 = 0 + start != 0; + // set the beginning of the next reference token + // (could be 0 if slash == std::string::npos) + start = slash + 1, + // find next slash + slash = reference_string.find_first_of("/", start)) { - reference_tokens.push_back(ptr); - ptr = std::strtok(NULL, "/"); - } + // use the text between the beginning of the reference token + // (start) and the last slash (slash). + auto reference_token = reference_string.substr(start, slash - start); - // special case: reference string was just "/" - if (reference_tokens.empty()) - { - reference_tokens.push_back(""); - } + // check reference tokens are properly escaped + for (size_t pos = reference_token.find_first_of("~"); + pos != std::string::npos; + pos = reference_token.find_first_of("~", pos + 1)) + { + assert(reference_token[pos] == '~'); + + // ~ must be followed by 0 or 1 + if (pos == reference_token.size() - 1 or + (reference_token[pos + 1] != '0' and + reference_token[pos + 1] != '1')) + { + throw std::domain_error("escape error: '~' must be followed with '0' or '1'"); + } + } - for (auto& reference_token : reference_tokens) - { // first transform any occurrence of the sequence '~1' to '/' replace_substring(reference_token, "~1", "/"); // then transform any occurrence of the sequence '~0' to '~' replace_substring(reference_token, "~0", "~"); + + // store the reference token + reference_tokens.push_back(reference_token); } } }; @@ -8305,9 +8339,9 @@ struct hash /*! @brief user-defined string literal for JSON values -This operator implements a user-defined string literal for JSON objects. It can -be used by adding \p "_json" to a string literal and returns a JSON object if -no parse error occurred. +This operator implements a user-defined string literal for JSON objects. It +can be used by adding \p "_json" to a string literal and returns a JSON object +if no parse error occurred. @param[in] s a string representation of a JSON object @return a JSON object @@ -8319,6 +8353,16 @@ inline nlohmann::json operator "" _json(const char* s, std::size_t) return nlohmann::json::parse(reinterpret_cast(s)); } +/*! +@brief user-defined string literal for JSON pointer + +@since version 2.0.0 +*/ +inline nlohmann::json::json_pointer operator "" _json_pointer(const char* s, std::size_t) +{ + return nlohmann::json::json_pointer(s); +} + // restore GCC/clang diagnostic settings #if defined(__clang__) || defined(__GNUC__) || defined(__GNUG__) #pragma GCC diagnostic pop diff --git a/test/unit.cpp b/test/unit.cpp index d6ec00a79..7c8fd8b77 100644 --- a/test/unit.cpp +++ b/test/unit.cpp @@ -12118,6 +12118,29 @@ TEST_CASE("JSON pointers") CHECK(j_const[""] == json::json_pointer("/").get(j_const)); CHECK(j_const[" "] == json::json_pointer("/ ").get(j_const)); } + + SECTION("user-defined string literal") + { + // the whole document + CHECK(""_json_pointer.get(j) == j); + + // array access + CHECK("/foo"_json_pointer.get(j) == j["foo"]); + CHECK("/foo/0"_json_pointer.get(j) == j["foo"][0]); + CHECK("/foo/1"_json_pointer.get(j) == j["foo"][1]); + } + + SECTION("errors") + { + CHECK_THROWS_AS(json::json_pointer("foo"), std::domain_error); + CHECK_THROWS_WITH(json::json_pointer("foo"), "JSON pointer must be empty or begin with '/'"); + + CHECK_THROWS_AS(json::json_pointer("/~~"), std::domain_error); + CHECK_THROWS_WITH(json::json_pointer("/~~"), "escape error: '~' must be followed with '0' or '1'"); + + CHECK_THROWS_AS(json::json_pointer("/~"), std::domain_error); + CHECK_THROWS_WITH(json::json_pointer("/~"), "escape error: '~' must be followed with '0' or '1'"); + } } } From 76a5a776eb45a5e2471ef1074bcea1a660895b1d Mon Sep 17 00:00:00 2001 From: Niels Date: Sat, 16 Apr 2016 12:19:10 +0200 Subject: [PATCH 007/133] cleanup after #234 --- Makefile | 4 +- README.md | 3 +- src/json.hpp | 817 ++++++++++++++++++++++++-------------------------- test/unit.cpp | 2 +- 4 files changed, 398 insertions(+), 428 deletions(-) diff --git a/Makefile b/Makefile index 91d4fc586..d0a80379c 100644 --- a/Makefile +++ b/Makefile @@ -66,7 +66,7 @@ cppcheck: # create scanner with re2c re2c: src/json.hpp.re2c - $(RE2C) -b -s -i --no-generation-date $< | $(SED) '1d' > src/json.hpp + $(RE2C) --bit-vectors --nested-ifs --no-debug-info $< | $(SED) '1d' > src/json.hpp # pretty printer pretty: @@ -74,7 +74,7 @@ pretty: --indent-switches --indent-preproc-block --indent-preproc-define \ --indent-col1-comments --pad-oper --pad-header --align-pointer=type \ --align-reference=type --add-brackets --convert-tabs --close-templates \ - --lineend=linux --preserve-date --suffix=none \ + --lineend=linux --preserve-date --suffix=none --formatted \ src/json.hpp src/json.hpp.re2c test/unit.cpp test/fuzz.cpp benchmarks/benchmarks.cpp doc/examples/*.cpp diff --git a/README.md b/README.md index 8c100333a..d39663ee3 100644 --- a/README.md +++ b/README.md @@ -410,6 +410,7 @@ I deeply appreciate the help of the following people. - [Lv Zheng](https://github.com/lv-zheng) fixed a namespace issue with `int64_t` and `uint64_t`. - [abc100m](https://github.com/abc100m) analyzed the issues with GCC 4.8 and proposed a [partial solution](https://github.com/nlohmann/json/pull/212). - [zewt](https://github.com/zewt) added useful notes to the README file about Android. +- [Róbert Márki](https://github.com/robertmrk) added a fix to use move iterators. Thanks a lot for helping out! @@ -427,7 +428,7 @@ $ make $ ./json_unit "*" =============================================================================== -All tests passed (3344278 assertions in 29 test cases) +All tests passed (3344299 assertions in 29 test cases) ``` For more information, have a look at the file [.travis.yml](https://github.com/nlohmann/json/blob/master/.travis.yml). diff --git a/src/json.hpp b/src/json.hpp index 6ed82738b..0fdaa281d 100644 --- a/src/json.hpp +++ b/src/json.hpp @@ -7416,322 +7416,323 @@ class basic_json { 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 32, 0, 0, 32, 0, 0, - 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, - 96, 64, 0, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 160, 128, 0, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, 192, 192, 192, 192, 192, 192, 192, 192, - 192, 192, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 0, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, + 192, 192, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 0, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, }; if ((m_limit - m_cursor) < 5) { yyfill(); // LCOV_EXCL_LINE; } yych = *m_cursor; - if (yych <= ':') + if (yybm[0 + yych] & 32) { - if (yych <= ' ') + goto basic_json_parser_6; + } + if (yych <= '\\') + { + if (yych <= '-') { - if (yych <= '\n') + if (yych <= '"') { if (yych <= 0x00) { - goto basic_json_parser_28; + goto basic_json_parser_2; } - if (yych <= 0x08) - { - goto basic_json_parser_30; - } - if (yych >= '\n') + if (yych <= '!') { goto basic_json_parser_4; } + goto basic_json_parser_9; } else { - if (yych == '\r') + if (yych <= '+') { - goto basic_json_parser_2; + goto basic_json_parser_4; } - if (yych <= 0x1F) + if (yych <= ',') { - goto basic_json_parser_30; + goto basic_json_parser_10; } + goto basic_json_parser_12; } } else { - if (yych <= ',') - { - if (yych == '"') - { - goto basic_json_parser_27; - } - if (yych <= '+') - { - goto basic_json_parser_30; - } - goto basic_json_parser_16; - } - else + if (yych <= '9') { if (yych <= '/') { - if (yych <= '-') - { - goto basic_json_parser_23; - } - goto basic_json_parser_30; + goto basic_json_parser_4; } - else + if (yych <= '0') { - if (yych <= '0') - { - goto basic_json_parser_24; - } - if (yych <= '9') - { - goto basic_json_parser_26; - } - goto basic_json_parser_18; + goto basic_json_parser_13; } + goto basic_json_parser_15; + } + else + { + if (yych <= ':') + { + goto basic_json_parser_17; + } + if (yych == '[') + { + goto basic_json_parser_19; + } + goto basic_json_parser_4; } } } else { - if (yych <= 'n') + if (yych <= 't') { - if (yych <= ']') + if (yych <= 'f') { - if (yych == '[') + if (yych <= ']') { - goto basic_json_parser_8; + goto basic_json_parser_21; } - if (yych <= '\\') + if (yych <= 'e') { - goto basic_json_parser_30; + goto basic_json_parser_4; } - goto basic_json_parser_10; + goto basic_json_parser_23; } else { - if (yych == 'f') + if (yych == 'n') { - goto basic_json_parser_22; + goto basic_json_parser_24; } - if (yych <= 'm') + if (yych <= 's') { - goto basic_json_parser_30; + goto basic_json_parser_4; } - goto basic_json_parser_20; + goto basic_json_parser_25; } } else { - if (yych <= '{') + if (yych <= '|') { - if (yych == 't') + if (yych == '{') { - goto basic_json_parser_21; + goto basic_json_parser_26; } - if (yych <= 'z') - { - goto basic_json_parser_30; - } - goto basic_json_parser_12; + goto basic_json_parser_4; } else { if (yych <= '}') { - if (yych <= '|') - { - goto basic_json_parser_30; - } - goto basic_json_parser_14; + goto basic_json_parser_28; } - else + if (yych == 0xEF) { - if (yych == 0xEF) - { - goto basic_json_parser_6; - } goto basic_json_parser_30; } + goto basic_json_parser_4; } } } basic_json_parser_2: ++m_cursor; - yych = *m_cursor; - goto basic_json_parser_5; -basic_json_parser_3: { - return scan(); + return token_type::end_of_input; } basic_json_parser_4: ++m_cursor; +basic_json_parser_5: + { + return token_type::parse_error; + } +basic_json_parser_6: + ++m_cursor; if (m_limit <= m_cursor) { yyfill(); // LCOV_EXCL_LINE; } yych = *m_cursor; -basic_json_parser_5: if (yybm[0 + yych] & 32) { - goto basic_json_parser_4; + goto basic_json_parser_6; } - goto basic_json_parser_3; -basic_json_parser_6: + { + return scan(); + } +basic_json_parser_9: yyaccept = 0; yych = *(m_marker = ++m_cursor); - if (yych == 0xBB) + if (yych <= 0x0F) { - goto basic_json_parser_64; - } -basic_json_parser_7: - { - return token_type::parse_error; - } -basic_json_parser_8: - ++m_cursor; - { - return token_type::begin_array; + goto basic_json_parser_5; } + goto basic_json_parser_32; basic_json_parser_10: - ++m_cursor; - { - return token_type::end_array; - } -basic_json_parser_12: - ++m_cursor; - { - return token_type::begin_object; - } -basic_json_parser_14: - ++m_cursor; - { - return token_type::end_object; - } -basic_json_parser_16: ++m_cursor; { return token_type::value_separator; } -basic_json_parser_18: - ++m_cursor; - { - return token_type::name_separator; - } -basic_json_parser_20: - yyaccept = 0; - yych = *(m_marker = ++m_cursor); - if (yych == 'u') - { - goto basic_json_parser_60; - } - goto basic_json_parser_7; -basic_json_parser_21: - yyaccept = 0; - yych = *(m_marker = ++m_cursor); - if (yych == 'r') - { - goto basic_json_parser_56; - } - goto basic_json_parser_7; -basic_json_parser_22: - yyaccept = 0; - yych = *(m_marker = ++m_cursor); - if (yych == 'a') - { - goto basic_json_parser_51; - } - goto basic_json_parser_7; -basic_json_parser_23: +basic_json_parser_12: yych = *++m_cursor; if (yych <= '/') { - goto basic_json_parser_7; + goto basic_json_parser_5; } if (yych <= '0') { - goto basic_json_parser_50; + goto basic_json_parser_13; } if (yych <= '9') { - goto basic_json_parser_41; + goto basic_json_parser_15; } - goto basic_json_parser_7; -basic_json_parser_24: + goto basic_json_parser_5; +basic_json_parser_13: yyaccept = 1; yych = *(m_marker = ++m_cursor); if (yych <= 'D') { if (yych == '.') { - goto basic_json_parser_43; + goto basic_json_parser_37; } } else { if (yych <= 'E') { - goto basic_json_parser_44; + goto basic_json_parser_38; } if (yych == 'e') { - goto basic_json_parser_44; + goto basic_json_parser_38; } } -basic_json_parser_25: +basic_json_parser_14: { return token_type::value_number; } -basic_json_parser_26: +basic_json_parser_15: yyaccept = 1; - yych = *(m_marker = ++m_cursor); - goto basic_json_parser_42; -basic_json_parser_27: + m_marker = ++m_cursor; + if ((m_limit - m_cursor) < 3) + { + yyfill(); // LCOV_EXCL_LINE; + } + yych = *m_cursor; + if (yybm[0 + yych] & 64) + { + goto basic_json_parser_15; + } + if (yych <= 'D') + { + if (yych == '.') + { + goto basic_json_parser_37; + } + goto basic_json_parser_14; + } + else + { + if (yych <= 'E') + { + goto basic_json_parser_38; + } + if (yych == 'e') + { + goto basic_json_parser_38; + } + goto basic_json_parser_14; + } +basic_json_parser_17: + ++m_cursor; + { + return token_type::name_separator; + } +basic_json_parser_19: + ++m_cursor; + { + return token_type::begin_array; + } +basic_json_parser_21: + ++m_cursor; + { + return token_type::end_array; + } +basic_json_parser_23: yyaccept = 0; yych = *(m_marker = ++m_cursor); - if (yych <= 0x0F) + if (yych == 'a') { - goto basic_json_parser_7; + goto basic_json_parser_39; + } + goto basic_json_parser_5; +basic_json_parser_24: + yyaccept = 0; + yych = *(m_marker = ++m_cursor); + if (yych == 'u') + { + goto basic_json_parser_40; + } + goto basic_json_parser_5; +basic_json_parser_25: + yyaccept = 0; + yych = *(m_marker = ++m_cursor); + if (yych == 'r') + { + goto basic_json_parser_41; + } + goto basic_json_parser_5; +basic_json_parser_26: + ++m_cursor; + { + return token_type::begin_object; } - goto basic_json_parser_32; basic_json_parser_28: ++m_cursor; { - return token_type::end_of_input; + return token_type::end_object; } basic_json_parser_30: - yych = *++m_cursor; - goto basic_json_parser_7; + yyaccept = 0; + yych = *(m_marker = ++m_cursor); + if (yych == 0xBB) + { + goto basic_json_parser_42; + } + goto basic_json_parser_5; basic_json_parser_31: ++m_cursor; if (m_limit <= m_cursor) @@ -7740,7 +7741,7 @@ basic_json_parser_31: } yych = *m_cursor; basic_json_parser_32: - if (yybm[0 + yych] & 64) + if (yybm[0 + yych] & 128) { goto basic_json_parser_31; } @@ -7750,20 +7751,25 @@ basic_json_parser_32: } if (yych <= '"') { - goto basic_json_parser_35; + goto basic_json_parser_34; } - goto basic_json_parser_34; + goto basic_json_parser_36; basic_json_parser_33: m_cursor = m_marker; if (yyaccept == 0) { - goto basic_json_parser_7; + goto basic_json_parser_5; } else { - goto basic_json_parser_25; + goto basic_json_parser_14; } basic_json_parser_34: + ++m_cursor; + { + return token_type::value_string; + } +basic_json_parser_36: ++m_cursor; if (m_limit <= m_cursor) { @@ -7836,18 +7842,78 @@ basic_json_parser_34: } if (yych <= 'u') { - goto basic_json_parser_37; + goto basic_json_parser_43; } goto basic_json_parser_33; } } } -basic_json_parser_35: - ++m_cursor; - { - return token_type::value_string; - } basic_json_parser_37: + yych = *++m_cursor; + if (yych <= '/') + { + goto basic_json_parser_33; + } + if (yych <= '9') + { + goto basic_json_parser_44; + } + goto basic_json_parser_33; +basic_json_parser_38: + yych = *++m_cursor; + if (yych <= ',') + { + if (yych == '+') + { + goto basic_json_parser_46; + } + goto basic_json_parser_33; + } + else + { + if (yych <= '-') + { + goto basic_json_parser_46; + } + if (yych <= '/') + { + goto basic_json_parser_33; + } + if (yych <= '9') + { + goto basic_json_parser_47; + } + goto basic_json_parser_33; + } +basic_json_parser_39: + yych = *++m_cursor; + if (yych == 'l') + { + goto basic_json_parser_49; + } + goto basic_json_parser_33; +basic_json_parser_40: + yych = *++m_cursor; + if (yych == 'l') + { + goto basic_json_parser_50; + } + goto basic_json_parser_33; +basic_json_parser_41: + yych = *++m_cursor; + if (yych == 'u') + { + goto basic_json_parser_51; + } + goto basic_json_parser_33; +basic_json_parser_42: + yych = *++m_cursor; + if (yych == 0xBF) + { + goto basic_json_parser_52; + } + goto basic_json_parser_33; +basic_json_parser_43: ++m_cursor; if (m_limit <= m_cursor) { @@ -7860,27 +7926,113 @@ basic_json_parser_37: { goto basic_json_parser_33; } - if (yych >= ':') + if (yych <= '9') { - goto basic_json_parser_33; + goto basic_json_parser_54; } + goto basic_json_parser_33; } else { if (yych <= 'F') + { + goto basic_json_parser_54; + } + if (yych <= '`') + { + goto basic_json_parser_33; + } + if (yych <= 'f') + { + goto basic_json_parser_54; + } + goto basic_json_parser_33; + } +basic_json_parser_44: + yyaccept = 1; + m_marker = ++m_cursor; + if ((m_limit - m_cursor) < 3) + { + yyfill(); // LCOV_EXCL_LINE; + } + yych = *m_cursor; + if (yych <= 'D') + { + if (yych <= '/') + { + goto basic_json_parser_14; + } + if (yych <= '9') + { + goto basic_json_parser_44; + } + goto basic_json_parser_14; + } + else + { + if (yych <= 'E') { goto basic_json_parser_38; } - if (yych <= '`') + if (yych == 'e') { - goto basic_json_parser_33; - } - if (yych >= 'g') - { - goto basic_json_parser_33; + goto basic_json_parser_38; } + goto basic_json_parser_14; } -basic_json_parser_38: +basic_json_parser_46: + yych = *++m_cursor; + if (yych <= '/') + { + goto basic_json_parser_33; + } + if (yych >= ':') + { + goto basic_json_parser_33; + } +basic_json_parser_47: + ++m_cursor; + if (m_limit <= m_cursor) + { + yyfill(); // LCOV_EXCL_LINE; + } + yych = *m_cursor; + if (yych <= '/') + { + goto basic_json_parser_14; + } + if (yych <= '9') + { + goto basic_json_parser_47; + } + goto basic_json_parser_14; +basic_json_parser_49: + yych = *++m_cursor; + if (yych == 's') + { + goto basic_json_parser_55; + } + goto basic_json_parser_33; +basic_json_parser_50: + yych = *++m_cursor; + if (yych == 'l') + { + goto basic_json_parser_56; + } + goto basic_json_parser_33; +basic_json_parser_51: + yych = *++m_cursor; + if (yych == 'e') + { + goto basic_json_parser_58; + } + goto basic_json_parser_33; +basic_json_parser_52: + ++m_cursor; + { + return scan(); + } +basic_json_parser_54: ++m_cursor; if (m_limit <= m_cursor) { @@ -7893,27 +8045,46 @@ basic_json_parser_38: { goto basic_json_parser_33; } - if (yych >= ':') + if (yych <= '9') { - goto basic_json_parser_33; + goto basic_json_parser_60; } + goto basic_json_parser_33; } else { if (yych <= 'F') { - goto basic_json_parser_39; + goto basic_json_parser_60; } if (yych <= '`') { goto basic_json_parser_33; } - if (yych >= 'g') + if (yych <= 'f') { - goto basic_json_parser_33; + goto basic_json_parser_60; } + goto basic_json_parser_33; } -basic_json_parser_39: +basic_json_parser_55: + yych = *++m_cursor; + if (yych == 'e') + { + goto basic_json_parser_61; + } + goto basic_json_parser_33; +basic_json_parser_56: + ++m_cursor; + { + return token_type::literal_null; + } +basic_json_parser_58: + ++m_cursor; + { + return token_type::literal_true; + } +basic_json_parser_60: ++m_cursor; if (m_limit <= m_cursor) { @@ -7926,27 +8097,34 @@ basic_json_parser_39: { goto basic_json_parser_33; } - if (yych >= ':') + if (yych <= '9') { - goto basic_json_parser_33; + goto basic_json_parser_63; } + goto basic_json_parser_33; } else { if (yych <= 'F') { - goto basic_json_parser_40; + goto basic_json_parser_63; } if (yych <= '`') { goto basic_json_parser_33; } - if (yych >= 'g') + if (yych <= 'f') { - goto basic_json_parser_33; + goto basic_json_parser_63; } + goto basic_json_parser_33; } -basic_json_parser_40: +basic_json_parser_61: + ++m_cursor; + { + return token_type::literal_false; + } +basic_json_parser_63: ++m_cursor; if (m_limit <= m_cursor) { @@ -7981,215 +8159,6 @@ basic_json_parser_40: } goto basic_json_parser_33; } -basic_json_parser_41: - yyaccept = 1; - m_marker = ++m_cursor; - if ((m_limit - m_cursor) < 3) - { - yyfill(); // LCOV_EXCL_LINE; - } - yych = *m_cursor; -basic_json_parser_42: - if (yybm[0 + yych] & 128) - { - goto basic_json_parser_41; - } - if (yych <= 'D') - { - if (yych != '.') - { - goto basic_json_parser_25; - } - } - else - { - if (yych <= 'E') - { - goto basic_json_parser_44; - } - if (yych == 'e') - { - goto basic_json_parser_44; - } - goto basic_json_parser_25; - } -basic_json_parser_43: - yych = *++m_cursor; - if (yych <= '/') - { - goto basic_json_parser_33; - } - if (yych <= '9') - { - goto basic_json_parser_48; - } - goto basic_json_parser_33; -basic_json_parser_44: - yych = *++m_cursor; - if (yych <= ',') - { - if (yych != '+') - { - goto basic_json_parser_33; - } - } - else - { - if (yych <= '-') - { - goto basic_json_parser_45; - } - if (yych <= '/') - { - goto basic_json_parser_33; - } - if (yych <= '9') - { - goto basic_json_parser_46; - } - goto basic_json_parser_33; - } -basic_json_parser_45: - yych = *++m_cursor; - if (yych <= '/') - { - goto basic_json_parser_33; - } - if (yych >= ':') - { - goto basic_json_parser_33; - } -basic_json_parser_46: - ++m_cursor; - if (m_limit <= m_cursor) - { - yyfill(); // LCOV_EXCL_LINE; - } - yych = *m_cursor; - if (yych <= '/') - { - goto basic_json_parser_25; - } - if (yych <= '9') - { - goto basic_json_parser_46; - } - goto basic_json_parser_25; -basic_json_parser_48: - yyaccept = 1; - m_marker = ++m_cursor; - if ((m_limit - m_cursor) < 3) - { - yyfill(); // LCOV_EXCL_LINE; - } - yych = *m_cursor; - if (yych <= 'D') - { - if (yych <= '/') - { - goto basic_json_parser_25; - } - if (yych <= '9') - { - goto basic_json_parser_48; - } - goto basic_json_parser_25; - } - else - { - if (yych <= 'E') - { - goto basic_json_parser_44; - } - if (yych == 'e') - { - goto basic_json_parser_44; - } - goto basic_json_parser_25; - } -basic_json_parser_50: - yyaccept = 1; - yych = *(m_marker = ++m_cursor); - if (yych <= 'D') - { - if (yych == '.') - { - goto basic_json_parser_43; - } - goto basic_json_parser_25; - } - else - { - if (yych <= 'E') - { - goto basic_json_parser_44; - } - if (yych == 'e') - { - goto basic_json_parser_44; - } - goto basic_json_parser_25; - } -basic_json_parser_51: - yych = *++m_cursor; - if (yych != 'l') - { - goto basic_json_parser_33; - } - yych = *++m_cursor; - if (yych != 's') - { - goto basic_json_parser_33; - } - yych = *++m_cursor; - if (yych != 'e') - { - goto basic_json_parser_33; - } - ++m_cursor; - { - return token_type::literal_false; - } -basic_json_parser_56: - yych = *++m_cursor; - if (yych != 'u') - { - goto basic_json_parser_33; - } - yych = *++m_cursor; - if (yych != 'e') - { - goto basic_json_parser_33; - } - ++m_cursor; - { - return token_type::literal_true; - } -basic_json_parser_60: - yych = *++m_cursor; - if (yych != 'l') - { - goto basic_json_parser_33; - } - yych = *++m_cursor; - if (yych != 'l') - { - goto basic_json_parser_33; - } - ++m_cursor; - { - return token_type::literal_null; - } -basic_json_parser_64: - yych = *++m_cursor; - if (yych != 0xBF) - { - goto basic_json_parser_33; - } - ++m_cursor; - { - return scan(); - } } } diff --git a/test/unit.cpp b/test/unit.cpp index 2fa63ea9b..f6b670d86 100644 --- a/test/unit.cpp +++ b/test/unit.cpp @@ -12410,7 +12410,7 @@ TEST_CASE("regression tests") SECTION("issue #233 - Can't use basic_json::iterator as a base iterator for std::move_iterator") { - json source = {"a", "b", "c"}; + json source = {"a", "b", "c"}; json expected = {"a", "b"}; json dest; From 3401954f5b3b163c7b152a314f8e78b534eb54e1 Mon Sep 17 00:00:00 2001 From: Niels Date: Sat, 16 Apr 2016 14:02:14 +0200 Subject: [PATCH 008/133] cleaned up API --- src/json.hpp | 45 ++++++++++++++++++++++++++++++++++++--------- src/json.hpp.re2c | 45 ++++++++++++++++++++++++++++++++++++--------- test/unit.cpp | 40 +++++++++++++++++++++++++++++++++------- 3 files changed, 105 insertions(+), 25 deletions(-) diff --git a/src/json.hpp b/src/json.hpp index 347508842..2d3831362 100644 --- a/src/json.hpp +++ b/src/json.hpp @@ -198,6 +198,9 @@ class basic_json AllocatorType>; public: + // forward declarations + template class json_reverse_iterator; + class json_pointer; ///////////////////// // container types // @@ -227,9 +230,6 @@ class basic_json /// the type of an element const pointer using const_pointer = typename std::allocator_traits::const_pointer; - // forward declaration - template class json_reverse_iterator; - /// an iterator for a basic_json container class iterator; /// a const iterator for a basic_json container @@ -3595,6 +3595,28 @@ class basic_json } } + /*! + @brief access specified element via JSON Pointer + + Returns a reference to the element at with specified JSON pointer @a ptr. + + @param p JSON pointer to the desired element + + @since version 2.0.0 + */ + reference operator[](const json_pointer& ptr) + { + return ptr.get(*this); + } + + /*! + @copydoc basic_json::operator[](const json_pointer&) + */ + const_reference operator[](const json_pointer& ptr) const + { + return ptr.get(*this); + } + /*! @brief access specified object element with default value @@ -8815,6 +8837,11 @@ basic_json_parser_63: }; public: + /*! + @brief JSON Pointer + + @sa [RFC 6901](https://tools.ietf.org/html/rfc6901) + */ class json_pointer { public: @@ -8822,13 +8849,14 @@ basic_json_parser_63: json_pointer() = default; /// nonempty reference token - json_pointer(const std::string& s) + explicit json_pointer(const std::string& s) { split(s); } + private: /// return referenced value - reference get(reference j) + reference get(reference j) const { pointer result = &j; @@ -8876,7 +8904,6 @@ basic_json_parser_63: return *result; } - private: /// the reference tokens std::vector reference_tokens {}; @@ -8890,7 +8917,7 @@ basic_json_parser_63: @return The string @a s where all occurrences of @a f are replaced with @a t. - @pre The search string @f must not be empty. + @pre The search string @a f must not be empty. */ static void replace_substring(std::string& s, const std::string& f, @@ -8932,7 +8959,7 @@ basic_json_parser_63: // we can stop if start == string::npos+1 = 0 start != 0; // set the beginning of the next reference token - // (could be 0 if slash == std::string::npos) + // (will eventually be 0 if slash == std::string::npos) start = slash + 1, // find next slash slash = reference_string.find_first_of("/", start)) @@ -8962,7 +8989,7 @@ basic_json_parser_63: // then transform any occurrence of the sequence '~0' to '~' replace_substring(reference_token, "~0", "~"); - // store the reference token + // finally, store the reference token reference_tokens.push_back(reference_token); } } diff --git a/src/json.hpp.re2c b/src/json.hpp.re2c index 8364d03bc..dd4eeb838 100644 --- a/src/json.hpp.re2c +++ b/src/json.hpp.re2c @@ -198,6 +198,9 @@ class basic_json AllocatorType>; public: + // forward declarations + template class json_reverse_iterator; + class json_pointer; ///////////////////// // container types // @@ -227,9 +230,6 @@ class basic_json /// the type of an element const pointer using const_pointer = typename std::allocator_traits::const_pointer; - // forward declaration - template class json_reverse_iterator; - /// an iterator for a basic_json container class iterator; /// a const iterator for a basic_json container @@ -3595,6 +3595,28 @@ class basic_json } } + /*! + @brief access specified element via JSON Pointer + + Returns a reference to the element at with specified JSON pointer @a ptr. + + @param p JSON pointer to the desired element + + @since version 2.0.0 + */ + reference operator[](const json_pointer& ptr) + { + return ptr.get(*this); + } + + /*! + @copydoc basic_json::operator[](const json_pointer&) + */ + const_reference operator[](const json_pointer& ptr) const + { + return ptr.get(*this); + } + /*! @brief access specified object element with default value @@ -8125,6 +8147,11 @@ class basic_json }; public: + /*! + @brief JSON Pointer + + @sa [RFC 6901](https://tools.ietf.org/html/rfc6901) + */ class json_pointer { public: @@ -8132,13 +8159,14 @@ class basic_json json_pointer() = default; /// nonempty reference token - json_pointer(const std::string& s) + explicit json_pointer(const std::string& s) { split(s); } + private: /// return referenced value - reference get(reference j) + reference get(reference j) const { pointer result = &j; @@ -8186,7 +8214,6 @@ class basic_json return *result; } - private: /// the reference tokens std::vector reference_tokens {}; @@ -8200,7 +8227,7 @@ class basic_json @return The string @a s where all occurrences of @a f are replaced with @a t. - @pre The search string @f must not be empty. + @pre The search string @a f must not be empty. */ static void replace_substring(std::string& s, const std::string& f, @@ -8242,7 +8269,7 @@ class basic_json // we can stop if start == string::npos+1 = 0 start != 0; // set the beginning of the next reference token - // (could be 0 if slash == std::string::npos) + // (will eventually be 0 if slash == std::string::npos) start = slash + 1, // find next slash slash = reference_string.find_first_of("/", start)) @@ -8272,7 +8299,7 @@ class basic_json // then transform any occurrence of the sequence '~0' to '~' replace_substring(reference_token, "~0", "~"); - // store the reference token + // finally, store the reference token reference_tokens.push_back(reference_token); } } diff --git a/test/unit.cpp b/test/unit.cpp index 628c27553..223de2c24 100644 --- a/test/unit.cpp +++ b/test/unit.cpp @@ -12078,11 +12078,17 @@ TEST_CASE("JSON pointers") // the whole document CHECK(json::json_pointer().get(j) == j); CHECK(json::json_pointer("").get(j) == j); + CHECK(j[json::json_pointer()] == j); + CHECK(j[json::json_pointer("")] == j); // array access CHECK(json::json_pointer("/foo").get(j) == j["foo"]); CHECK(json::json_pointer("/foo/0").get(j) == j["foo"][0]); CHECK(json::json_pointer("/foo/1").get(j) == j["foo"][1]); + CHECK(j[json::json_pointer("/foo")] == j["foo"]); + CHECK(j[json::json_pointer("/foo/0")] == j["foo"][0]); + CHECK(j[json::json_pointer("/foo/1")] == j["foo"][1]); + CHECK(j["/foo/1"_json_pointer] == j["foo"][1]); // empty string access CHECK(json::json_pointer("/").get(j) == j[""]); @@ -12108,15 +12114,35 @@ TEST_CASE("JSON pointers") SECTION("const access") { - CHECK(j_const == json::json_pointer().get(j_const)); - CHECK(j_const == json::json_pointer("").get(j_const)); + // the whole document + CHECK(json::json_pointer().get(j_const) == j_const); + CHECK(json::json_pointer("").get(j_const) == j_const); - CHECK(j_const["foo"] == json::json_pointer("/foo").get(j_const)); - CHECK(j_const["foo"][0] == json::json_pointer("/foo/0").get(j_const)); - CHECK(j_const["foo"][1] == json::json_pointer("/foo/1").get(j_const)); + // array access + CHECK(json::json_pointer("/foo").get(j_const) == j_const["foo"]); + CHECK(json::json_pointer("/foo/0").get(j_const) == j_const["foo"][0]); + CHECK(json::json_pointer("/foo/1").get(j_const) == j_const["foo"][1]); - CHECK(j_const[""] == json::json_pointer("/").get(j_const)); - CHECK(j_const[" "] == json::json_pointer("/ ").get(j_const)); + // empty string access + CHECK(json::json_pointer("/").get(j_const) == j_const[""]); + + // other cases + CHECK(json::json_pointer("/ ").get(j_const) == j_const[" "]); + CHECK(json::json_pointer("/c%d").get(j_const) == j_const["c%d"]); + CHECK(json::json_pointer("/e^f").get(j_const) == j_const["e^f"]); + CHECK(json::json_pointer("/g|h").get(j_const) == j_const["g|h"]); + CHECK(json::json_pointer("/i\\j").get(j_const) == j_const["i\\j"]); + CHECK(json::json_pointer("/k\"l").get(j_const) == j_const["k\"l"]); + + // escaped access + CHECK(json::json_pointer("/a~1b").get(j_const) == j_const["a/b"]); + CHECK(json::json_pointer("/m~0n").get(j_const) == j_const["m~n"]); + + // unescaped access + CHECK_THROWS_AS(json::json_pointer("/a/b").get(j), std::out_of_range); + CHECK_THROWS_WITH(json::json_pointer("/a/b").get(j), "key 'a' not found"); + // "/a/b" works for JSON {"a": {"b": 42}} + CHECK(json::json_pointer("/a/b").get({{"a", {{"b", 42}}}}) == json(42)); } SECTION("user-defined string literal") From 007359675b0ee39f5a70ce1a7adfc9d268388050 Mon Sep 17 00:00:00 2001 From: Niels Date: Sat, 16 Apr 2016 16:39:20 +0200 Subject: [PATCH 009/133] added a flatten function --- src/json.hpp | 111 +++++++++++++++++++++++++++++++++++----------- src/json.hpp.re2c | 111 +++++++++++++++++++++++++++++++++++----------- test/unit.cpp | 47 ++++++++++++++++++++ 3 files changed, 217 insertions(+), 52 deletions(-) diff --git a/src/json.hpp b/src/json.hpp index 2d3831362..6aca24ad6 100644 --- a/src/json.hpp +++ b/src/json.hpp @@ -8907,32 +8907,6 @@ basic_json_parser_63: /// the reference tokens std::vector reference_tokens {}; - /*! - @brief replace all occurrences of a substring by another string - - @param[in,out] s the string to manipulate - @param[in] f the substring to replace with @a t - @param[out] t the string to replace @a f - - @return The string @a s where all occurrences of @a f are replaced - with @a t. - - @pre The search string @a f must not be empty. - */ - static void replace_substring(std::string& s, - const std::string& f, - const std::string& t) - { - assert(not f.empty()); - - for ( - size_t pos = s.find(f); // find first occurrence of f - pos != std::string::npos; // make sure f was found - s.replace(pos, f.size(), t), // replace with t - pos = s.find(f, pos + t.size()) // find next occurrence of f - ); - } - /// split the string input to reference tokens void split(std::string reference_string) { @@ -8993,7 +8967,92 @@ basic_json_parser_63: reference_tokens.push_back(reference_token); } } + + /*! + @brief replace all occurrences of a substring by another string + + @param[in,out] s the string to manipulate + @param[in] f the substring to replace with @a t + @param[out] t the string to replace @a f + + @return The string @a s where all occurrences of @a f are replaced + with @a t. + + @pre The search string @a f must not be empty. + + @since version 2.0.0 + */ + static void replace_substring(std::string& s, + const std::string& f, + const std::string& t) + { + assert(not f.empty()); + + for ( + size_t pos = s.find(f); // find first occurrence of f + pos != std::string::npos; // make sure f was found + s.replace(pos, f.size(), t), // replace with t + pos = s.find(f, pos + t.size()) // find next occurrence of f + ); + } + + /*! + @param[in] reference_string the reference string to the current value + @param[in] value the value to consider + @param[in,out] result the result object to insert values to + */ + static void flatten(const std::string reference_string, + const basic_json& value, + basic_json& result) + { + switch (value.m_type) + { + case value_t::array: + { + // iterate array and use index as reference string + for (size_t i = 0; i < value.m_value.array->size(); ++i) + { + flatten(reference_string + "/" + std::to_string(i), + value.m_value.array->operator[](i), result); + } + break; + } + + case value_t::object: + { + // iterate object and use keys as reference string + for (const auto& element : *value.m_value.object) + { + // escape "~"" to "~0" and "/" to "~1" + std::string key(element.first); + replace_substring(key, "~", "~0"); + replace_substring(key, "/", "~1"); + + flatten(reference_string + "/" + key, + element.second, result); + } + break; + } + + default: + { + // add primitive value with its reference string + result[reference_string] = value; + break; + } + } + } }; + + /*! + @return an object that maps JSON pointers to primitve values + */ + basic_json flatten() const + { + basic_json result(value_t::object); + json_pointer::flatten("", *this, result); + return result; + } }; diff --git a/src/json.hpp.re2c b/src/json.hpp.re2c index dd4eeb838..74827e2c6 100644 --- a/src/json.hpp.re2c +++ b/src/json.hpp.re2c @@ -8217,32 +8217,6 @@ class basic_json /// the reference tokens std::vector reference_tokens {}; - /*! - @brief replace all occurrences of a substring by another string - - @param[in,out] s the string to manipulate - @param[in] f the substring to replace with @a t - @param[out] t the string to replace @a f - - @return The string @a s where all occurrences of @a f are replaced - with @a t. - - @pre The search string @a f must not be empty. - */ - static void replace_substring(std::string& s, - const std::string& f, - const std::string& t) - { - assert(not f.empty()); - - for ( - size_t pos = s.find(f); // find first occurrence of f - pos != std::string::npos; // make sure f was found - s.replace(pos, f.size(), t), // replace with t - pos = s.find(f, pos + t.size()) // find next occurrence of f - ); - } - /// split the string input to reference tokens void split(std::string reference_string) { @@ -8303,7 +8277,92 @@ class basic_json reference_tokens.push_back(reference_token); } } + + /*! + @brief replace all occurrences of a substring by another string + + @param[in,out] s the string to manipulate + @param[in] f the substring to replace with @a t + @param[out] t the string to replace @a f + + @return The string @a s where all occurrences of @a f are replaced + with @a t. + + @pre The search string @a f must not be empty. + + @since version 2.0.0 + */ + static void replace_substring(std::string& s, + const std::string& f, + const std::string& t) + { + assert(not f.empty()); + + for ( + size_t pos = s.find(f); // find first occurrence of f + pos != std::string::npos; // make sure f was found + s.replace(pos, f.size(), t), // replace with t + pos = s.find(f, pos + t.size()) // find next occurrence of f + ); + } + + /*! + @param[in] reference_string the reference string to the current value + @param[in] value the value to consider + @param[in,out] result the result object to insert values to + */ + static void flatten(const std::string reference_string, + const basic_json& value, + basic_json& result) + { + switch (value.m_type) + { + case value_t::array: + { + // iterate array and use index as reference string + for (size_t i = 0; i < value.m_value.array->size(); ++i) + { + flatten(reference_string + "/" + std::to_string(i), + value.m_value.array->operator[](i), result); + } + break; + } + + case value_t::object: + { + // iterate object and use keys as reference string + for (const auto& element : *value.m_value.object) + { + // escape "~"" to "~0" and "/" to "~1" + std::string key(element.first); + replace_substring(key, "~", "~0"); + replace_substring(key, "/", "~1"); + + flatten(reference_string + "/" + key, + element.second, result); + } + break; + } + + default: + { + // add primitive value with its reference string + result[reference_string] = value; + break; + } + } + } }; + + /*! + @return an object that maps JSON pointers to primitve values + */ + basic_json flatten() const + { + basic_json result(value_t::object); + json_pointer::flatten("", *this, result); + return result; + } }; diff --git a/test/unit.cpp b/test/unit.cpp index 223de2c24..0d9aa0a72 100644 --- a/test/unit.cpp +++ b/test/unit.cpp @@ -12168,6 +12168,53 @@ TEST_CASE("JSON pointers") CHECK_THROWS_WITH(json::json_pointer("/~"), "escape error: '~' must be followed with '0' or '1'"); } } + + SECTION("flatten") + { + json j = + { + {"pi", 3.141}, + {"happy", true}, + {"name", "Niels"}, + {"nothing", nullptr}, + { + "answer", { + {"everything", 42} + } + }, + {"list", {1, 0, 2}}, + { + "object", { + {"currency", "USD"}, + {"value", 42.99}, + {"", "empty string"}, + {"/", "slash"}, + {"~", "tilde"}, + {"~1", "tilde1"} + } + } + }; + + json j_flatten = + { + {"/pi", 3.141}, + {"/happy", true}, + {"/name", "Niels"}, + {"/nothing", nullptr}, + {"/answer/everything", 42}, + {"/list/0", 1}, + {"/list/1", 0}, + {"/list/2", 2}, + {"/object/currency", "USD"}, + {"/object/value", 42.99}, + {"/object/", "empty string"}, + {"/object/~1", "slash"}, + {"/object/~0", "tilde"}, + {"/object/~01", "tilde1"} + }; + + CHECK(j.flatten() == j_flatten); + } } TEST_CASE("regression tests") From f834965b44572b14a0865763aed3fde02facf0e4 Mon Sep 17 00:00:00 2001 From: Niels Date: Sat, 16 Apr 2016 20:45:40 +0200 Subject: [PATCH 010/133] implemented deflatten function --- src/json.hpp | 81 ++++++++++++++++++++++++++++++++++++++++++++++- src/json.hpp.re2c | 81 ++++++++++++++++++++++++++++++++++++++++++++++- test/unit.cpp | 17 ++++++++++ 3 files changed, 177 insertions(+), 2 deletions(-) diff --git a/src/json.hpp b/src/json.hpp index 6aca24ad6..96bc1f325 100644 --- a/src/json.hpp +++ b/src/json.hpp @@ -8855,7 +8855,6 @@ basic_json_parser_63: } private: - /// return referenced value reference get(reference j) const { pointer result = &j; @@ -8880,6 +8879,49 @@ basic_json_parser_63: return *result; } + reference get2(reference j) const + { + pointer result = &j; + + for (const auto& reference_token : reference_tokens) + { + switch (result->m_type) + { + case value_t::null: + { + if (reference_token == "0") + { + result = &result->operator[](0); + } + else + { + result = &result->operator[](reference_token); + } + continue; + } + + case value_t::object: + { + result = &result->operator[](reference_token); + continue; + } + + case value_t::array: + { + result = &result->operator[](static_cast(std::stoi(reference_token))); + continue; + } + + default: + { + throw std::domain_error("unresolved reference token '" + reference_token + "'"); + } + } + } + + return *result; + } + const_reference get(const_reference j) const { const_pointer result = &j; @@ -9042,6 +9084,35 @@ basic_json_parser_63: } } } + + /*! + @param[in] value flattened JSON + + @return deflattened JSON + */ + static basic_json deflatten(const basic_json& value) + { + if (not value.is_object()) + { + throw std::domain_error("only objects can be deflattened"); + } + + basic_json result; + + // iterate the JSON object values + for (const auto& element : *value.m_value.object) + { + if (not element.second.is_primitive()) + { + throw std::domain_error("values in object must be primitive"); + } + + // assign value to reference pointed to by JSON pointer + json_pointer(element.first).get2(result) = element.second; + } + + return result; + } }; /*! @@ -9053,6 +9124,14 @@ basic_json_parser_63: json_pointer::flatten("", *this, result); return result; } + + /*! + @return the original JSON from a flattened version + */ + basic_json deflatten() const + { + return json_pointer::deflatten(*this); + } }; diff --git a/src/json.hpp.re2c b/src/json.hpp.re2c index 74827e2c6..1a049cd52 100644 --- a/src/json.hpp.re2c +++ b/src/json.hpp.re2c @@ -8165,7 +8165,6 @@ class basic_json } private: - /// return referenced value reference get(reference j) const { pointer result = &j; @@ -8190,6 +8189,49 @@ class basic_json return *result; } + reference get2(reference j) const + { + pointer result = &j; + + for (const auto& reference_token : reference_tokens) + { + switch (result->m_type) + { + case value_t::null: + { + if (reference_token == "0") + { + result = &result->operator[](0); + } + else + { + result = &result->operator[](reference_token); + } + continue; + } + + case value_t::object: + { + result = &result->operator[](reference_token); + continue; + } + + case value_t::array: + { + result = &result->operator[](static_cast(std::stoi(reference_token))); + continue; + } + + default: + { + throw std::domain_error("unresolved reference token '" + reference_token + "'"); + } + } + } + + return *result; + } + const_reference get(const_reference j) const { const_pointer result = &j; @@ -8352,6 +8394,35 @@ class basic_json } } } + + /*! + @param[in] value flattened JSON + + @return deflattened JSON + */ + static basic_json deflatten(const basic_json& value) + { + if (not value.is_object()) + { + throw std::domain_error("only objects can be deflattened"); + } + + basic_json result; + + // iterate the JSON object values + for (const auto& element : *value.m_value.object) + { + if (not element.second.is_primitive()) + { + throw std::domain_error("values in object must be primitive"); + } + + // assign value to reference pointed to by JSON pointer + json_pointer(element.first).get2(result) = element.second; + } + + return result; + } }; /*! @@ -8363,6 +8434,14 @@ class basic_json json_pointer::flatten("", *this, result); return result; } + + /*! + @return the original JSON from a flattened version + */ + basic_json deflatten() const + { + return json_pointer::deflatten(*this); + } }; diff --git a/test/unit.cpp b/test/unit.cpp index 0d9aa0a72..1ace40d08 100644 --- a/test/unit.cpp +++ b/test/unit.cpp @@ -12213,7 +12213,24 @@ TEST_CASE("JSON pointers") {"/object/~01", "tilde1"} }; + // check if flattened result is as expected CHECK(j.flatten() == j_flatten); + + // check if deflattened result is as expected + CHECK(j_flatten.deflatten() == j); + + // explicit roundtrip check + CHECK(j.flatten().deflatten() == j); + + // roundtrip for primitive values + json j_null; + CHECK(j_null.flatten().deflatten() == j_null); + json j_number = 42; + CHECK(j_number.flatten().deflatten() == j_number); + json j_boolean = false; + CHECK(j_boolean.flatten().deflatten() == j_boolean); + json j_string = "foo"; + CHECK(j_string.flatten().deflatten() == j_string); } } From 40e899a819ac105a591ab1e8405b938728c94e2e Mon Sep 17 00:00:00 2001 From: Niels Date: Sun, 17 Apr 2016 17:39:35 +0200 Subject: [PATCH 011/133] cleanup and documentation --- doc/examples/flatten.cpp | 34 ++ doc/examples/flatten.link | 1 + doc/examples/flatten.output | 16 + doc/examples/operatorjson_pointer.cpp | 47 +++ doc/examples/operatorjson_pointer.link | 1 + doc/examples/operatorjson_pointer.output | 8 + doc/examples/operatorjson_pointer_const.cpp | 23 ++ doc/examples/operatorjson_pointer_const.link | 1 + .../operatorjson_pointer_const.output | 4 + doc/examples/unflatten.cpp | 28 ++ doc/examples/unflatten.link | 1 + doc/examples/unflatten.output | 22 + src/json.hpp | 386 +++++++++++++++--- src/json.hpp.re2c | 386 +++++++++++++++--- test/unit.cpp | 222 ++++++---- 15 files changed, 978 insertions(+), 202 deletions(-) create mode 100644 doc/examples/flatten.cpp create mode 100644 doc/examples/flatten.link create mode 100644 doc/examples/flatten.output create mode 100644 doc/examples/operatorjson_pointer.cpp create mode 100644 doc/examples/operatorjson_pointer.link create mode 100644 doc/examples/operatorjson_pointer.output create mode 100644 doc/examples/operatorjson_pointer_const.cpp create mode 100644 doc/examples/operatorjson_pointer_const.link create mode 100644 doc/examples/operatorjson_pointer_const.output create mode 100644 doc/examples/unflatten.cpp create mode 100644 doc/examples/unflatten.link create mode 100644 doc/examples/unflatten.output diff --git a/doc/examples/flatten.cpp b/doc/examples/flatten.cpp new file mode 100644 index 000000000..5d7692028 --- /dev/null +++ b/doc/examples/flatten.cpp @@ -0,0 +1,34 @@ +#include + +using json = nlohmann::json; + +int main() +{ + // create JSON value + json j = + { + {"pi", 3.141}, + {"happy", true}, + {"name", "Niels"}, + {"nothing", nullptr}, + { + "answer", { + {"everything", 42} + } + }, + {"list", {1, 0, 2}}, + { + "object", { + {"currency", "USD"}, + {"value", 42.99}, + {"", "empty string"}, + {"/", "slash"}, + {"~", "tilde"}, + {"~1", "tilde1"} + } + } + }; + + // call flatten() + std::cout << std::setw(4) << j.flatten() << '\n'; +} diff --git a/doc/examples/flatten.link b/doc/examples/flatten.link new file mode 100644 index 000000000..70ba78baa --- /dev/null +++ b/doc/examples/flatten.link @@ -0,0 +1 @@ +online \ No newline at end of file diff --git a/doc/examples/flatten.output b/doc/examples/flatten.output new file mode 100644 index 000000000..beb368faf --- /dev/null +++ b/doc/examples/flatten.output @@ -0,0 +1,16 @@ +{ + "/answer/everything": 42, + "/happy": true, + "/list/0": 1, + "/list/1": 0, + "/list/2": 2, + "/name": "Niels", + "/nothing": null, + "/object/": "empty string", + "/object/currency": "USD", + "/object/value": 42.99, + "/object/~0": "tilde", + "/object/~01": "tilde1", + "/object/~1": "slash", + "/pi": 3.141 +} diff --git a/doc/examples/operatorjson_pointer.cpp b/doc/examples/operatorjson_pointer.cpp new file mode 100644 index 000000000..18e41c1f5 --- /dev/null +++ b/doc/examples/operatorjson_pointer.cpp @@ -0,0 +1,47 @@ +#include + +using json = nlohmann::json; + +int main() +{ + // create a JSON value + json j = + { + {"number", 1}, {"string", "foo"}, {"array", {1, 2}} + }; + + // read-only access + + // output element with JSON pointer "/number" + std::cout << j["/number"_json_pointer] << '\n'; + // output element with JSON pointer "/string" + std::cout << j["/string"_json_pointer] << '\n'; + // output element with JSON pointer "/array" + std::cout << j["/array"_json_pointer] << '\n'; + // output element with JSON pointer "/array/1" + std::cout << j["/array/1"_json_pointer] << '\n'; + + // writing access + + // change the string + j["/string"_json_pointer] = "bar"; + // output the changed string + std::cout << j["string"] << '\n'; + + // "change" a nonexisting object entry + j["/boolean"_json_pointer] = true; + // output the changed object + std::cout << j << '\n'; + + // change an array element + j["/array/1"_json_pointer] = 21; + // "change" an array element with nonexisting index + j["/array/4"_json_pointer] = 44; + // output the changed array + std::cout << j["array"] << '\n'; + + // "change" the arry element past the end + j["/array/-"_json_pointer] = 55; + // output the changed array + std::cout << j["array"] << '\n'; +} diff --git a/doc/examples/operatorjson_pointer.link b/doc/examples/operatorjson_pointer.link new file mode 100644 index 000000000..3cee69e78 --- /dev/null +++ b/doc/examples/operatorjson_pointer.link @@ -0,0 +1 @@ +online \ No newline at end of file diff --git a/doc/examples/operatorjson_pointer.output b/doc/examples/operatorjson_pointer.output new file mode 100644 index 000000000..1fd1b032d --- /dev/null +++ b/doc/examples/operatorjson_pointer.output @@ -0,0 +1,8 @@ +1 +"foo" +[1,2] +2 +"bar" +{"array":[1,2],"boolean":true,"number":1,"string":"bar"} +[1,21,null,null,44] +[1,21,null,null,44,55] diff --git a/doc/examples/operatorjson_pointer_const.cpp b/doc/examples/operatorjson_pointer_const.cpp new file mode 100644 index 000000000..20ac36cb2 --- /dev/null +++ b/doc/examples/operatorjson_pointer_const.cpp @@ -0,0 +1,23 @@ +#include + +using json = nlohmann::json; + +int main() +{ + // create a JSON value + const json j = + { + {"number", 1}, {"string", "foo"}, {"array", {1, 2}} + }; + + // read-only access + + // output element with JSON pointer "/number" + std::cout << j["/number"_json_pointer] << '\n'; + // output element with JSON pointer "/string" + std::cout << j["/string"_json_pointer] << '\n'; + // output element with JSON pointer "/array" + std::cout << j["/array"_json_pointer] << '\n'; + // output element with JSON pointer "/array/1" + std::cout << j["/array/1"_json_pointer] << '\n'; +} diff --git a/doc/examples/operatorjson_pointer_const.link b/doc/examples/operatorjson_pointer_const.link new file mode 100644 index 000000000..b13a9b19c --- /dev/null +++ b/doc/examples/operatorjson_pointer_const.link @@ -0,0 +1 @@ +online \ No newline at end of file diff --git a/doc/examples/operatorjson_pointer_const.output b/doc/examples/operatorjson_pointer_const.output new file mode 100644 index 000000000..7b9306bbc --- /dev/null +++ b/doc/examples/operatorjson_pointer_const.output @@ -0,0 +1,4 @@ +1 +"foo" +[1,2] +2 diff --git a/doc/examples/unflatten.cpp b/doc/examples/unflatten.cpp new file mode 100644 index 000000000..39c674c94 --- /dev/null +++ b/doc/examples/unflatten.cpp @@ -0,0 +1,28 @@ +#include + +using json = nlohmann::json; + +int main() +{ + // create JSON value + json j_flattened = + { + {"/answer/everything", 42}, + {"/happy", true}, + {"/list/0", 1}, + {"/list/1", 0}, + {"/list/2", 2}, + {"/name", "Niels"}, + {"/nothing", nullptr}, + {"/object/", "empty string"}, + {"/object/currency", "USD"}, + {"/object/value", 42.99}, + {"/object/~0", "tilde"}, + {"/object/~01", "tilde1"}, + {"/object/~1", "slash"}, + {"/pi", 3.141} + }; + + // call unflatten() + std::cout << std::setw(4) << j_flattened.unflatten() << '\n'; +} diff --git a/doc/examples/unflatten.link b/doc/examples/unflatten.link new file mode 100644 index 000000000..bc7594a0a --- /dev/null +++ b/doc/examples/unflatten.link @@ -0,0 +1 @@ +online \ No newline at end of file diff --git a/doc/examples/unflatten.output b/doc/examples/unflatten.output new file mode 100644 index 000000000..f57c9c9a1 --- /dev/null +++ b/doc/examples/unflatten.output @@ -0,0 +1,22 @@ +{ + "answer": { + "everything": 42 + }, + "happy": true, + "list": [ + 1, + 0, + 2 + ], + "name": "Niels", + "nothing": null, + "object": { + "": "empty string", + "/": "slash", + "currency": "USD", + "value": 42.99, + "~": "tilde", + "~1": "tilde1" + }, + "pi": 3.141 +} diff --git a/src/json.hpp b/src/json.hpp index 96bc1f325..6cf369bd9 100644 --- a/src/json.hpp +++ b/src/json.hpp @@ -3598,23 +3598,86 @@ class basic_json /*! @brief access specified element via JSON Pointer - Returns a reference to the element at with specified JSON pointer @a ptr. + Uses a JSON pointer to retrieve a reference to the respective JSON value. + No bound checking is performed. Similar to + @ref operator[](const typename object_t::key_type&), `null` values + are created in arrays and objects if necessary. - @param p JSON pointer to the desired element + In particular: + - If the JSON pointer points to an object key that does not exist, it + is created an filled with a `null` value before a reference to it + is returned. + - If the JSON pointer points to an array index that does not exist, it + is created an filled with a `null` value before a reference to it + is returned. All indices between the current maximum and the given + index are also filled with `null`. + - The special value `-` is treated as a synonym for the index past the + end. + + @param[in] ptr a JSON pointer + + @return reference to the JSON value pointed to by @a ptr + + @complexity Linear in the length of the JSON pointer. + + @throw std::out_of_range if the JSON pointer can not be resolved + + @liveexample{The behavior is shown in the example.,operatorjson_pointer} @since version 2.0.0 */ reference operator[](const json_pointer& ptr) { - return ptr.get(*this); + return ptr.get_unchecked(this); } /*! - @copydoc basic_json::operator[](const json_pointer&) + @brief access specified element via JSON Pointer + + Uses a JSON pointer to retrieve a reference to the respective JSON value. + No bound checking is performed. The function does not change the JSON + value; no `null` values are created. In particular, the the special value + `-` yields an exception. + + @param[in] ptr a JSON pointer + + @return reference to the JSON value pointed to by @a ptr + + @complexity Linear in the length of the JSON pointer. + + @throw std::out_of_range if the JSON pointer can not be resolved + @throw std::out_of_range if the special value `-` is used for an array + + @liveexample{The behavior is shown in the example., + operatorjson_pointer_const} + + @since version 2.0.0 */ const_reference operator[](const json_pointer& ptr) const { - return ptr.get(*this); + return ptr.get_unchecked(this); + } + + /*! + @brief access specified element via JSON Pointer + + Returns a reference to the element at with specified JSON pointer @a ptr. + + @param ptr JSON pointer to the desired element + + @since version 2.0.0 + */ + reference at(const json_pointer& ptr) + { + return ptr.get_checked(this); + } + + /*! + @copydoc basic_json::at(const json_pointer&) + */ + const_reference at(const json_pointer& ptr) const + { + return ptr.get_checked(this); } /*! @@ -8841,45 +8904,28 @@ basic_json_parser_63: @brief JSON Pointer @sa [RFC 6901](https://tools.ietf.org/html/rfc6901) + + @since version 2.0.0 */ class json_pointer { + /// allow basic_json to access private members + friend class basic_json; + public: /// empty reference token json_pointer() = default; /// nonempty reference token explicit json_pointer(const std::string& s) - { - split(s); - } + : reference_tokens(split(s)) + {} private: - reference get(reference j) const - { - pointer result = &j; - - for (const auto& reference_token : reference_tokens) - { - switch (result->m_type) - { - case value_t::object: - result = &result->at(reference_token); - continue; - - case value_t::array: - result = &result->at(static_cast(std::stoi(reference_token))); - continue; - - default: - throw std::domain_error("unresolved reference token '" + reference_token + "'"); - } - } - - return *result; - } - - reference get2(reference j) const + /*! + @brief create and return a reference to the pointed to value + */ + reference get_and_create(reference j) const { pointer result = &j; @@ -8922,40 +8968,172 @@ basic_json_parser_63: return *result; } - const_reference get(const_reference j) const - { - const_pointer result = &j; + /*! + @brief return a reference to the pointed to value + @param[in] ptr a JSON value + + @return reference to the JSON value pointed to by the JSON pointer + + @complexity Linear in the length of the JSON pointer. + + @throw std::out_of_range if the JSON pointer can not be resolved + */ + reference get_unchecked(pointer ptr) const + { for (const auto& reference_token : reference_tokens) { - switch (result->m_type) + switch (ptr->m_type) { case value_t::object: - result = &result->at(reference_token); - continue; + { + ptr = &ptr->operator[](reference_token); + break; + } case value_t::array: - result = &result->at(static_cast(std::stoi(reference_token))); - continue; + { + if (reference_token == "-") + { + ptr = &ptr->operator[](ptr->m_value.array->size()); + } + else + { + ptr = &ptr->operator[](static_cast(std::stoi(reference_token))); + } + break; + } default: - throw std::domain_error("unresolved reference token '" + reference_token + "'"); + { + throw std::out_of_range("unresolved reference token '" + reference_token + "'"); + } } } - return *result; + return *ptr; } - /// the reference tokens - std::vector reference_tokens {}; + reference get_checked(pointer ptr) const + { + for (const auto& reference_token : reference_tokens) + { + switch (ptr->m_type) + { + case value_t::object: + { + ptr = &ptr->at(reference_token); + break; + } + + case value_t::array: + { + if (reference_token == "-") + { + throw std::out_of_range("cannot resolve reference token '-'"); + } + else + { + ptr = &ptr->at(static_cast(std::stoi(reference_token))); + } + break; + } + + default: + { + throw std::out_of_range("unresolved reference token '" + reference_token + "'"); + } + } + } + + return *ptr; + } + + /*! + @brief return a const reference to the pointed to value + + @param[in] ptr a JSON value + + @return const reference to the JSON value pointed to by the JSON + pointer + */ + const_reference get_unchecked(const_pointer ptr) const + { + for (const auto& reference_token : reference_tokens) + { + switch (ptr->m_type) + { + case value_t::object: + { + ptr = &ptr->operator[](reference_token); + continue; + } + + case value_t::array: + { + if (reference_token == "-") + { + throw std::out_of_range("array index '-' (" + + std::to_string(ptr->m_value.array->size()) + + ") is out of range"); + } + ptr = &ptr->operator[](static_cast(std::stoi(reference_token))); + continue; + } + + default: + { + throw std::out_of_range("unresolved reference token '" + reference_token + "'"); + } + } + } + + return *ptr; + } + + const_reference get_checked(const_pointer ptr) const + { + for (const auto& reference_token : reference_tokens) + { + switch (ptr->m_type) + { + case value_t::object: + { + ptr = &ptr->at(reference_token); + continue; + } + + case value_t::array: + { + if (reference_token == "-") + { + throw std::out_of_range("array index '-' (" + + std::to_string(ptr->m_value.array->size()) + + ") is out of range"); + } + ptr = &ptr->at(static_cast(std::stoi(reference_token))); + continue; + } + + default: + { + throw std::out_of_range("unresolved reference token '" + reference_token + "'"); + } + } + } + + return *ptr; + } /// split the string input to reference tokens - void split(std::string reference_string) + std::vector split(std::string reference_string) { + std::vector result; + // special case: empty reference string -> no reference tokens if (reference_string.empty()) { - return; + return result; } // check if nonempty reference string begins with slash @@ -9006,10 +9184,13 @@ basic_json_parser_63: replace_substring(reference_token, "~0", "~"); // finally, store the reference token - reference_tokens.push_back(reference_token); + result.push_back(reference_token); } + + return result; } + private: /*! @brief replace all occurrences of a substring by another string @@ -9042,6 +9223,8 @@ basic_json_parser_63: @param[in] reference_string the reference string to the current value @param[in] value the value to consider @param[in,out] result the result object to insert values to + + @note Empty objects or arrays are flattened to `null`. */ static void flatten(const std::string reference_string, const basic_json& value, @@ -9051,27 +9234,43 @@ basic_json_parser_63: { case value_t::array: { - // iterate array and use index as reference string - for (size_t i = 0; i < value.m_value.array->size(); ++i) + if (value.m_value.array->empty()) { - flatten(reference_string + "/" + std::to_string(i), - value.m_value.array->operator[](i), result); + // flatten empty array as null + result[reference_string] = nullptr; + } + else + { + // iterate array and use index as reference string + for (size_t i = 0; i < value.m_value.array->size(); ++i) + { + flatten(reference_string + "/" + std::to_string(i), + value.m_value.array->operator[](i), result); + } } break; } case value_t::object: { - // iterate object and use keys as reference string - for (const auto& element : *value.m_value.object) + if (value.m_value.object->empty()) { - // escape "~"" to "~0" and "/" to "~1" - std::string key(element.first); - replace_substring(key, "~", "~0"); - replace_substring(key, "/", "~1"); + // flatten empty object as null + result[reference_string] = nullptr; + } + else + { + // iterate object and use keys as reference string + for (const auto& element : *value.m_value.object) + { + // escape "~"" to "~0" and "/" to "~1" + std::string key(element.first); + replace_substring(key, "~", "~0"); + replace_substring(key, "/", "~1"); - flatten(reference_string + "/" + key, - element.second, result); + flatten(reference_string + "/" + key, + element.second, result); + } } break; } @@ -9088,13 +9287,13 @@ basic_json_parser_63: /*! @param[in] value flattened JSON - @return deflattened JSON + @return unflattened JSON */ - static basic_json deflatten(const basic_json& value) + static basic_json unflatten(const basic_json& value) { if (not value.is_object()) { - throw std::domain_error("only objects can be deflattened"); + throw std::domain_error("only objects can be unflattened"); } basic_json result; @@ -9108,15 +9307,44 @@ basic_json_parser_63: } // assign value to reference pointed to by JSON pointer - json_pointer(element.first).get2(result) = element.second; + json_pointer(element.first).get_and_create(result) = element.second; } return result; } + + private: + /// the reference tokens + const std::vector reference_tokens {}; }; + //////////////////////////// + // JSON Pointer functions // + //////////////////////////// + + /// @name JSON Pointer functions + /// @{ + /*! + @brief return flattened JSON value + + The function creates a JSON object whose keys are JSON pointers (see + [RFC 6901](https://tools.ietf.org/html/rfc6901)) and whose values are all + primitive. The original JSON value can be restored using the + @ref unflatten() function. + @return an object that maps JSON pointers to primitve values + + @note Empty objects and arrays are flattened to `null`. + + @complexity Linear in the size the JSON value. + + @liveexample{The following code shows how a JSON object is flattened to an + object whose keys consist of JSON pointers.,flatten} + + @sa @ref unflatten() for the reverse function + + @since version 2.0.0 */ basic_json flatten() const { @@ -9126,12 +9354,38 @@ basic_json_parser_63: } /*! + @brief unflatten a previously flattened JSON value + + The function restores the arbitrary nesting of a JSON value that has been + flattened before using the @ref flatten() function. The JSON value must + meet certain constraints: + 1. The value must be an object. + 2. The keys must be JSON pointers (see + [RFC 6901](https://tools.ietf.org/html/rfc6901)) + 3. The mapped values must be primitive JSON types. + @return the original JSON from a flattened version + + @note Empty objects and arrays are flattened by @ref flatten() to `null` + values and can not unflattened to their original type. Apart from + this example, for a JSON value `j`, the following is always true: + `j == j.flatten().unflatten()`. + + @complexity Linear in the size the JSON value. + + @liveexample{The following code shows how a flattened JSON object is + unflattened into the original nested JSON object.,unflatten} + + @sa @ref flatten() for the reverse function + + @since version 2.0.0 */ - basic_json deflatten() const + basic_json unflatten() const { - return json_pointer::deflatten(*this); + return json_pointer::unflatten(*this); } + + /// @} }; diff --git a/src/json.hpp.re2c b/src/json.hpp.re2c index 1a049cd52..7fe9673fe 100644 --- a/src/json.hpp.re2c +++ b/src/json.hpp.re2c @@ -3598,23 +3598,86 @@ class basic_json /*! @brief access specified element via JSON Pointer - Returns a reference to the element at with specified JSON pointer @a ptr. + Uses a JSON pointer to retrieve a reference to the respective JSON value. + No bound checking is performed. Similar to + @ref operator[](const typename object_t::key_type&), `null` values + are created in arrays and objects if necessary. - @param p JSON pointer to the desired element + In particular: + - If the JSON pointer points to an object key that does not exist, it + is created an filled with a `null` value before a reference to it + is returned. + - If the JSON pointer points to an array index that does not exist, it + is created an filled with a `null` value before a reference to it + is returned. All indices between the current maximum and the given + index are also filled with `null`. + - The special value `-` is treated as a synonym for the index past the + end. + + @param[in] ptr a JSON pointer + + @return reference to the JSON value pointed to by @a ptr + + @complexity Linear in the length of the JSON pointer. + + @throw std::out_of_range if the JSON pointer can not be resolved + + @liveexample{The behavior is shown in the example.,operatorjson_pointer} @since version 2.0.0 */ reference operator[](const json_pointer& ptr) { - return ptr.get(*this); + return ptr.get_unchecked(this); } /*! - @copydoc basic_json::operator[](const json_pointer&) + @brief access specified element via JSON Pointer + + Uses a JSON pointer to retrieve a reference to the respective JSON value. + No bound checking is performed. The function does not change the JSON + value; no `null` values are created. In particular, the the special value + `-` yields an exception. + + @param[in] ptr a JSON pointer + + @return reference to the JSON value pointed to by @a ptr + + @complexity Linear in the length of the JSON pointer. + + @throw std::out_of_range if the JSON pointer can not be resolved + @throw std::out_of_range if the special value `-` is used for an array + + @liveexample{The behavior is shown in the example., + operatorjson_pointer_const} + + @since version 2.0.0 */ const_reference operator[](const json_pointer& ptr) const { - return ptr.get(*this); + return ptr.get_unchecked(this); + } + + /*! + @brief access specified element via JSON Pointer + + Returns a reference to the element at with specified JSON pointer @a ptr. + + @param ptr JSON pointer to the desired element + + @since version 2.0.0 + */ + reference at(const json_pointer& ptr) + { + return ptr.get_checked(this); + } + + /*! + @copydoc basic_json::at(const json_pointer&) + */ + const_reference at(const json_pointer& ptr) const + { + return ptr.get_checked(this); } /*! @@ -8151,45 +8214,28 @@ class basic_json @brief JSON Pointer @sa [RFC 6901](https://tools.ietf.org/html/rfc6901) + + @since version 2.0.0 */ class json_pointer { + /// allow basic_json to access private members + friend class basic_json; + public: /// empty reference token json_pointer() = default; /// nonempty reference token explicit json_pointer(const std::string& s) - { - split(s); - } + : reference_tokens(split(s)) + {} private: - reference get(reference j) const - { - pointer result = &j; - - for (const auto& reference_token : reference_tokens) - { - switch (result->m_type) - { - case value_t::object: - result = &result->at(reference_token); - continue; - - case value_t::array: - result = &result->at(static_cast(std::stoi(reference_token))); - continue; - - default: - throw std::domain_error("unresolved reference token '" + reference_token + "'"); - } - } - - return *result; - } - - reference get2(reference j) const + /*! + @brief create and return a reference to the pointed to value + */ + reference get_and_create(reference j) const { pointer result = &j; @@ -8232,40 +8278,172 @@ class basic_json return *result; } - const_reference get(const_reference j) const - { - const_pointer result = &j; + /*! + @brief return a reference to the pointed to value + @param[in] ptr a JSON value + + @return reference to the JSON value pointed to by the JSON pointer + + @complexity Linear in the length of the JSON pointer. + + @throw std::out_of_range if the JSON pointer can not be resolved + */ + reference get_unchecked(pointer ptr) const + { for (const auto& reference_token : reference_tokens) { - switch (result->m_type) + switch (ptr->m_type) { case value_t::object: - result = &result->at(reference_token); - continue; + { + ptr = &ptr->operator[](reference_token); + break; + } case value_t::array: - result = &result->at(static_cast(std::stoi(reference_token))); - continue; + { + if (reference_token == "-") + { + ptr = &ptr->operator[](ptr->m_value.array->size()); + } + else + { + ptr = &ptr->operator[](static_cast(std::stoi(reference_token))); + } + break; + } default: - throw std::domain_error("unresolved reference token '" + reference_token + "'"); + { + throw std::out_of_range("unresolved reference token '" + reference_token + "'"); + } } } - return *result; + return *ptr; } - /// the reference tokens - std::vector reference_tokens {}; + reference get_checked(pointer ptr) const + { + for (const auto& reference_token : reference_tokens) + { + switch (ptr->m_type) + { + case value_t::object: + { + ptr = &ptr->at(reference_token); + break; + } + + case value_t::array: + { + if (reference_token == "-") + { + throw std::out_of_range("cannot resolve reference token '-'"); + } + else + { + ptr = &ptr->at(static_cast(std::stoi(reference_token))); + } + break; + } + + default: + { + throw std::out_of_range("unresolved reference token '" + reference_token + "'"); + } + } + } + + return *ptr; + } + + /*! + @brief return a const reference to the pointed to value + + @param[in] ptr a JSON value + + @return const reference to the JSON value pointed to by the JSON + pointer + */ + const_reference get_unchecked(const_pointer ptr) const + { + for (const auto& reference_token : reference_tokens) + { + switch (ptr->m_type) + { + case value_t::object: + { + ptr = &ptr->operator[](reference_token); + continue; + } + + case value_t::array: + { + if (reference_token == "-") + { + throw std::out_of_range("array index '-' (" + + std::to_string(ptr->m_value.array->size()) + + ") is out of range"); + } + ptr = &ptr->operator[](static_cast(std::stoi(reference_token))); + continue; + } + + default: + { + throw std::out_of_range("unresolved reference token '" + reference_token + "'"); + } + } + } + + return *ptr; + } + + const_reference get_checked(const_pointer ptr) const + { + for (const auto& reference_token : reference_tokens) + { + switch (ptr->m_type) + { + case value_t::object: + { + ptr = &ptr->at(reference_token); + continue; + } + + case value_t::array: + { + if (reference_token == "-") + { + throw std::out_of_range("array index '-' (" + + std::to_string(ptr->m_value.array->size()) + + ") is out of range"); + } + ptr = &ptr->at(static_cast(std::stoi(reference_token))); + continue; + } + + default: + { + throw std::out_of_range("unresolved reference token '" + reference_token + "'"); + } + } + } + + return *ptr; + } /// split the string input to reference tokens - void split(std::string reference_string) + std::vector split(std::string reference_string) { + std::vector result; + // special case: empty reference string -> no reference tokens if (reference_string.empty()) { - return; + return result; } // check if nonempty reference string begins with slash @@ -8316,10 +8494,13 @@ class basic_json replace_substring(reference_token, "~0", "~"); // finally, store the reference token - reference_tokens.push_back(reference_token); + result.push_back(reference_token); } + + return result; } + private: /*! @brief replace all occurrences of a substring by another string @@ -8352,6 +8533,8 @@ class basic_json @param[in] reference_string the reference string to the current value @param[in] value the value to consider @param[in,out] result the result object to insert values to + + @note Empty objects or arrays are flattened to `null`. */ static void flatten(const std::string reference_string, const basic_json& value, @@ -8361,27 +8544,43 @@ class basic_json { case value_t::array: { - // iterate array and use index as reference string - for (size_t i = 0; i < value.m_value.array->size(); ++i) + if (value.m_value.array->empty()) { - flatten(reference_string + "/" + std::to_string(i), - value.m_value.array->operator[](i), result); + // flatten empty array as null + result[reference_string] = nullptr; + } + else + { + // iterate array and use index as reference string + for (size_t i = 0; i < value.m_value.array->size(); ++i) + { + flatten(reference_string + "/" + std::to_string(i), + value.m_value.array->operator[](i), result); + } } break; } case value_t::object: { - // iterate object and use keys as reference string - for (const auto& element : *value.m_value.object) + if (value.m_value.object->empty()) { - // escape "~"" to "~0" and "/" to "~1" - std::string key(element.first); - replace_substring(key, "~", "~0"); - replace_substring(key, "/", "~1"); + // flatten empty object as null + result[reference_string] = nullptr; + } + else + { + // iterate object and use keys as reference string + for (const auto& element : *value.m_value.object) + { + // escape "~"" to "~0" and "/" to "~1" + std::string key(element.first); + replace_substring(key, "~", "~0"); + replace_substring(key, "/", "~1"); - flatten(reference_string + "/" + key, - element.second, result); + flatten(reference_string + "/" + key, + element.second, result); + } } break; } @@ -8398,13 +8597,13 @@ class basic_json /*! @param[in] value flattened JSON - @return deflattened JSON + @return unflattened JSON */ - static basic_json deflatten(const basic_json& value) + static basic_json unflatten(const basic_json& value) { if (not value.is_object()) { - throw std::domain_error("only objects can be deflattened"); + throw std::domain_error("only objects can be unflattened"); } basic_json result; @@ -8418,15 +8617,44 @@ class basic_json } // assign value to reference pointed to by JSON pointer - json_pointer(element.first).get2(result) = element.second; + json_pointer(element.first).get_and_create(result) = element.second; } return result; } + + private: + /// the reference tokens + const std::vector reference_tokens {}; }; + //////////////////////////// + // JSON Pointer functions // + //////////////////////////// + + /// @name JSON Pointer functions + /// @{ + /*! + @brief return flattened JSON value + + The function creates a JSON object whose keys are JSON pointers (see + [RFC 6901](https://tools.ietf.org/html/rfc6901)) and whose values are all + primitive. The original JSON value can be restored using the + @ref unflatten() function. + @return an object that maps JSON pointers to primitve values + + @note Empty objects and arrays are flattened to `null`. + + @complexity Linear in the size the JSON value. + + @liveexample{The following code shows how a JSON object is flattened to an + object whose keys consist of JSON pointers.,flatten} + + @sa @ref unflatten() for the reverse function + + @since version 2.0.0 */ basic_json flatten() const { @@ -8436,12 +8664,38 @@ class basic_json } /*! + @brief unflatten a previously flattened JSON value + + The function restores the arbitrary nesting of a JSON value that has been + flattened before using the @ref flatten() function. The JSON value must + meet certain constraints: + 1. The value must be an object. + 2. The keys must be JSON pointers (see + [RFC 6901](https://tools.ietf.org/html/rfc6901)) + 3. The mapped values must be primitive JSON types. + @return the original JSON from a flattened version + + @note Empty objects and arrays are flattened by @ref flatten() to `null` + values and can not unflattened to their original type. Apart from + this example, for a JSON value `j`, the following is always true: + `j == j.flatten().unflatten()`. + + @complexity Linear in the size the JSON value. + + @liveexample{The following code shows how a flattened JSON object is + unflattened into the original nested JSON object.,unflatten} + + @sa @ref flatten() for the reverse function + + @since version 2.0.0 */ - basic_json deflatten() const + basic_json unflatten() const { - return json_pointer::deflatten(*this); + return json_pointer::unflatten(*this); } + + /// @} }; diff --git a/test/unit.cpp b/test/unit.cpp index 1ace40d08..a3b9035d2 100644 --- a/test/unit.cpp +++ b/test/unit.cpp @@ -12054,119 +12054,195 @@ TEST_CASE("Unicode", "[hide]") TEST_CASE("JSON pointers") { + SECTION("errors") + { + CHECK_THROWS_AS(json::json_pointer("foo"), std::domain_error); + CHECK_THROWS_WITH(json::json_pointer("foo"), "JSON pointer must be empty or begin with '/'"); + + CHECK_THROWS_AS(json::json_pointer("/~~"), std::domain_error); + CHECK_THROWS_WITH(json::json_pointer("/~~"), "escape error: '~' must be followed with '0' or '1'"); + + CHECK_THROWS_AS(json::json_pointer("/~"), std::domain_error); + CHECK_THROWS_WITH(json::json_pointer("/~"), "escape error: '~' must be followed with '0' or '1'"); + } + SECTION("examples from RFC 6901") { - json j = R"( - { - "foo": ["bar", "baz"], - "": 0, - "a/b": 1, - "c%d": 2, - "e^f": 3, - "g|h": 4, - "i\\j": 5, - "k\"l": 6, - " ": 7, - "m~n": 8 - } - )"_json; - - const json j_const = j; - SECTION("nonconst access") { + json j = R"( + { + "foo": ["bar", "baz"], + "": 0, + "a/b": 1, + "c%d": 2, + "e^f": 3, + "g|h": 4, + "i\\j": 5, + "k\"l": 6, + " ": 7, + "m~n": 8 + } + )"_json; + // the whole document - CHECK(json::json_pointer().get(j) == j); - CHECK(json::json_pointer("").get(j) == j); CHECK(j[json::json_pointer()] == j); CHECK(j[json::json_pointer("")] == j); // array access - CHECK(json::json_pointer("/foo").get(j) == j["foo"]); - CHECK(json::json_pointer("/foo/0").get(j) == j["foo"][0]); - CHECK(json::json_pointer("/foo/1").get(j) == j["foo"][1]); CHECK(j[json::json_pointer("/foo")] == j["foo"]); CHECK(j[json::json_pointer("/foo/0")] == j["foo"][0]); CHECK(j[json::json_pointer("/foo/1")] == j["foo"][1]); CHECK(j["/foo/1"_json_pointer] == j["foo"][1]); // empty string access - CHECK(json::json_pointer("/").get(j) == j[""]); + CHECK(j[json::json_pointer("/")] == j[""]); // other cases - CHECK(json::json_pointer("/ ").get(j) == j[" "]); - CHECK(json::json_pointer("/c%d").get(j) == j["c%d"]); - CHECK(json::json_pointer("/e^f").get(j) == j["e^f"]); - CHECK(json::json_pointer("/g|h").get(j) == j["g|h"]); - CHECK(json::json_pointer("/i\\j").get(j) == j["i\\j"]); - CHECK(json::json_pointer("/k\"l").get(j) == j["k\"l"]); + CHECK(j[json::json_pointer("/ ")] == j[" "]); + CHECK(j[json::json_pointer("/c%d")] == j["c%d"]); + CHECK(j[json::json_pointer("/e^f")] == j["e^f"]); + CHECK(j[json::json_pointer("/g|h")] == j["g|h"]); + CHECK(j[json::json_pointer("/i\\j")] == j["i\\j"]); + CHECK(j[json::json_pointer("/k\"l")] == j["k\"l"]); // escaped access - CHECK(json::json_pointer("/a~1b").get(j) == j["a/b"]); - CHECK(json::json_pointer("/m~0n").get(j) == j["m~n"]); + CHECK(j[json::json_pointer("/a~1b")] == j["a/b"]); + CHECK(j[json::json_pointer("/m~0n")] == j["m~n"]); // unescaped access - CHECK_THROWS_AS(json::json_pointer("/a/b").get(j), std::out_of_range); - CHECK_THROWS_WITH(json::json_pointer("/a/b").get(j), "key 'a' not found"); + CHECK_THROWS_AS(j[json::json_pointer("/a/b")], std::out_of_range); + CHECK_THROWS_WITH(j[json::json_pointer("/a/b")], "unresolved reference token 'b'"); // "/a/b" works for JSON {"a": {"b": 42}} - CHECK(json::json_pointer("/a/b").get({{"a", {{"b", 42}}}}) == json(42)); + CHECK(json({{"a", {{"b", 42}}}})[json::json_pointer("/a/b")] == json(42)); } SECTION("const access") { + const json j = R"( + { + "foo": ["bar", "baz"], + "": 0, + "a/b": 1, + "c%d": 2, + "e^f": 3, + "g|h": 4, + "i\\j": 5, + "k\"l": 6, + " ": 7, + "m~n": 8 + } + )"_json; + // the whole document - CHECK(json::json_pointer().get(j_const) == j_const); - CHECK(json::json_pointer("").get(j_const) == j_const); + CHECK(j[json::json_pointer()] == j); + CHECK(j[json::json_pointer("")] == j); // array access - CHECK(json::json_pointer("/foo").get(j_const) == j_const["foo"]); - CHECK(json::json_pointer("/foo/0").get(j_const) == j_const["foo"][0]); - CHECK(json::json_pointer("/foo/1").get(j_const) == j_const["foo"][1]); + CHECK(j[json::json_pointer("/foo")] == j["foo"]); + CHECK(j[json::json_pointer("/foo/0")] == j["foo"][0]); + CHECK(j[json::json_pointer("/foo/1")] == j["foo"][1]); + CHECK(j["/foo/1"_json_pointer] == j["foo"][1]); // empty string access - CHECK(json::json_pointer("/").get(j_const) == j_const[""]); + CHECK(j[json::json_pointer("/")] == j[""]); // other cases - CHECK(json::json_pointer("/ ").get(j_const) == j_const[" "]); - CHECK(json::json_pointer("/c%d").get(j_const) == j_const["c%d"]); - CHECK(json::json_pointer("/e^f").get(j_const) == j_const["e^f"]); - CHECK(json::json_pointer("/g|h").get(j_const) == j_const["g|h"]); - CHECK(json::json_pointer("/i\\j").get(j_const) == j_const["i\\j"]); - CHECK(json::json_pointer("/k\"l").get(j_const) == j_const["k\"l"]); + CHECK(j[json::json_pointer("/ ")] == j[" "]); + CHECK(j[json::json_pointer("/c%d")] == j["c%d"]); + CHECK(j[json::json_pointer("/e^f")] == j["e^f"]); + CHECK(j[json::json_pointer("/g|h")] == j["g|h"]); + CHECK(j[json::json_pointer("/i\\j")] == j["i\\j"]); + CHECK(j[json::json_pointer("/k\"l")] == j["k\"l"]); // escaped access - CHECK(json::json_pointer("/a~1b").get(j_const) == j_const["a/b"]); - CHECK(json::json_pointer("/m~0n").get(j_const) == j_const["m~n"]); + CHECK(j[json::json_pointer("/a~1b")] == j["a/b"]); + CHECK(j[json::json_pointer("/m~0n")] == j["m~n"]); // unescaped access - CHECK_THROWS_AS(json::json_pointer("/a/b").get(j), std::out_of_range); - CHECK_THROWS_WITH(json::json_pointer("/a/b").get(j), "key 'a' not found"); - // "/a/b" works for JSON {"a": {"b": 42}} - CHECK(json::json_pointer("/a/b").get({{"a", {{"b", 42}}}}) == json(42)); + CHECK_THROWS_AS(j.at(json::json_pointer("/a/b")), std::out_of_range); + CHECK_THROWS_WITH(j.at(json::json_pointer("/a/b")), "key 'a' not found"); } SECTION("user-defined string literal") { + json j = R"( + { + "foo": ["bar", "baz"], + "": 0, + "a/b": 1, + "c%d": 2, + "e^f": 3, + "g|h": 4, + "i\\j": 5, + "k\"l": 6, + " ": 7, + "m~n": 8 + } + )"_json; + // the whole document - CHECK(""_json_pointer.get(j) == j); + CHECK(j[""_json_pointer] == j); // array access - CHECK("/foo"_json_pointer.get(j) == j["foo"]); - CHECK("/foo/0"_json_pointer.get(j) == j["foo"][0]); - CHECK("/foo/1"_json_pointer.get(j) == j["foo"][1]); + CHECK(j["/foo"_json_pointer] == j["foo"]); + CHECK(j["/foo/0"_json_pointer] == j["foo"][0]); + CHECK(j["/foo/1"_json_pointer] == j["foo"][1]); } + } - SECTION("errors") + SECTION("array access") + { + SECTION("nonconst access") { - CHECK_THROWS_AS(json::json_pointer("foo"), std::domain_error); - CHECK_THROWS_WITH(json::json_pointer("foo"), "JSON pointer must be empty or begin with '/'"); + json j = {1, 2, 3}; - CHECK_THROWS_AS(json::json_pointer("/~~"), std::domain_error); - CHECK_THROWS_WITH(json::json_pointer("/~~"), "escape error: '~' must be followed with '0' or '1'"); + // check reading access + CHECK(j["/0"_json_pointer] == j[0]); + CHECK(j["/1"_json_pointer] == j[1]); + CHECK(j["/2"_json_pointer] == j[2]); - CHECK_THROWS_AS(json::json_pointer("/~"), std::domain_error); - CHECK_THROWS_WITH(json::json_pointer("/~"), "escape error: '~' must be followed with '0' or '1'"); + // assign to existing index + j["/1"_json_pointer] = 13; + CHECK(j[1] == json(13)); + + // assign to nonexisting index + j["/3"_json_pointer] = 33; + CHECK(j[3] == json(33)); + + // assign to nonexisting index (with gap) + j["/5"_json_pointer] = 55; + CHECK(j == json({1, 13, 3, 33, nullptr, 55})); + + // assign to "-" + j["/-"_json_pointer] = 99; + CHECK(j == json({1, 13, 3, 33, nullptr, 55, 99})); } + + SECTION("const access") + { + const json j = {1, 2, 3}; + + // check reading access + CHECK(j["/0"_json_pointer] == j[0]); + CHECK(j["/1"_json_pointer] == j[1]); + CHECK(j["/2"_json_pointer] == j[2]); + + // assign to nonexisting index + CHECK_THROWS_AS(j.at("/3"_json_pointer), std::out_of_range); + CHECK_THROWS_WITH(j.at("/3"_json_pointer), "array index 3 is out of range"); + + // assign to nonexisting index (with gap) + CHECK_THROWS_AS(j.at("/5"_json_pointer), std::out_of_range); + CHECK_THROWS_WITH(j.at("/5"_json_pointer), "array index 5 is out of range"); + + // assign to "-" + CHECK_THROWS_AS(j["/-"_json_pointer], std::out_of_range); + CHECK_THROWS_WITH(j["/-"_json_pointer], "array index '-' (3) is out of range"); + CHECK_THROWS_AS(j.at("/-"_json_pointer), std::out_of_range); + CHECK_THROWS_WITH(j.at("/-"_json_pointer), "array index '-' (3) is out of range"); + } + } SECTION("flatten") @@ -12216,21 +12292,27 @@ TEST_CASE("JSON pointers") // check if flattened result is as expected CHECK(j.flatten() == j_flatten); - // check if deflattened result is as expected - CHECK(j_flatten.deflatten() == j); + // check if unflattened result is as expected + CHECK(j_flatten.unflatten() == j); // explicit roundtrip check - CHECK(j.flatten().deflatten() == j); + CHECK(j.flatten().unflatten() == j); // roundtrip for primitive values json j_null; - CHECK(j_null.flatten().deflatten() == j_null); + CHECK(j_null.flatten().unflatten() == j_null); json j_number = 42; - CHECK(j_number.flatten().deflatten() == j_number); + CHECK(j_number.flatten().unflatten() == j_number); json j_boolean = false; - CHECK(j_boolean.flatten().deflatten() == j_boolean); + CHECK(j_boolean.flatten().unflatten() == j_boolean); json j_string = "foo"; - CHECK(j_string.flatten().deflatten() == j_string); + CHECK(j_string.flatten().unflatten() == j_string); + + // roundtrip for empty structured values (will be unflattened to null) + json j_array(json::value_t::array); + CHECK(j_array.flatten().unflatten() == json()); + json j_object(json::value_t::object); + CHECK(j_object.flatten().unflatten() == json()); } } From f883a04c87dd3c3ccd3828172dfe9160376cda67 Mon Sep 17 00:00:00 2001 From: Niels Date: Sun, 17 Apr 2016 18:18:49 +0200 Subject: [PATCH 012/133] more documentation --- doc/examples/json_pointer.cpp | 46 ++++++++++++++++++++++++++++++++ doc/examples/json_pointer.link | 1 + doc/examples/json_pointer.output | 3 +++ src/json.hpp | 37 +++++++++++++++++-------- src/json.hpp.re2c | 37 +++++++++++++++++-------- 5 files changed, 102 insertions(+), 22 deletions(-) create mode 100644 doc/examples/json_pointer.cpp create mode 100644 doc/examples/json_pointer.link create mode 100644 doc/examples/json_pointer.output diff --git a/doc/examples/json_pointer.cpp b/doc/examples/json_pointer.cpp new file mode 100644 index 000000000..140eac3b6 --- /dev/null +++ b/doc/examples/json_pointer.cpp @@ -0,0 +1,46 @@ +#include + +using json = nlohmann::json; + +int main() +{ + // correct JSON pointers + json::json_pointer p1; + json::json_pointer p2(""); + json::json_pointer p3("/"); + json::json_pointer p4("//"); + json::json_pointer p5("/foo/bar"); + json::json_pointer p6("/foo/bar/-"); + json::json_pointer p7("/foo/~0"); + json::json_pointer p8("/foo/~1"); + + // error: JSON pointer does not begin with a slash + try + { + json::json_pointer p9("foo"); + } + catch (std::domain_error& e) + { + std::cout << "domain_error: " << e.what() << '\n'; + } + + // error: JSON pointer uses escape symbol ~ not followed by 0 or 1 + try + { + json::json_pointer p10("/foo/~"); + } + catch (std::domain_error& e) + { + std::cout << "domain_error: " << e.what() << '\n'; + } + + // error: JSON pointer uses escape symbol ~ not followed by 0 or 1 + try + { + json::json_pointer p11("/foo/~3"); + } + catch (std::domain_error& e) + { + std::cout << "domain_error: " << e.what() << '\n'; + } +} diff --git a/doc/examples/json_pointer.link b/doc/examples/json_pointer.link new file mode 100644 index 000000000..c10c5fb9e --- /dev/null +++ b/doc/examples/json_pointer.link @@ -0,0 +1 @@ +online \ No newline at end of file diff --git a/doc/examples/json_pointer.output b/doc/examples/json_pointer.output new file mode 100644 index 000000000..b81c8a201 --- /dev/null +++ b/doc/examples/json_pointer.output @@ -0,0 +1,3 @@ +domain_error: JSON pointer must be empty or begin with '/' +domain_error: escape error: '~' must be followed with '0' or '1' +domain_error: escape error: '~' must be followed with '0' or '1' diff --git a/src/json.hpp b/src/json.hpp index 6cf369bd9..c40e004a9 100644 --- a/src/json.hpp +++ b/src/json.hpp @@ -8913,11 +8913,26 @@ basic_json_parser_63: friend class basic_json; public: - /// empty reference token - json_pointer() = default; + /*! + @brief create JSON pointer - /// nonempty reference token - explicit json_pointer(const std::string& s) + Create a JSON pointer according to the syntax described in + [Section 3 of RFC6901](https://tools.ietf.org/html/rfc6901#section-3). + + @param[in] s string representing the JSON pointer; if omitted, the + empty string is assumed which references the whole JSON + value + + @throw std::domain_error if reference token is nonempty and does not + begin with a slash (`/`), or if a tilde (`~`) is not followed + by `0` (representing `~`) or `1` (representing `/`). + + @liveexample{The example shows the construction several valid JSON + pointers as well as the exceptional behavior.,json_pointer} + + @since version 2.0.0 + */ + explicit json_pointer(const std::string& s = "") : reference_tokens(split(s)) {} @@ -8943,19 +8958,19 @@ basic_json_parser_63: { result = &result->operator[](reference_token); } - continue; + break; } case value_t::object: { result = &result->operator[](reference_token); - continue; + break; } case value_t::array: { result = &result->operator[](static_cast(std::stoi(reference_token))); - continue; + break; } default: @@ -9066,7 +9081,7 @@ basic_json_parser_63: case value_t::object: { ptr = &ptr->operator[](reference_token); - continue; + break; } case value_t::array: @@ -9078,7 +9093,7 @@ basic_json_parser_63: ") is out of range"); } ptr = &ptr->operator[](static_cast(std::stoi(reference_token))); - continue; + break; } default: @@ -9100,7 +9115,7 @@ basic_json_parser_63: case value_t::object: { ptr = &ptr->at(reference_token); - continue; + break; } case value_t::array: @@ -9112,7 +9127,7 @@ basic_json_parser_63: ") is out of range"); } ptr = &ptr->at(static_cast(std::stoi(reference_token))); - continue; + break; } default: diff --git a/src/json.hpp.re2c b/src/json.hpp.re2c index 7fe9673fe..e2ea78b6a 100644 --- a/src/json.hpp.re2c +++ b/src/json.hpp.re2c @@ -8223,11 +8223,26 @@ class basic_json friend class basic_json; public: - /// empty reference token - json_pointer() = default; + /*! + @brief create JSON pointer - /// nonempty reference token - explicit json_pointer(const std::string& s) + Create a JSON pointer according to the syntax described in + [Section 3 of RFC6901](https://tools.ietf.org/html/rfc6901#section-3). + + @param[in] s string representing the JSON pointer; if omitted, the + empty string is assumed which references the whole JSON + value + + @throw std::domain_error if reference token is nonempty and does not + begin with a slash (`/`), or if a tilde (`~`) is not followed + by `0` (representing `~`) or `1` (representing `/`). + + @liveexample{The example shows the construction several valid JSON + pointers as well as the exceptional behavior.,json_pointer} + + @since version 2.0.0 + */ + explicit json_pointer(const std::string& s = "") : reference_tokens(split(s)) {} @@ -8253,19 +8268,19 @@ class basic_json { result = &result->operator[](reference_token); } - continue; + break; } case value_t::object: { result = &result->operator[](reference_token); - continue; + break; } case value_t::array: { result = &result->operator[](static_cast(std::stoi(reference_token))); - continue; + break; } default: @@ -8376,7 +8391,7 @@ class basic_json case value_t::object: { ptr = &ptr->operator[](reference_token); - continue; + break; } case value_t::array: @@ -8388,7 +8403,7 @@ class basic_json ") is out of range"); } ptr = &ptr->operator[](static_cast(std::stoi(reference_token))); - continue; + break; } default: @@ -8410,7 +8425,7 @@ class basic_json case value_t::object: { ptr = &ptr->at(reference_token); - continue; + break; } case value_t::array: @@ -8422,7 +8437,7 @@ class basic_json ") is out of range"); } ptr = &ptr->at(static_cast(std::stoi(reference_token))); - continue; + break; } default: From 0835eb293ffa80bab9591fe55656d57d76805f40 Mon Sep 17 00:00:00 2001 From: Niels Date: Sun, 17 Apr 2016 18:54:54 +0200 Subject: [PATCH 013/133] improved RFC compliance and code coverage --- src/json.hpp | 48 +++++++++++++++++++++++++++++++++++++++++++---- src/json.hpp.re2c | 48 +++++++++++++++++++++++++++++++++++++++++++---- test/unit.cpp | 24 ++++++++++++++++++++++++ 3 files changed, 112 insertions(+), 8 deletions(-) diff --git a/src/json.hpp b/src/json.hpp index c40e004a9..47046c03f 100644 --- a/src/json.hpp +++ b/src/json.hpp @@ -8992,7 +8992,9 @@ basic_json_parser_63: @complexity Linear in the length of the JSON pointer. - @throw std::out_of_range if the JSON pointer can not be resolved + @throw std::out_of_range if the JSON pointer can not be resolved + @throw std::domain_error if an array index begins with '0' + @throw std::invalid_argument if an array index was not a number */ reference get_unchecked(pointer ptr) const { @@ -9002,18 +9004,27 @@ basic_json_parser_63: { case value_t::object: { + // use unchecked object access ptr = &ptr->operator[](reference_token); break; } case value_t::array: { + // error condition (cf. RFC 6901, Sect. 4) + if (reference_token.size() > 1 and reference_token[0] == '0') + { + throw std::domain_error("array index must not begin with '0'"); + } + if (reference_token == "-") { + // explicityly treat "-" as index beyond the end ptr = &ptr->operator[](ptr->m_value.array->size()); } else { + // convert array index to number; unchecked access ptr = &ptr->operator[](static_cast(std::stoi(reference_token))); } break; @@ -9037,6 +9048,7 @@ basic_json_parser_63: { case value_t::object: { + // note: at performs range check ptr = &ptr->at(reference_token); break; } @@ -9045,12 +9057,20 @@ basic_json_parser_63: { if (reference_token == "-") { - throw std::out_of_range("cannot resolve reference token '-'"); + // "-" always fails the range check + throw std::out_of_range("array index '-' (" + + std::to_string(ptr->m_value.array->size()) + + ") is out of range"); } - else + + // error condition (cf. RFC 6901, Sect. 4) + if (reference_token.size() > 1 and reference_token[0] == '0') { - ptr = &ptr->at(static_cast(std::stoi(reference_token))); + throw std::domain_error("array index must not begin with '0'"); } + + // note: at performs range check + ptr = &ptr->at(static_cast(std::stoi(reference_token))); break; } @@ -9080,6 +9100,7 @@ basic_json_parser_63: { case value_t::object: { + // use unchecked object access ptr = &ptr->operator[](reference_token); break; } @@ -9088,10 +9109,19 @@ basic_json_parser_63: { if (reference_token == "-") { + // "-" cannot be used for const access throw std::out_of_range("array index '-' (" + std::to_string(ptr->m_value.array->size()) + ") is out of range"); } + + // error condition (cf. RFC 6901, Sect. 4) + if (reference_token.size() > 1 and reference_token[0] == '0') + { + throw std::domain_error("array index must not begin with '0'"); + } + + // use unchecked array access ptr = &ptr->operator[](static_cast(std::stoi(reference_token))); break; } @@ -9114,6 +9144,7 @@ basic_json_parser_63: { case value_t::object: { + // note: at performs range check ptr = &ptr->at(reference_token); break; } @@ -9122,10 +9153,19 @@ basic_json_parser_63: { if (reference_token == "-") { + // "-" always fails the range check throw std::out_of_range("array index '-' (" + std::to_string(ptr->m_value.array->size()) + ") is out of range"); } + + // error condition (cf. RFC 6901, Sect. 4) + if (reference_token.size() > 1 and reference_token[0] == '0') + { + throw std::domain_error("array index must not begin with '0'"); + } + + // note: at performs range check ptr = &ptr->at(static_cast(std::stoi(reference_token))); break; } diff --git a/src/json.hpp.re2c b/src/json.hpp.re2c index e2ea78b6a..ac11f08ab 100644 --- a/src/json.hpp.re2c +++ b/src/json.hpp.re2c @@ -8302,7 +8302,9 @@ class basic_json @complexity Linear in the length of the JSON pointer. - @throw std::out_of_range if the JSON pointer can not be resolved + @throw std::out_of_range if the JSON pointer can not be resolved + @throw std::domain_error if an array index begins with '0' + @throw std::invalid_argument if an array index was not a number */ reference get_unchecked(pointer ptr) const { @@ -8312,18 +8314,27 @@ class basic_json { case value_t::object: { + // use unchecked object access ptr = &ptr->operator[](reference_token); break; } case value_t::array: { + // error condition (cf. RFC 6901, Sect. 4) + if (reference_token.size() > 1 and reference_token[0] == '0') + { + throw std::domain_error("array index must not begin with '0'"); + } + if (reference_token == "-") { + // explicityly treat "-" as index beyond the end ptr = &ptr->operator[](ptr->m_value.array->size()); } else { + // convert array index to number; unchecked access ptr = &ptr->operator[](static_cast(std::stoi(reference_token))); } break; @@ -8347,6 +8358,7 @@ class basic_json { case value_t::object: { + // note: at performs range check ptr = &ptr->at(reference_token); break; } @@ -8355,12 +8367,20 @@ class basic_json { if (reference_token == "-") { - throw std::out_of_range("cannot resolve reference token '-'"); + // "-" always fails the range check + throw std::out_of_range("array index '-' (" + + std::to_string(ptr->m_value.array->size()) + + ") is out of range"); } - else + + // error condition (cf. RFC 6901, Sect. 4) + if (reference_token.size() > 1 and reference_token[0] == '0') { - ptr = &ptr->at(static_cast(std::stoi(reference_token))); + throw std::domain_error("array index must not begin with '0'"); } + + // note: at performs range check + ptr = &ptr->at(static_cast(std::stoi(reference_token))); break; } @@ -8390,6 +8410,7 @@ class basic_json { case value_t::object: { + // use unchecked object access ptr = &ptr->operator[](reference_token); break; } @@ -8398,10 +8419,19 @@ class basic_json { if (reference_token == "-") { + // "-" cannot be used for const access throw std::out_of_range("array index '-' (" + std::to_string(ptr->m_value.array->size()) + ") is out of range"); } + + // error condition (cf. RFC 6901, Sect. 4) + if (reference_token.size() > 1 and reference_token[0] == '0') + { + throw std::domain_error("array index must not begin with '0'"); + } + + // use unchecked array access ptr = &ptr->operator[](static_cast(std::stoi(reference_token))); break; } @@ -8424,6 +8454,7 @@ class basic_json { case value_t::object: { + // note: at performs range check ptr = &ptr->at(reference_token); break; } @@ -8432,10 +8463,19 @@ class basic_json { if (reference_token == "-") { + // "-" always fails the range check throw std::out_of_range("array index '-' (" + std::to_string(ptr->m_value.array->size()) + ") is out of range"); } + + // error condition (cf. RFC 6901, Sect. 4) + if (reference_token.size() > 1 and reference_token[0] == '0') + { + throw std::domain_error("array index must not begin with '0'"); + } + + // note: at performs range check ptr = &ptr->at(static_cast(std::stoi(reference_token))); break; } diff --git a/test/unit.cpp b/test/unit.cpp index a3b9035d2..f4d162e1a 100644 --- a/test/unit.cpp +++ b/test/unit.cpp @@ -12196,6 +12196,7 @@ TEST_CASE("JSON pointers") SECTION("nonconst access") { json j = {1, 2, 3}; + const json j_const = j; // check reading access CHECK(j["/0"_json_pointer] == j[0]); @@ -12214,9 +12215,32 @@ TEST_CASE("JSON pointers") j["/5"_json_pointer] = 55; CHECK(j == json({1, 13, 3, 33, nullptr, 55})); + // error with leading 0 + CHECK_THROWS_AS(j["/01"_json_pointer], std::domain_error); + CHECK_THROWS_WITH(j["/01"_json_pointer], "array index must not begin with '0'"); + CHECK_THROWS_AS(j_const["/01"_json_pointer], std::domain_error); + CHECK_THROWS_WITH(j_const["/01"_json_pointer], "array index must not begin with '0'"); + CHECK_THROWS_AS(j.at("/01"_json_pointer), std::domain_error); + CHECK_THROWS_WITH(j.at("/01"_json_pointer), "array index must not begin with '0'"); + CHECK_THROWS_AS(j_const.at("/01"_json_pointer), std::domain_error); + CHECK_THROWS_WITH(j_const.at("/01"_json_pointer), "array index must not begin with '0'"); + + // error with incorrect numbers + CHECK_THROWS_AS(j["/one"_json_pointer] = 1, std::invalid_argument); + // assign to "-" j["/-"_json_pointer] = 99; CHECK(j == json({1, 13, 3, 33, nullptr, 55, 99})); + + // error when using "-" in const object + CHECK_THROWS_AS(j_const["/-"_json_pointer], std::out_of_range); + CHECK_THROWS_WITH(j_const["/-"_json_pointer], "array index '-' (3) is out of range"); + + // error when using "-" with at + CHECK_THROWS_AS(j.at("/-"_json_pointer), std::out_of_range); + CHECK_THROWS_WITH(j.at("/-"_json_pointer), "array index '-' (7) is out of range"); + CHECK_THROWS_AS(j_const.at("/-"_json_pointer), std::out_of_range); + CHECK_THROWS_WITH(j_const.at("/-"_json_pointer), "array index '-' (3) is out of range"); } SECTION("const access") From 7034ae2486fa58a2cf31bfc86c42f4c07a6e7b23 Mon Sep 17 00:00:00 2001 From: Niels Date: Sun, 17 Apr 2016 19:12:12 +0200 Subject: [PATCH 014/133] improved test coverage --- test/unit.cpp | 46 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) diff --git a/test/unit.cpp b/test/unit.cpp index f4d162e1a..f79a29fdc 100644 --- a/test/unit.cpp +++ b/test/unit.cpp @@ -12095,6 +12095,10 @@ TEST_CASE("JSON pointers") CHECK(j[json::json_pointer("/foo/1")] == j["foo"][1]); CHECK(j["/foo/1"_json_pointer] == j["foo"][1]); + // checked array access + CHECK(j.at(json::json_pointer("/foo/0")) == j["foo"][0]); + CHECK(j.at(json::json_pointer("/foo/1")) == j["foo"][1]); + // empty string access CHECK(j[json::json_pointer("/")] == j[""]); @@ -12106,6 +12110,14 @@ TEST_CASE("JSON pointers") CHECK(j[json::json_pointer("/i\\j")] == j["i\\j"]); CHECK(j[json::json_pointer("/k\"l")] == j["k\"l"]); + // checked access + CHECK(j.at(json::json_pointer("/ ")) == j[" "]); + CHECK(j.at(json::json_pointer("/c%d")) == j["c%d"]); + CHECK(j.at(json::json_pointer("/e^f")) == j["e^f"]); + CHECK(j.at(json::json_pointer("/g|h")) == j["g|h"]); + CHECK(j.at(json::json_pointer("/i\\j")) == j["i\\j"]); + CHECK(j.at(json::json_pointer("/k\"l")) == j["k\"l"]); + // escaped access CHECK(j[json::json_pointer("/a~1b")] == j["a/b"]); CHECK(j[json::json_pointer("/m~0n")] == j["m~n"]); @@ -12115,6 +12127,13 @@ TEST_CASE("JSON pointers") CHECK_THROWS_WITH(j[json::json_pointer("/a/b")], "unresolved reference token 'b'"); // "/a/b" works for JSON {"a": {"b": 42}} CHECK(json({{"a", {{"b", 42}}}})[json::json_pointer("/a/b")] == json(42)); + + // unresolved access + json j_primitive = 1; + CHECK_THROWS_AS(j_primitive["/foo"_json_pointer], std::out_of_range); + CHECK_THROWS_WITH(j_primitive["/foo"_json_pointer], "unresolved reference token 'foo'"); + CHECK_THROWS_AS(j_primitive.at("/foo"_json_pointer), std::out_of_range); + CHECK_THROWS_WITH(j_primitive.at("/foo"_json_pointer), "unresolved reference token 'foo'"); } SECTION("const access") @@ -12144,6 +12163,10 @@ TEST_CASE("JSON pointers") CHECK(j[json::json_pointer("/foo/1")] == j["foo"][1]); CHECK(j["/foo/1"_json_pointer] == j["foo"][1]); + // checked array access + CHECK(j.at(json::json_pointer("/foo/0")) == j["foo"][0]); + CHECK(j.at(json::json_pointer("/foo/1")) == j["foo"][1]); + // empty string access CHECK(j[json::json_pointer("/")] == j[""]); @@ -12155,6 +12178,14 @@ TEST_CASE("JSON pointers") CHECK(j[json::json_pointer("/i\\j")] == j["i\\j"]); CHECK(j[json::json_pointer("/k\"l")] == j["k\"l"]); + // checked access + CHECK(j.at(json::json_pointer("/ ")) == j[" "]); + CHECK(j.at(json::json_pointer("/c%d")) == j["c%d"]); + CHECK(j.at(json::json_pointer("/e^f")) == j["e^f"]); + CHECK(j.at(json::json_pointer("/g|h")) == j["g|h"]); + CHECK(j.at(json::json_pointer("/i\\j")) == j["i\\j"]); + CHECK(j.at(json::json_pointer("/k\"l")) == j["k\"l"]); + // escaped access CHECK(j[json::json_pointer("/a~1b")] == j["a/b"]); CHECK(j[json::json_pointer("/m~0n")] == j["m~n"]); @@ -12162,6 +12193,13 @@ TEST_CASE("JSON pointers") // unescaped access CHECK_THROWS_AS(j.at(json::json_pointer("/a/b")), std::out_of_range); CHECK_THROWS_WITH(j.at(json::json_pointer("/a/b")), "key 'a' not found"); + + // unresolved access + const json j_primitive = 1; + CHECK_THROWS_AS(j_primitive["/foo"_json_pointer], std::out_of_range); + CHECK_THROWS_WITH(j_primitive["/foo"_json_pointer], "unresolved reference token 'foo'"); + CHECK_THROWS_AS(j_primitive.at("/foo"_json_pointer), std::out_of_range); + CHECK_THROWS_WITH(j_primitive.at("/foo"_json_pointer), "unresolved reference token 'foo'"); } SECTION("user-defined string literal") @@ -12319,6 +12357,14 @@ TEST_CASE("JSON pointers") // check if unflattened result is as expected CHECK(j_flatten.unflatten() == j); + // error for nonobjects + CHECK_THROWS_AS(json(1).unflatten(), std::domain_error); + CHECK_THROWS_WITH(json(1).unflatten(), "only objects can be unflattened"); + + // error for nonprimitve values + CHECK_THROWS_AS(json({{"/1", {1, 2, 3}}}).unflatten(), std::domain_error); + CHECK_THROWS_WITH(json({{"/1", {1, 2, 3}}}).unflatten(), "values in object must be primitive"); + // explicit roundtrip check CHECK(j.flatten().unflatten() == j); From 6268287940ce3a2523fda959ed1efe7d5f0051c4 Mon Sep 17 00:00:00 2001 From: Niels Date: Sun, 17 Apr 2016 22:08:21 +0200 Subject: [PATCH 015/133] improved documentation and test coverage --- README.md | 2 +- doc/examples/flatten.cpp | 3 ++ doc/examples/flatten.link | 2 +- doc/examples/flatten.output | 1 + src/json.hpp | 58 ++++++++++++++++++++++++++++++------- src/json.hpp.re2c | 58 ++++++++++++++++++++++++++++++------- test/unit.cpp | 5 ++++ 7 files changed, 105 insertions(+), 24 deletions(-) diff --git a/README.md b/README.md index d39663ee3..2dd60bf13 100644 --- a/README.md +++ b/README.md @@ -428,7 +428,7 @@ $ make $ ./json_unit "*" =============================================================================== -All tests passed (3344299 assertions in 29 test cases) +All tests passed (3344416 assertions in 30 test cases) ``` For more information, have a look at the file [.travis.yml](https://github.com/nlohmann/json/blob/master/.travis.yml). diff --git a/doc/examples/flatten.cpp b/doc/examples/flatten.cpp index 5d7692028..0601f8a3f 100644 --- a/doc/examples/flatten.cpp +++ b/doc/examples/flatten.cpp @@ -31,4 +31,7 @@ int main() // call flatten() std::cout << std::setw(4) << j.flatten() << '\n'; + + // flatten for a primitive value + std::cout << j["pi"].flatten() << '\n'; } diff --git a/doc/examples/flatten.link b/doc/examples/flatten.link index 70ba78baa..0fe78bbb1 100644 --- a/doc/examples/flatten.link +++ b/doc/examples/flatten.link @@ -1 +1 @@ -online \ No newline at end of file +online \ No newline at end of file diff --git a/doc/examples/flatten.output b/doc/examples/flatten.output index beb368faf..fedfc8ef2 100644 --- a/doc/examples/flatten.output +++ b/doc/examples/flatten.output @@ -14,3 +14,4 @@ "/object/~1": "slash", "/pi": 3.141 } +{"":3.141} diff --git a/src/json.hpp b/src/json.hpp index 47046c03f..030c8f2cc 100644 --- a/src/json.hpp +++ b/src/json.hpp @@ -3273,8 +3273,8 @@ class basic_json @return reference to the element at index @a idx - @throw std::domain_error if JSON is not an array or null; example: `"cannot - use operator[] with string"` + @throw std::domain_error if JSON is not an array or null; example: + `"cannot use operator[] with string"` @complexity Constant if @a idx is in the range of the array. Otherwise linear in `idx - size()`. @@ -3620,7 +3620,9 @@ class basic_json @complexity Linear in the length of the JSON pointer. - @throw std::out_of_range if the JSON pointer can not be resolved + @throw std::out_of_range if the JSON pointer can not be resolved + @throw std::domain_error if an array index begins with '0' + @throw std::invalid_argument if an array index was not a number @liveexample{The behavior is shown in the example.,operatorjson_pointer} @@ -3645,8 +3647,9 @@ class basic_json @complexity Linear in the length of the JSON pointer. - @throw std::out_of_range if the JSON pointer can not be resolved - @throw std::out_of_range if the special value `-` is used for an array + @throw std::out_of_range if the JSON pointer can not be resolved + @throw std::domain_error if an array index begins with '0' + @throw std::invalid_argument if an array index was not a number @liveexample{The behavior is shown in the example., operatorjson_pointer_const} @@ -8923,9 +8926,12 @@ basic_json_parser_63: empty string is assumed which references the whole JSON value - @throw std::domain_error if reference token is nonempty and does not - begin with a slash (`/`), or if a tilde (`~`) is not followed - by `0` (representing `~`) or `1` (representing `/`). + @throw std::domain_error if reference token is nonempty and does not + begin with a slash (`/`); example: `"JSON pointer must be empty or + begin with /"` + @throw std::domain_error if a tilde (`~`) is not followed by `0` + (representing `~`) or `1` (representing `/`); example: `"escape error: + ~ must be followed with 0 or 1"` @liveexample{The example shows the construction several valid JSON pointers as well as the exceptional behavior.,json_pointer} @@ -8944,6 +8950,8 @@ basic_json_parser_63: { pointer result = &j; + // in case no reference tokens exist, return a reference to the + // JSON value j which will be overwritten by a primitive value for (const auto& reference_token : reference_tokens) { switch (result->m_type) @@ -8952,10 +8960,12 @@ basic_json_parser_63: { if (reference_token == "0") { + // start a new array if reference token is 0 result = &result->operator[](0); } else { + // start a new object otherwise result = &result->operator[](reference_token); } break; @@ -8963,19 +8973,38 @@ basic_json_parser_63: case value_t::object: { + // create an entry in the object result = &result->operator[](reference_token); break; } case value_t::array: { + // create an entry in the array result = &result->operator[](static_cast(std::stoi(reference_token))); break; } + /* + This function is only to be called from the unflatten() + function. There, j is initially of type null. + + - In case the reference tokens are empty, a reference to + j is returned and overwritten by the desired value by + the unflatten() function. + - If there are reference tokens, the null value of j will + be changed to an object or array after reading the first + reference token. + - All subsequent tokens work on arrays or objects and will + not change the type of j. + + Consequently, the type of @a j will always be null, + object, or array. Hence, the following line is + unreachable. + */ default: { - throw std::domain_error("unresolved reference token '" + reference_token + "'"); + break; // LCOV_EXCL_LINE } } } @@ -9361,7 +9390,11 @@ basic_json_parser_63: throw std::domain_error("values in object must be primitive"); } - // assign value to reference pointed to by JSON pointer + // assign value to reference pointed to by JSON pointer; + // Note that if the JSON pointer is "" (i.e., points to the + // whole value), function get_and_create returns a reference + // to result itself. An assignment will then create a + // primitive value. json_pointer(element.first).get_and_create(result) = element.second; } @@ -9390,7 +9423,8 @@ basic_json_parser_63: @return an object that maps JSON pointers to primitve values - @note Empty objects and arrays are flattened to `null`. + @note Empty objects and arrays are flattened to `null` and will not be + reconstructed correctly by the @ref unflatten() function. @complexity Linear in the size the JSON value. @@ -9428,6 +9462,8 @@ basic_json_parser_63: @complexity Linear in the size the JSON value. + @throws std::domain_error + @liveexample{The following code shows how a flattened JSON object is unflattened into the original nested JSON object.,unflatten} diff --git a/src/json.hpp.re2c b/src/json.hpp.re2c index ac11f08ab..f5fbe65bf 100644 --- a/src/json.hpp.re2c +++ b/src/json.hpp.re2c @@ -3273,8 +3273,8 @@ class basic_json @return reference to the element at index @a idx - @throw std::domain_error if JSON is not an array or null; example: `"cannot - use operator[] with string"` + @throw std::domain_error if JSON is not an array or null; example: + `"cannot use operator[] with string"` @complexity Constant if @a idx is in the range of the array. Otherwise linear in `idx - size()`. @@ -3620,7 +3620,9 @@ class basic_json @complexity Linear in the length of the JSON pointer. - @throw std::out_of_range if the JSON pointer can not be resolved + @throw std::out_of_range if the JSON pointer can not be resolved + @throw std::domain_error if an array index begins with '0' + @throw std::invalid_argument if an array index was not a number @liveexample{The behavior is shown in the example.,operatorjson_pointer} @@ -3645,8 +3647,9 @@ class basic_json @complexity Linear in the length of the JSON pointer. - @throw std::out_of_range if the JSON pointer can not be resolved - @throw std::out_of_range if the special value `-` is used for an array + @throw std::out_of_range if the JSON pointer can not be resolved + @throw std::domain_error if an array index begins with '0' + @throw std::invalid_argument if an array index was not a number @liveexample{The behavior is shown in the example., operatorjson_pointer_const} @@ -8233,9 +8236,12 @@ class basic_json empty string is assumed which references the whole JSON value - @throw std::domain_error if reference token is nonempty and does not - begin with a slash (`/`), or if a tilde (`~`) is not followed - by `0` (representing `~`) or `1` (representing `/`). + @throw std::domain_error if reference token is nonempty and does not + begin with a slash (`/`); example: `"JSON pointer must be empty or + begin with /"` + @throw std::domain_error if a tilde (`~`) is not followed by `0` + (representing `~`) or `1` (representing `/`); example: `"escape error: + ~ must be followed with 0 or 1"` @liveexample{The example shows the construction several valid JSON pointers as well as the exceptional behavior.,json_pointer} @@ -8254,6 +8260,8 @@ class basic_json { pointer result = &j; + // in case no reference tokens exist, return a reference to the + // JSON value j which will be overwritten by a primitive value for (const auto& reference_token : reference_tokens) { switch (result->m_type) @@ -8262,10 +8270,12 @@ class basic_json { if (reference_token == "0") { + // start a new array if reference token is 0 result = &result->operator[](0); } else { + // start a new object otherwise result = &result->operator[](reference_token); } break; @@ -8273,19 +8283,38 @@ class basic_json case value_t::object: { + // create an entry in the object result = &result->operator[](reference_token); break; } case value_t::array: { + // create an entry in the array result = &result->operator[](static_cast(std::stoi(reference_token))); break; } + /* + This function is only to be called from the unflatten() + function. There, j is initially of type null. + + - In case the reference tokens are empty, a reference to + j is returned and overwritten by the desired value by + the unflatten() function. + - If there are reference tokens, the null value of j will + be changed to an object or array after reading the first + reference token. + - All subsequent tokens work on arrays or objects and will + not change the type of j. + + Consequently, the type of @a j will always be null, + object, or array. Hence, the following line is + unreachable. + */ default: { - throw std::domain_error("unresolved reference token '" + reference_token + "'"); + break; // LCOV_EXCL_LINE } } } @@ -8671,7 +8700,11 @@ class basic_json throw std::domain_error("values in object must be primitive"); } - // assign value to reference pointed to by JSON pointer + // assign value to reference pointed to by JSON pointer; + // Note that if the JSON pointer is "" (i.e., points to the + // whole value), function get_and_create returns a reference + // to result itself. An assignment will then create a + // primitive value. json_pointer(element.first).get_and_create(result) = element.second; } @@ -8700,7 +8733,8 @@ class basic_json @return an object that maps JSON pointers to primitve values - @note Empty objects and arrays are flattened to `null`. + @note Empty objects and arrays are flattened to `null` and will not be + reconstructed correctly by the @ref unflatten() function. @complexity Linear in the size the JSON value. @@ -8738,6 +8772,8 @@ class basic_json @complexity Linear in the size the JSON value. + @throws std::domain_error + @liveexample{The following code shows how a flattened JSON object is unflattened into the original nested JSON object.,unflatten} diff --git a/test/unit.cpp b/test/unit.cpp index f79a29fdc..f5a6fc094 100644 --- a/test/unit.cpp +++ b/test/unit.cpp @@ -12365,6 +12365,11 @@ TEST_CASE("JSON pointers") CHECK_THROWS_AS(json({{"/1", {1, 2, 3}}}).unflatten(), std::domain_error); CHECK_THROWS_WITH(json({{"/1", {1, 2, 3}}}).unflatten(), "values in object must be primitive"); + // error for conflicting values + json j_error = {{"", 42}, {"/foo", 17}}; + CHECK_THROWS_AS(j_error.unflatten(), std::domain_error); + CHECK_THROWS_WITH(j_error.unflatten(), "unresolved reference token 'foo'"); + // explicit roundtrip check CHECK(j.flatten().unflatten() == j); From 1dee40a9697dd4bc22ed6dd13ad5c928d44ff0f6 Mon Sep 17 00:00:00 2001 From: Niels Date: Sun, 17 Apr 2016 22:34:39 +0200 Subject: [PATCH 016/133] fixed test case --- src/json.hpp | 24 ++++++------------------ src/json.hpp.re2c | 24 ++++++------------------ test/unit.cpp | 2 +- 3 files changed, 13 insertions(+), 37 deletions(-) diff --git a/src/json.hpp b/src/json.hpp index 030c8f2cc..5fdba1404 100644 --- a/src/json.hpp +++ b/src/json.hpp @@ -8986,25 +8986,15 @@ basic_json_parser_63: } /* - This function is only to be called from the unflatten() - function. There, j is initially of type null. - - - In case the reference tokens are empty, a reference to - j is returned and overwritten by the desired value by - the unflatten() function. - - If there are reference tokens, the null value of j will - be changed to an object or array after reading the first - reference token. - - All subsequent tokens work on arrays or objects and will - not change the type of j. - - Consequently, the type of @a j will always be null, - object, or array. Hence, the following line is - unreachable. + The following code is only reached if there exists a + reference token _and_ the current value is primitive. In + this case, we have an error situation, because primitive + values may only occur as single value; that is, with an + empty list of reference tokens. */ default: { - break; // LCOV_EXCL_LINE + throw std::domain_error("invalid value to unflatten"); } } } @@ -9462,8 +9452,6 @@ basic_json_parser_63: @complexity Linear in the size the JSON value. - @throws std::domain_error - @liveexample{The following code shows how a flattened JSON object is unflattened into the original nested JSON object.,unflatten} diff --git a/src/json.hpp.re2c b/src/json.hpp.re2c index f5fbe65bf..95a484f86 100644 --- a/src/json.hpp.re2c +++ b/src/json.hpp.re2c @@ -8296,25 +8296,15 @@ class basic_json } /* - This function is only to be called from the unflatten() - function. There, j is initially of type null. - - - In case the reference tokens are empty, a reference to - j is returned and overwritten by the desired value by - the unflatten() function. - - If there are reference tokens, the null value of j will - be changed to an object or array after reading the first - reference token. - - All subsequent tokens work on arrays or objects and will - not change the type of j. - - Consequently, the type of @a j will always be null, - object, or array. Hence, the following line is - unreachable. + The following code is only reached if there exists a + reference token _and_ the current value is primitive. In + this case, we have an error situation, because primitive + values may only occur as single value; that is, with an + empty list of reference tokens. */ default: { - break; // LCOV_EXCL_LINE + throw std::domain_error("invalid value to unflatten"); } } } @@ -8772,8 +8762,6 @@ class basic_json @complexity Linear in the size the JSON value. - @throws std::domain_error - @liveexample{The following code shows how a flattened JSON object is unflattened into the original nested JSON object.,unflatten} diff --git a/test/unit.cpp b/test/unit.cpp index f5a6fc094..2666e1111 100644 --- a/test/unit.cpp +++ b/test/unit.cpp @@ -12368,7 +12368,7 @@ TEST_CASE("JSON pointers") // error for conflicting values json j_error = {{"", 42}, {"/foo", 17}}; CHECK_THROWS_AS(j_error.unflatten(), std::domain_error); - CHECK_THROWS_WITH(j_error.unflatten(), "unresolved reference token 'foo'"); + CHECK_THROWS_WITH(j_error.unflatten(), "invalid value to unflatten"); // explicit roundtrip check CHECK(j.flatten().unflatten() == j); From 08c97df4207282c280b252609d8d64f0dda80ed9 Mon Sep 17 00:00:00 2001 From: Niels Date: Sun, 17 Apr 2016 23:18:07 +0200 Subject: [PATCH 017/133] added examples --- doc/examples/at_json_pointer.cpp | 35 +++++++++++++++++ doc/examples/at_json_pointer.link | 1 + doc/examples/at_json_pointer.output | 6 +++ doc/examples/at_json_pointer_const.cpp | 23 +++++++++++ doc/examples/at_json_pointer_const.link | 1 + doc/examples/at_json_pointer_const.output | 4 ++ src/json.hpp | 47 ++++++++++++++++++----- src/json.hpp.re2c | 47 ++++++++++++++++++----- 8 files changed, 144 insertions(+), 20 deletions(-) create mode 100644 doc/examples/at_json_pointer.cpp create mode 100644 doc/examples/at_json_pointer.link create mode 100644 doc/examples/at_json_pointer.output create mode 100644 doc/examples/at_json_pointer_const.cpp create mode 100644 doc/examples/at_json_pointer_const.link create mode 100644 doc/examples/at_json_pointer_const.output diff --git a/doc/examples/at_json_pointer.cpp b/doc/examples/at_json_pointer.cpp new file mode 100644 index 000000000..0665e608c --- /dev/null +++ b/doc/examples/at_json_pointer.cpp @@ -0,0 +1,35 @@ +#include + +using json = nlohmann::json; + +int main() +{ + // create a JSON value + json j = + { + {"number", 1}, {"string", "foo"}, {"array", {1, 2}} + }; + + // read-only access + + // output element with JSON pointer "/number" + std::cout << j.at("/number"_json_pointer) << '\n'; + // output element with JSON pointer "/string" + std::cout << j.at("/string"_json_pointer) << '\n'; + // output element with JSON pointer "/array" + std::cout << j.at("/array"_json_pointer) << '\n'; + // output element with JSON pointer "/array/1" + std::cout << j.at("/array/1"_json_pointer) << '\n'; + + // writing access + + // change the string + j.at("/string"_json_pointer) = "bar"; + // output the changed string + std::cout << j["string"] << '\n'; + + // change an array element + j.at("/array/1"_json_pointer) = 21; + // output the changed array + std::cout << j["array"] << '\n'; +} diff --git a/doc/examples/at_json_pointer.link b/doc/examples/at_json_pointer.link new file mode 100644 index 000000000..5356294e2 --- /dev/null +++ b/doc/examples/at_json_pointer.link @@ -0,0 +1 @@ +online \ No newline at end of file diff --git a/doc/examples/at_json_pointer.output b/doc/examples/at_json_pointer.output new file mode 100644 index 000000000..11913c723 --- /dev/null +++ b/doc/examples/at_json_pointer.output @@ -0,0 +1,6 @@ +1 +"foo" +[1,2] +2 +"bar" +[1,21] diff --git a/doc/examples/at_json_pointer_const.cpp b/doc/examples/at_json_pointer_const.cpp new file mode 100644 index 000000000..e3cfc5154 --- /dev/null +++ b/doc/examples/at_json_pointer_const.cpp @@ -0,0 +1,23 @@ +#include + +using json = nlohmann::json; + +int main() +{ + // create a JSON value + json j = + { + {"number", 1}, {"string", "foo"}, {"array", {1, 2}} + }; + + // read-only access + + // output element with JSON pointer "/number" + std::cout << j.at("/number"_json_pointer) << '\n'; + // output element with JSON pointer "/string" + std::cout << j.at("/string"_json_pointer) << '\n'; + // output element with JSON pointer "/array" + std::cout << j.at("/array"_json_pointer) << '\n'; + // output element with JSON pointer "/array/1" + std::cout << j.at("/array/1"_json_pointer) << '\n'; +} diff --git a/doc/examples/at_json_pointer_const.link b/doc/examples/at_json_pointer_const.link new file mode 100644 index 000000000..905e60d34 --- /dev/null +++ b/doc/examples/at_json_pointer_const.link @@ -0,0 +1 @@ +online \ No newline at end of file diff --git a/doc/examples/at_json_pointer_const.output b/doc/examples/at_json_pointer_const.output new file mode 100644 index 000000000..7b9306bbc --- /dev/null +++ b/doc/examples/at_json_pointer_const.output @@ -0,0 +1,4 @@ +1 +"foo" +[1,2] +2 diff --git a/src/json.hpp b/src/json.hpp index 5fdba1404..ffa460673 100644 --- a/src/json.hpp +++ b/src/json.hpp @@ -3616,9 +3616,9 @@ class basic_json @param[in] ptr a JSON pointer - @return reference to the JSON value pointed to by @a ptr + @return reference to the element pointed to by @a ptr - @complexity Linear in the length of the JSON pointer. + @complexity Constant. @throw std::out_of_range if the JSON pointer can not be resolved @throw std::domain_error if an array index begins with '0' @@ -3641,18 +3641,17 @@ class basic_json value; no `null` values are created. In particular, the the special value `-` yields an exception. - @param[in] ptr a JSON pointer + @param[in] ptr JSON pointer to the desired element - @return reference to the JSON value pointed to by @a ptr + @return const reference to the element pointed to by @a ptr - @complexity Linear in the length of the JSON pointer. + @complexity Constant. @throw std::out_of_range if the JSON pointer can not be resolved @throw std::domain_error if an array index begins with '0' @throw std::invalid_argument if an array index was not a number - @liveexample{The behavior is shown in the example., - operatorjson_pointer_const} + @liveexample{The behavior is shown in the example.,operatorjson_pointer_const} @since version 2.0.0 */ @@ -3664,9 +3663,20 @@ class basic_json /*! @brief access specified element via JSON Pointer - Returns a reference to the element at with specified JSON pointer @a ptr. + Returns a reference to the element at with specified JSON pointer @a ptr, + with bounds checking. - @param ptr JSON pointer to the desired element + @param[in] ptr JSON pointer to the desired element + + @return reference to the element pointed to by @a ptr + + @complexity Constant. + + @throw std::out_of_range if the JSON pointer can not be resolved + @throw std::domain_error if an array index begins with '0' + @throw std::invalid_argument if an array index was not a number + + @liveexample{The behavior is shown in the example.,at_json_pointer} @since version 2.0.0 */ @@ -3676,7 +3686,24 @@ class basic_json } /*! - @copydoc basic_json::at(const json_pointer&) + @brief access specified element via JSON Pointer + + Returns a const reference to the element at with specified JSON pointer + @a ptr, with bounds checking. + + @param[in] ptr JSON pointer to the desired element + + @return reference to the element pointed to by @a ptr + + @complexity Constant. + + @throw std::out_of_range if the JSON pointer can not be resolved + @throw std::domain_error if an array index begins with '0' + @throw std::invalid_argument if an array index was not a number + + @liveexample{The behavior is shown in the example.,at_json_pointer_const} + + @since version 2.0.0 */ const_reference at(const json_pointer& ptr) const { diff --git a/src/json.hpp.re2c b/src/json.hpp.re2c index 95a484f86..ced7ffba2 100644 --- a/src/json.hpp.re2c +++ b/src/json.hpp.re2c @@ -3616,9 +3616,9 @@ class basic_json @param[in] ptr a JSON pointer - @return reference to the JSON value pointed to by @a ptr + @return reference to the element pointed to by @a ptr - @complexity Linear in the length of the JSON pointer. + @complexity Constant. @throw std::out_of_range if the JSON pointer can not be resolved @throw std::domain_error if an array index begins with '0' @@ -3641,18 +3641,17 @@ class basic_json value; no `null` values are created. In particular, the the special value `-` yields an exception. - @param[in] ptr a JSON pointer + @param[in] ptr JSON pointer to the desired element - @return reference to the JSON value pointed to by @a ptr + @return const reference to the element pointed to by @a ptr - @complexity Linear in the length of the JSON pointer. + @complexity Constant. @throw std::out_of_range if the JSON pointer can not be resolved @throw std::domain_error if an array index begins with '0' @throw std::invalid_argument if an array index was not a number - @liveexample{The behavior is shown in the example., - operatorjson_pointer_const} + @liveexample{The behavior is shown in the example.,operatorjson_pointer_const} @since version 2.0.0 */ @@ -3664,9 +3663,20 @@ class basic_json /*! @brief access specified element via JSON Pointer - Returns a reference to the element at with specified JSON pointer @a ptr. + Returns a reference to the element at with specified JSON pointer @a ptr, + with bounds checking. - @param ptr JSON pointer to the desired element + @param[in] ptr JSON pointer to the desired element + + @return reference to the element pointed to by @a ptr + + @complexity Constant. + + @throw std::out_of_range if the JSON pointer can not be resolved + @throw std::domain_error if an array index begins with '0' + @throw std::invalid_argument if an array index was not a number + + @liveexample{The behavior is shown in the example.,at_json_pointer} @since version 2.0.0 */ @@ -3676,7 +3686,24 @@ class basic_json } /*! - @copydoc basic_json::at(const json_pointer&) + @brief access specified element via JSON Pointer + + Returns a const reference to the element at with specified JSON pointer + @a ptr, with bounds checking. + + @param[in] ptr JSON pointer to the desired element + + @return reference to the element pointed to by @a ptr + + @complexity Constant. + + @throw std::out_of_range if the JSON pointer can not be resolved + @throw std::domain_error if an array index begins with '0' + @throw std::invalid_argument if an array index was not a number + + @liveexample{The behavior is shown in the example.,at_json_pointer_const} + + @since version 2.0.0 */ const_reference at(const json_pointer& ptr) const { From f4107d0d9c2ca274eaa484de821ca26b5d35dceb Mon Sep 17 00:00:00 2001 From: Niels Date: Sun, 17 Apr 2016 23:36:37 +0200 Subject: [PATCH 018/133] updated documentation --- doc/examples/operator__equal.output | 2 +- doc/examples/operator__equal.test | 4 ++++ doc/examples/operator__notequal.output | 2 +- doc/examples/operator__notequal.test | 4 ++++ 4 files changed, 10 insertions(+), 2 deletions(-) create mode 100644 doc/examples/operator__equal.test create mode 100644 doc/examples/operator__notequal.test diff --git a/doc/examples/operator__equal.output b/doc/examples/operator__equal.output index 780673556..e9dfd7551 100644 --- a/doc/examples/operator__equal.output +++ b/doc/examples/operator__equal.output @@ -1,4 +1,4 @@ [1,2,3] == [1,2,4] false {"A":"a","B":"b"} == {"A":"a","B":"b"} true -17 == 17.0 true +17 == 17 true "foo" == "bar" false diff --git a/doc/examples/operator__equal.test b/doc/examples/operator__equal.test new file mode 100644 index 000000000..e9dfd7551 --- /dev/null +++ b/doc/examples/operator__equal.test @@ -0,0 +1,4 @@ +[1,2,3] == [1,2,4] false +{"A":"a","B":"b"} == {"A":"a","B":"b"} true +17 == 17 true +"foo" == "bar" false diff --git a/doc/examples/operator__notequal.output b/doc/examples/operator__notequal.output index 9eba626e3..ddd838b4a 100644 --- a/doc/examples/operator__notequal.output +++ b/doc/examples/operator__notequal.output @@ -1,4 +1,4 @@ [1,2,3] == [1,2,4] true {"A":"a","B":"b"} == {"A":"a","B":"b"} false -17 == 17.0 false +17 == 17 false "foo" == "bar" true diff --git a/doc/examples/operator__notequal.test b/doc/examples/operator__notequal.test new file mode 100644 index 000000000..ddd838b4a --- /dev/null +++ b/doc/examples/operator__notequal.test @@ -0,0 +1,4 @@ +[1,2,3] == [1,2,4] true +{"A":"a","B":"b"} == {"A":"a","B":"b"} false +17 == 17 false +"foo" == "bar" true From 3ca1bfdd9d4d622132340363862296996fa03d6d Mon Sep 17 00:00:00 2001 From: Niels Date: Sun, 17 Apr 2016 23:41:52 +0200 Subject: [PATCH 019/133] made a function static --- src/json.hpp | 2 +- src/json.hpp.re2c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/json.hpp b/src/json.hpp index ffa460673..57a8f4c72 100644 --- a/src/json.hpp +++ b/src/json.hpp @@ -9227,7 +9227,7 @@ basic_json_parser_63: } /// split the string input to reference tokens - std::vector split(std::string reference_string) + static std::vector split(std::string reference_string) { std::vector result; diff --git a/src/json.hpp.re2c b/src/json.hpp.re2c index ced7ffba2..cdd96ee91 100644 --- a/src/json.hpp.re2c +++ b/src/json.hpp.re2c @@ -8537,7 +8537,7 @@ class basic_json } /// split the string input to reference tokens - std::vector split(std::string reference_string) + static std::vector split(std::string reference_string) { std::vector result; From 70fc5835cb4758b73fdab800380a7e3246ff79f7 Mon Sep 17 00:00:00 2001 From: Niels Date: Mon, 18 Apr 2016 22:41:36 +0200 Subject: [PATCH 020/133] started implementing JSON Patch (RFC 6902) --- src/json.hpp | 95 +++++++++++++++++++ src/json.hpp.re2c | 95 +++++++++++++++++++ test/unit.cpp | 226 ++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 416 insertions(+) diff --git a/src/json.hpp b/src/json.hpp index 57a8f4c72..421b99953 100644 --- a/src/json.hpp +++ b/src/json.hpp @@ -9492,6 +9492,101 @@ basic_json_parser_63: } /// @} + + /*! + @brief applies a JSON patch + + @param[in] patch JSON patch document + @return patched document + + @note The original JSON value is not changed; that is, the patch is + applied to a copy of the value. + + @sa [RFC 6902](https://tools.ietf.org/html/rfc6902) + */ + basic_json apply_patch(const basic_json& patch) const + { + basic_json result = *this; + + if (not patch.is_array()) + { + // a JSON patch must be an array of objects + throw std::domain_error("JSON patch must be an array of objects"); + } + + for (const auto& val : patch) + { + if (not val.is_object()) + { + throw std::domain_error("JSON patch must be an array of objects"); + } + + // collect members + const auto it_op = val.m_value.object->find("op"); + const auto it_path = val.m_value.object->find("path"); + const auto it_value = val.m_value.object->find("value"); + + if (it_op == val.m_value.object->end() or not it_op->second.is_string()) + { + throw std::domain_error("operation must have a string 'op' member"); + } + + if (it_path == val.m_value.object->end() or not it_op->second.is_string()) + { + throw std::domain_error("operation must have a string 'path' member"); + } + + const std::string op = it_op->second; + const std::string path = it_path->second; + const json_pointer ptr(path); + + if (op == "add") + { + if (it_value == val.m_value.object->end()) + { + throw std::domain_error("'add' operation must have member 'value'"); + } + + result[ptr] = it_value->second; + } + else if (op == "remove") + { + } + else if (op == "replace") + { + if (it_value == val.m_value.object->end()) + { + throw std::domain_error("'replace' operation must have member 'value'"); + } + } + else if (op == "move") + { + } + else if (op == "copy") + { + } + else if (op == "test") + { + if (it_value == val.m_value.object->end()) + { + throw std::domain_error("'test' operation must have member 'value'"); + } + + if (result.at(ptr) != it_value->second) + { + throw std::domain_error("unsuccessful: " + val.dump()); + } + } + else + { + // op must be "add", "remove", "replace", "move", + // "copy", or "test" + throw std::domain_error("operation value '" + op + "' is invalid"); + } + } + + return result; + } }; diff --git a/src/json.hpp.re2c b/src/json.hpp.re2c index cdd96ee91..3f839737f 100644 --- a/src/json.hpp.re2c +++ b/src/json.hpp.re2c @@ -8802,6 +8802,101 @@ class basic_json } /// @} + + /*! + @brief applies a JSON patch + + @param[in] patch JSON patch document + @return patched document + + @note The original JSON value is not changed; that is, the patch is + applied to a copy of the value. + + @sa [RFC 6902](https://tools.ietf.org/html/rfc6902) + */ + basic_json apply_patch(const basic_json& patch) const + { + basic_json result = *this; + + if (not patch.is_array()) + { + // a JSON patch must be an array of objects + throw std::domain_error("JSON patch must be an array of objects"); + } + + for (const auto& val : patch) + { + if (not val.is_object()) + { + throw std::domain_error("JSON patch must be an array of objects"); + } + + // collect members + const auto it_op = val.m_value.object->find("op"); + const auto it_path = val.m_value.object->find("path"); + const auto it_value = val.m_value.object->find("value"); + + if (it_op == val.m_value.object->end() or not it_op->second.is_string()) + { + throw std::domain_error("operation must have a string 'op' member"); + } + + if (it_path == val.m_value.object->end() or not it_op->second.is_string()) + { + throw std::domain_error("operation must have a string 'path' member"); + } + + const std::string op = it_op->second; + const std::string path = it_path->second; + const json_pointer ptr(path); + + if (op == "add") + { + if (it_value == val.m_value.object->end()) + { + throw std::domain_error("'add' operation must have member 'value'"); + } + + result[ptr] = it_value->second; + } + else if (op == "remove") + { + } + else if (op == "replace") + { + if (it_value == val.m_value.object->end()) + { + throw std::domain_error("'replace' operation must have member 'value'"); + } + } + else if (op == "move") + { + } + else if (op == "copy") + { + } + else if (op == "test") + { + if (it_value == val.m_value.object->end()) + { + throw std::domain_error("'test' operation must have member 'value'"); + } + + if (result.at(ptr) != it_value->second) + { + throw std::domain_error("unsuccessful: " + val.dump()); + } + } + else + { + // op must be "add", "remove", "replace", "move", + // "copy", or "test" + throw std::domain_error("operation value '" + op + "' is invalid"); + } + } + + return result; + } }; diff --git a/test/unit.cpp b/test/unit.cpp index 2666e1111..7a91efd70 100644 --- a/test/unit.cpp +++ b/test/unit.cpp @@ -12391,6 +12391,232 @@ TEST_CASE("JSON pointers") } } +TEST_CASE("JSON patch") +{ + SECTION("examples from RFC 6902") + { + SECTION("example A.1 - Adding an Object Member") + { + // An example target JSON document: + json doc = R"( + { "foo": "bar"} + )"_json; + + // A JSON Patch document: + json patch = R"( + [ + { "op": "add", "path": "/baz", "value": "qux" } + ] + )"_json; + + // The resulting JSON document: + json expected = R"( + { + "baz": "qux", + "foo": "bar" + } + )"_json; + + // check if patched value is as expected + CHECK(doc.apply_patch(patch) == expected); + } + + SECTION("example A.8 - Testing a Value: Success") + { + // An example target JSON document: + json doc = R"( + { + "baz": "qux", + "foo": [ "a", 2, "c" ] + } + )"_json; + + // A JSON Patch document that will result in successful evaluation: + json patch = R"( + [ + { "op": "test", "path": "/baz", "value": "qux" }, + { "op": "test", "path": "/foo/1", "value": 2 } + ] + )"_json; + + // check if evaluation does not throw + CHECK_NOTHROW(doc.apply_patch(patch)); + // check if patched document is unchanged + CHECK(doc.apply_patch(patch) == doc); + } + + SECTION("example A.9 - Testing a Value: Error") + { + // An example target JSON document: + json doc = R"( + { "baz": "qux" } + )"_json; + + // A JSON Patch document that will result in an error condition: + json patch = R"( + [ + { "op": "test", "path": "/baz", "value": "bar" } + ] + )"_json; + + // check that evaluation throws + CHECK_THROWS_AS(doc.apply_patch(patch), std::domain_error); + CHECK_THROWS_WITH(doc.apply_patch(patch), "unsuccessful: " + patch[0].dump()); + } + + SECTION("example A.10 - Adding a Nested Member Object") + { + // An example target JSON document: + json doc = R"( + { "foo": "bar" } + )"_json; + + // A JSON Patch document: + json patch = R"( + [ + { "op": "add", "path": "/child", "value": { "grandchild": { } } } + ] + )"_json; + + // The resulting JSON document: + json expected = R"( + { + "foo": "bar", + "child": { + "grandchild": { + } + } + } + )"_json; + + // check if patched value is as expected + CHECK(doc.apply_patch(patch) == expected); + } + + SECTION("example A.11 - Ignoring Unrecognized Elements") + { + // An example target JSON document: + json doc = R"( + { "foo": "bar" } + )"_json; + + // A JSON Patch document: + json patch = R"( + [ + { "op": "add", "path": "/baz", "value": "qux", "xyz": 123 } + ] + )"_json; + + json expected = R"( + { + "foo": "bar", + "baz": "qux" + } + )"_json; + + // check if patched value is as expected + CHECK(doc.apply_patch(patch) == expected); + } + + SECTION("example A.12 - Adding to a Nonexistent Target") + { + // An example target JSON document: + json doc = R"( + { "foo": "bar" } + )"_json; + + // A JSON Patch document: + json patch = R"( + [ + { "op": "add", "path": "/baz/bat", "value": "qux" } + ] + )"_json; + + // This JSON Patch document, applied to the target JSON document + // above, would result in an error (therefore, it would not be + // applied), because the "add" operation's target location that + // references neither the root of the document, nor a member of + // an existing object, nor a member of an existing array. + + CHECK_THROWS_AS(doc.apply_patch(patch), std::out_of_range); + CHECK_THROWS_WITH(doc.apply_patch(patch), "unresolved reference token 'bat'"); + } + + SECTION("example A.14 - Escape Ordering") + { + // An example target JSON document: + json doc = R"( + { + "/": 9, + "~1": 10 + } + )"_json; + + // A JSON Patch document: + json patch = R"( + [ + {"op": "test", "path": "/~01", "value": 10} + ] + )"_json; + + json expected = R"( + { + "/": 9, + "~1": 10 + } + )"_json; + + // check if patched value is as expected + CHECK(doc.apply_patch(patch) == expected); + } + + SECTION("example A.15 - Comparing Strings and Numbers") + { + // An example target JSON document: + json doc = R"( + { + "/": 9, + "~1": 10 + } + )"_json; + + // A JSON Patch document that will result in an error condition: + json patch = R"( + [ + {"op": "test", "path": "/~01", "value": "10"} + ] + )"_json; + + // check that evaluation throws + CHECK_THROWS_AS(doc.apply_patch(patch), std::domain_error); + CHECK_THROWS_WITH(doc.apply_patch(patch), "unsuccessful: " + patch[0].dump()); + } + + SECTION("example A.16 - Adding an Array Value") + { + // An example target JSON document: + json doc = R"( + { "foo": ["bar"] } + )"_json; + + // A JSON Patch document: + json patch = R"( + [ + { "op": "add", "path": "/foo/-", "value": ["abc", "def"] } + ] + )"_json; + + // The resulting JSON document: + json expected = R"( + { "foo": ["bar", ["abc", "def"]] } + )"_json; + + // check if patched value is as expected + CHECK(doc.apply_patch(patch) == expected); + } + } +} + TEST_CASE("regression tests") { SECTION("issue #60 - Double quotation mark is not parsed correctly") From fa03cf0c63544a358c8b92db8fe85317a826174a Mon Sep 17 00:00:00 2001 From: Niels Date: Wed, 20 Apr 2016 15:41:33 +0200 Subject: [PATCH 021/133] replace and copy --- src/json.hpp | 19 +++++++++++++ src/json.hpp.re2c | 19 +++++++++++++ test/unit.cpp | 70 +++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 108 insertions(+) diff --git a/src/json.hpp b/src/json.hpp index 421b99953..acde03bf3 100644 --- a/src/json.hpp +++ b/src/json.hpp @@ -9525,6 +9525,7 @@ basic_json_parser_63: const auto it_op = val.m_value.object->find("op"); const auto it_path = val.m_value.object->find("path"); const auto it_value = val.m_value.object->find("value"); + const auto it_from = val.m_value.object->find("from"); if (it_op == val.m_value.object->end() or not it_op->second.is_string()) { @@ -9558,12 +9559,30 @@ basic_json_parser_63: { throw std::domain_error("'replace' operation must have member 'value'"); } + + result.at(ptr) = it_value->second; } else if (op == "move") { + if (it_from == val.m_value.object->end()) + { + throw std::domain_error("'move' operation must have member 'from'"); + } + + const std::string from_path = it_from->second; + const json_pointer from_ptr(from_path); } else if (op == "copy") { + if (it_from == val.m_value.object->end()) + { + throw std::domain_error("'copy' operation must have member 'from'"); + } + + const std::string from_path = it_from->second; + const json_pointer from_ptr(from_path); + + result[ptr] = result.at(from_ptr); } else if (op == "test") { diff --git a/src/json.hpp.re2c b/src/json.hpp.re2c index 3f839737f..d161f38d1 100644 --- a/src/json.hpp.re2c +++ b/src/json.hpp.re2c @@ -8835,6 +8835,7 @@ class basic_json const auto it_op = val.m_value.object->find("op"); const auto it_path = val.m_value.object->find("path"); const auto it_value = val.m_value.object->find("value"); + const auto it_from = val.m_value.object->find("from"); if (it_op == val.m_value.object->end() or not it_op->second.is_string()) { @@ -8868,12 +8869,30 @@ class basic_json { throw std::domain_error("'replace' operation must have member 'value'"); } + + result.at(ptr) = it_value->second; } else if (op == "move") { + if (it_from == val.m_value.object->end()) + { + throw std::domain_error("'move' operation must have member 'from'"); + } + + const std::string from_path = it_from->second; + const json_pointer from_ptr(from_path); } else if (op == "copy") { + if (it_from == val.m_value.object->end()) + { + throw std::domain_error("'copy' operation must have member 'from'"); + } + + const std::string from_path = it_from->second; + const json_pointer from_ptr(from_path); + + result[ptr] = result.at(from_ptr); } else if (op == "test") { diff --git a/test/unit.cpp b/test/unit.cpp index 7a91efd70..7b6754625 100644 --- a/test/unit.cpp +++ b/test/unit.cpp @@ -12421,6 +12421,34 @@ TEST_CASE("JSON patch") CHECK(doc.apply_patch(patch) == expected); } + SECTION("example A.5 - Replacing a Value") + { + // An example target JSON document: + json doc = R"( + { + "baz": "qux", + "foo": "bar" + } + )"_json; + + // A JSON Patch document: + json patch = R"( + [ + { "op": "replace", "path": "/baz", "value": "boo" } + ] + )"_json; + + json expected = R"( + { + "baz": "boo", + "foo": "bar" + } + )"_json; + + // check if patched value is as expected + CHECK(doc.apply_patch(patch) == expected); + } + SECTION("example A.8 - Testing a Value: Success") { // An example target JSON document: @@ -12615,6 +12643,48 @@ TEST_CASE("JSON patch") CHECK(doc.apply_patch(patch) == expected); } } + + SECTION("own examples") + { + SECTION("copy") + { + // An example target JSON document: + json doc = R"( + { + "foo": { + "bar": "baz", + "waldo": "fred" + }, + "qux": { + "corge": "grault" + } + } + )"_json; + + // A JSON Patch document: + json patch = R"( + [ + { "op": "copy", "from": "/foo/waldo", "path": "/qux/thud" } + ] + )"_json; + + json expected = R"( + { + "foo": { + "bar": "baz", + "waldo": "fred" + }, + "qux": { + "corge": "grault", + "thud": "fred" + } + } + )"_json; + + // check if patched value is as expected + CHECK(doc.apply_patch(patch) == expected); + } + } } TEST_CASE("regression tests") From 397ada22d35cf2ebc168a48f264218c069f13d74 Mon Sep 17 00:00:00 2001 From: Niels Date: Wed, 20 Apr 2016 16:52:00 +0200 Subject: [PATCH 022/133] implemented remove --- src/json.hpp | 26 +++++++++++++++++++++++-- src/json.hpp.re2c | 26 +++++++++++++++++++++++-- test/unit.cpp | 49 +++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 97 insertions(+), 4 deletions(-) diff --git a/src/json.hpp b/src/json.hpp index acde03bf3..de6c6ec1a 100644 --- a/src/json.hpp +++ b/src/json.hpp @@ -8969,6 +8969,18 @@ basic_json_parser_63: : reference_tokens(split(s)) {} + std::string pop_back() + { + if (reference_tokens.empty()) + { + throw std::domain_error("JSON pointer has no parent"); + } + + auto last = reference_tokens.back(); + reference_tokens.pop_back(); + return last; + } + private: /*! @brief create and return a reference to the pointed to value @@ -9420,7 +9432,7 @@ basic_json_parser_63: private: /// the reference tokens - const std::vector reference_tokens {}; + std::vector reference_tokens {}; }; //////////////////////////// @@ -9539,7 +9551,7 @@ basic_json_parser_63: const std::string op = it_op->second; const std::string path = it_path->second; - const json_pointer ptr(path); + json_pointer ptr(path); if (op == "add") { @@ -9552,6 +9564,16 @@ basic_json_parser_63: } else if (op == "remove") { + const auto last_path = ptr.pop_back(); + basic_json& parent = result.at(ptr); + if (parent.is_object()) + { + parent.erase(parent.find(last_path)); + } + else if (parent.is_array()) + { + parent.erase(parent.begin() + std::stoi(last_path)); + } } else if (op == "replace") { diff --git a/src/json.hpp.re2c b/src/json.hpp.re2c index d161f38d1..073baf364 100644 --- a/src/json.hpp.re2c +++ b/src/json.hpp.re2c @@ -8279,6 +8279,18 @@ class basic_json : reference_tokens(split(s)) {} + std::string pop_back() + { + if (reference_tokens.empty()) + { + throw std::domain_error("JSON pointer has no parent"); + } + + auto last = reference_tokens.back(); + reference_tokens.pop_back(); + return last; + } + private: /*! @brief create and return a reference to the pointed to value @@ -8730,7 +8742,7 @@ class basic_json private: /// the reference tokens - const std::vector reference_tokens {}; + std::vector reference_tokens {}; }; //////////////////////////// @@ -8849,7 +8861,7 @@ class basic_json const std::string op = it_op->second; const std::string path = it_path->second; - const json_pointer ptr(path); + json_pointer ptr(path); if (op == "add") { @@ -8862,6 +8874,16 @@ class basic_json } else if (op == "remove") { + const auto last_path = ptr.pop_back(); + basic_json& parent = result.at(ptr); + if (parent.is_object()) + { + parent.erase(parent.find(last_path)); + } + else if (parent.is_array()) + { + parent.erase(parent.begin() + std::stoi(last_path)); + } } else if (op == "replace") { diff --git a/test/unit.cpp b/test/unit.cpp index 7b6754625..6f9ad8f5c 100644 --- a/test/unit.cpp +++ b/test/unit.cpp @@ -12421,6 +12421,55 @@ TEST_CASE("JSON patch") CHECK(doc.apply_patch(patch) == expected); } + SECTION("example A.3 - Removing an Object Member") + { + // An example target JSON document: + json doc = R"( + { + "baz": "qux", + "foo": "bar" + } + )"_json; + + // A JSON Patch document: + json patch = R"( + [ + { "op": "remove", "path": "/baz" } + ] + )"_json; + + // The resulting JSON document: + json expected = R"( + { "foo": "bar" } + )"_json; + + // check if patched value is as expected + CHECK(doc.apply_patch(patch) == expected); + } + + SECTION("example A.4 - Removing an Array Element") + { + // An example target JSON document: + json doc = R"( + { "foo": [ "bar", "qux", "baz" ] } + )"_json; + + // A JSON Patch document: + json patch = R"( + [ + { "op": "remove", "path": "/foo/1" } + ] + )"_json; + + // The resulting JSON document: + json expected = R"( + { "foo": [ "bar", "baz" ] } + )"_json; + + // check if patched value is as expected + CHECK(doc.apply_patch(patch) == expected); + } + SECTION("example A.5 - Replacing a Value") { // An example target JSON document: From 855cf2307bb7c4ac874cb5eaac74f1c4abf01428 Mon Sep 17 00:00:00 2001 From: Niels Date: Sun, 24 Apr 2016 16:51:06 +0200 Subject: [PATCH 023/133] extended "add" to cope with arrays --- src/json.hpp | 20 +++++++++++++++++++- src/json.hpp.re2c | 20 +++++++++++++++++++- test/unit.cpp | 28 +++++++++++++++++++++++++++- 3 files changed, 65 insertions(+), 3 deletions(-) diff --git a/src/json.hpp b/src/json.hpp index de6c6ec1a..c1bf6648b 100644 --- a/src/json.hpp +++ b/src/json.hpp @@ -9560,7 +9560,25 @@ basic_json_parser_63: throw std::domain_error("'add' operation must have member 'value'"); } - result[ptr] = it_value->second; + const auto last_path = ptr.pop_back(); + basic_json& parent = result.at(ptr); + + if (parent.is_object()) + { + parent[last_path] = it_value->second; + } + else if (parent.is_array()) + { + if (last_path == "-") + { + parent.push_back(it_value->second); + } + else + { + parent.insert(parent.begin() + std::stoi(last_path), + it_value->second); + } + } } else if (op == "remove") { diff --git a/src/json.hpp.re2c b/src/json.hpp.re2c index 073baf364..aa02bbea3 100644 --- a/src/json.hpp.re2c +++ b/src/json.hpp.re2c @@ -8870,7 +8870,25 @@ class basic_json throw std::domain_error("'add' operation must have member 'value'"); } - result[ptr] = it_value->second; + const auto last_path = ptr.pop_back(); + basic_json& parent = result.at(ptr); + + if (parent.is_object()) + { + parent[last_path] = it_value->second; + } + else if (parent.is_array()) + { + if (last_path == "-") + { + parent.push_back(it_value->second); + } + else + { + parent.insert(parent.begin() + std::stoi(last_path), + it_value->second); + } + } } else if (op == "remove") { diff --git a/test/unit.cpp b/test/unit.cpp index 6f9ad8f5c..277daed1f 100644 --- a/test/unit.cpp +++ b/test/unit.cpp @@ -12421,6 +12421,29 @@ TEST_CASE("JSON patch") CHECK(doc.apply_patch(patch) == expected); } + SECTION("example A.2 - Adding an Array Element") + { + // An example target JSON document: + json doc = R"( + { "foo": [ "bar", "baz" ] } + )"_json; + + // A JSON Patch document: + json patch = R"( + [ + { "op": "add", "path": "/foo/1", "value": "qux" } + ] + )"_json; + + // The resulting JSON document: + json expected = R"( + { "foo": [ "bar", "qux", "baz" ] } + )"_json; + + // check if patched value is as expected + CHECK(doc.apply_patch(patch) == expected); + } + SECTION("example A.3 - Removing an Object Member") { // An example target JSON document: @@ -12616,9 +12639,12 @@ TEST_CASE("JSON patch") // an existing object, nor a member of an existing array. CHECK_THROWS_AS(doc.apply_patch(patch), std::out_of_range); - CHECK_THROWS_WITH(doc.apply_patch(patch), "unresolved reference token 'bat'"); + CHECK_THROWS_WITH(doc.apply_patch(patch), "key 'baz' not found"); } + // A.13. Invalid JSON Patch Document + // not applicable + SECTION("example A.14 - Escape Ordering") { // An example target JSON document: From 09e9f6dcd4b61005e0b37f364cdadeda4d6ea9a1 Mon Sep 17 00:00:00 2001 From: Niels Date: Sun, 24 Apr 2016 17:43:27 +0200 Subject: [PATCH 024/133] implemented "move" --- src/json.hpp | 75 ++++++++++++++++++++++++++++------------------- src/json.hpp.re2c | 75 ++++++++++++++++++++++++++++------------------- test/unit.cpp | 62 +++++++++++++++++++++++++++++++++++++++ 3 files changed, 152 insertions(+), 60 deletions(-) diff --git a/src/json.hpp b/src/json.hpp index c1bf6648b..8d5291ce8 100644 --- a/src/json.hpp +++ b/src/json.hpp @@ -9526,6 +9526,44 @@ basic_json_parser_63: throw std::domain_error("JSON patch must be an array of objects"); } + const auto operation_add = [&result](json_pointer & ptr, + basic_json & value) + { + const auto last_path = ptr.pop_back(); + basic_json& parent = result.at(ptr); + + if (parent.is_object()) + { + parent[last_path] = value; + } + else if (parent.is_array()) + { + if (last_path == "-") + { + parent.push_back(value); + } + else + { + parent.insert(parent.begin() + std::stoi(last_path), + value); + } + } + }; + + const auto operation_remove = [&result](json_pointer & ptr) + { + const auto last_path = ptr.pop_back(); + basic_json& parent = result.at(ptr); + if (parent.is_object()) + { + parent.erase(parent.find(last_path)); + } + else if (parent.is_array()) + { + parent.erase(parent.begin() + std::stoi(last_path)); + } + }; + for (const auto& val : patch) { if (not val.is_object()) @@ -9560,38 +9598,11 @@ basic_json_parser_63: throw std::domain_error("'add' operation must have member 'value'"); } - const auto last_path = ptr.pop_back(); - basic_json& parent = result.at(ptr); - - if (parent.is_object()) - { - parent[last_path] = it_value->second; - } - else if (parent.is_array()) - { - if (last_path == "-") - { - parent.push_back(it_value->second); - } - else - { - parent.insert(parent.begin() + std::stoi(last_path), - it_value->second); - } - } + operation_add(ptr, it_value->second); } else if (op == "remove") { - const auto last_path = ptr.pop_back(); - basic_json& parent = result.at(ptr); - if (parent.is_object()) - { - parent.erase(parent.find(last_path)); - } - else if (parent.is_array()) - { - parent.erase(parent.begin() + std::stoi(last_path)); - } + operation_remove(ptr); } else if (op == "replace") { @@ -9610,7 +9621,11 @@ basic_json_parser_63: } const std::string from_path = it_from->second; - const json_pointer from_ptr(from_path); + json_pointer from_ptr(from_path); + basic_json v = result[from_ptr]; + + operation_remove(from_ptr); + operation_add(ptr, v); } else if (op == "copy") { diff --git a/src/json.hpp.re2c b/src/json.hpp.re2c index aa02bbea3..37feeec6d 100644 --- a/src/json.hpp.re2c +++ b/src/json.hpp.re2c @@ -8836,6 +8836,44 @@ class basic_json throw std::domain_error("JSON patch must be an array of objects"); } + const auto operation_add = [&result](json_pointer & ptr, + basic_json & value) + { + const auto last_path = ptr.pop_back(); + basic_json& parent = result.at(ptr); + + if (parent.is_object()) + { + parent[last_path] = value; + } + else if (parent.is_array()) + { + if (last_path == "-") + { + parent.push_back(value); + } + else + { + parent.insert(parent.begin() + std::stoi(last_path), + value); + } + } + }; + + const auto operation_remove = [&result](json_pointer & ptr) + { + const auto last_path = ptr.pop_back(); + basic_json& parent = result.at(ptr); + if (parent.is_object()) + { + parent.erase(parent.find(last_path)); + } + else if (parent.is_array()) + { + parent.erase(parent.begin() + std::stoi(last_path)); + } + }; + for (const auto& val : patch) { if (not val.is_object()) @@ -8870,38 +8908,11 @@ class basic_json throw std::domain_error("'add' operation must have member 'value'"); } - const auto last_path = ptr.pop_back(); - basic_json& parent = result.at(ptr); - - if (parent.is_object()) - { - parent[last_path] = it_value->second; - } - else if (parent.is_array()) - { - if (last_path == "-") - { - parent.push_back(it_value->second); - } - else - { - parent.insert(parent.begin() + std::stoi(last_path), - it_value->second); - } - } + operation_add(ptr, it_value->second); } else if (op == "remove") { - const auto last_path = ptr.pop_back(); - basic_json& parent = result.at(ptr); - if (parent.is_object()) - { - parent.erase(parent.find(last_path)); - } - else if (parent.is_array()) - { - parent.erase(parent.begin() + std::stoi(last_path)); - } + operation_remove(ptr); } else if (op == "replace") { @@ -8920,7 +8931,11 @@ class basic_json } const std::string from_path = it_from->second; - const json_pointer from_ptr(from_path); + json_pointer from_ptr(from_path); + basic_json v = result[from_ptr]; + + operation_remove(from_ptr); + operation_add(ptr, v); } else if (op == "copy") { diff --git a/test/unit.cpp b/test/unit.cpp index 277daed1f..907e68bfc 100644 --- a/test/unit.cpp +++ b/test/unit.cpp @@ -12521,6 +12521,68 @@ TEST_CASE("JSON patch") CHECK(doc.apply_patch(patch) == expected); } + SECTION("example A.6 - Moving a Value") + { + // An example target JSON document: + json doc = R"( + { + "foo": { + "bar": "baz", + "waldo": "fred" + }, + "qux": { + "corge": "grault" + } + } + )"_json; + + // A JSON Patch document: + json patch = R"( + [ + { "op": "move", "from": "/foo/waldo", "path": "/qux/thud" } + ] + )"_json; + + // The resulting JSON document: + json expected = R"( + { + "foo": { + "bar": "baz" + }, + "qux": { + "corge": "grault", + "thud": "fred" + } + } + )"_json; + + // check if patched value is as expected + CHECK(doc.apply_patch(patch) == expected); + } + + SECTION("example A.7 - Moving a Value") + { + // An example target JSON document: + json doc = R"( + { "foo": [ "all", "grass", "cows", "eat" ] } + )"_json; + + // A JSON Patch document: + json patch = R"( + [ + { "op": "move", "from": "/foo/1", "path": "/foo/3" } + ] + )"_json; + + // The resulting JSON document: + json expected = R"( + { "foo": [ "all", "cows", "eat", "grass" ] } + )"_json; + + // check if patched value is as expected + CHECK(doc.apply_patch(patch) == expected); + } + SECTION("example A.8 - Testing a Value: Success") { // An example target JSON document: From fb54e212b666ecc37272740278384a8bc9fc2f5f Mon Sep 17 00:00:00 2001 From: Niels Date: Sun, 24 Apr 2016 19:03:33 +0200 Subject: [PATCH 025/133] clean up and added tests --- src/json.hpp | 120 ++++++++++++++--------------- src/json.hpp.re2c | 120 ++++++++++++++--------------- test/unit.cpp | 192 ++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 310 insertions(+), 122 deletions(-) diff --git a/src/json.hpp b/src/json.hpp index 8d5291ce8..b7a6f64a8 100644 --- a/src/json.hpp +++ b/src/json.hpp @@ -9518,42 +9518,44 @@ basic_json_parser_63: */ basic_json apply_patch(const basic_json& patch) const { + // make a working copy to apply the patch to basic_json result = *this; - if (not patch.is_array()) - { - // a JSON patch must be an array of objects - throw std::domain_error("JSON patch must be an array of objects"); - } - - const auto operation_add = [&result](json_pointer & ptr, - basic_json & value) + // wrapper for "add" operation; add value at ptr + const auto operation_add = [&result](json_pointer & ptr, basic_json value) { + // get reference to parent of JSON pointer ptr const auto last_path = ptr.pop_back(); basic_json& parent = result.at(ptr); if (parent.is_object()) { + // use operator[] to add value parent[last_path] = value; } else if (parent.is_array()) { if (last_path == "-") { + // special case: append to back parent.push_back(value); } else { - parent.insert(parent.begin() + std::stoi(last_path), - value); + // default case: insert add offset + parent.insert(parent.begin() + std::stoi(last_path), value); } } }; + // wrapper for "remove" operation; remove value at ptr const auto operation_remove = [&result](json_pointer & ptr) { + // get reference to parent of JSON pointer ptr const auto last_path = ptr.pop_back(); basic_json& parent = result.at(ptr); + + // remove child if (parent.is_object()) { parent.erase(parent.find(last_path)); @@ -9564,41 +9566,57 @@ basic_json_parser_63: } }; + // type check + if (not patch.is_array()) + { + // a JSON patch must be an array of objects + throw std::domain_error("JSON patch must be an array of objects"); + } + + // iterate and apply th eoperations for (const auto& val : patch) { + // wrapper to get a value for an operation + const auto get_value = [&val](const std::string & op, + const std::string & member, + bool string_type = false) -> basic_json& + { + // find value + auto it = val.m_value.object->find(member); + + // context-sensitive error message + const auto error_msg = (op == "op") ? "operation" : "operation '" + op + "'"; + + // check if desired value is present + if (it == val.m_value.object->end()) + { + throw std::domain_error(error_msg + " must have member '" + member + "'"); + } + + // check if result is of type string + if (string_type and not it->second.is_string()) + { + throw std::domain_error(error_msg + " must have string member '" + member + "'"); + } + + // no error: return value + return it->second; + }; + + // type check if (not val.is_object()) { throw std::domain_error("JSON patch must be an array of objects"); } - // collect members - const auto it_op = val.m_value.object->find("op"); - const auto it_path = val.m_value.object->find("path"); - const auto it_value = val.m_value.object->find("value"); - const auto it_from = val.m_value.object->find("from"); - - if (it_op == val.m_value.object->end() or not it_op->second.is_string()) - { - throw std::domain_error("operation must have a string 'op' member"); - } - - if (it_path == val.m_value.object->end() or not it_op->second.is_string()) - { - throw std::domain_error("operation must have a string 'path' member"); - } - - const std::string op = it_op->second; - const std::string path = it_path->second; - json_pointer ptr(path); + // collect mandatory members + const std::string op = get_value("op", "op", true); + const std::string path = get_value(op, "path", true); + json_pointer ptr(get_value(op, "path", true)); if (op == "add") { - if (it_value == val.m_value.object->end()) - { - throw std::domain_error("'add' operation must have member 'value'"); - } - - operation_add(ptr, it_value->second); + operation_add(ptr, get_value("add", "value")); } else if (op == "remove") { @@ -9606,21 +9624,11 @@ basic_json_parser_63: } else if (op == "replace") { - if (it_value == val.m_value.object->end()) - { - throw std::domain_error("'replace' operation must have member 'value'"); - } - - result.at(ptr) = it_value->second; + result.at(ptr) = get_value("replace", "value"); } else if (op == "move") { - if (it_from == val.m_value.object->end()) - { - throw std::domain_error("'move' operation must have member 'from'"); - } - - const std::string from_path = it_from->second; + const std::string from_path = get_value("move", "from", true); json_pointer from_ptr(from_path); basic_json v = result[from_ptr]; @@ -9629,32 +9637,22 @@ basic_json_parser_63: } else if (op == "copy") { - if (it_from == val.m_value.object->end()) - { - throw std::domain_error("'copy' operation must have member 'from'"); - } - - const std::string from_path = it_from->second; + const std::string from_path = get_value("copy", "from", true);; const json_pointer from_ptr(from_path); result[ptr] = result.at(from_ptr); } else if (op == "test") { - if (it_value == val.m_value.object->end()) - { - throw std::domain_error("'test' operation must have member 'value'"); - } - - if (result.at(ptr) != it_value->second) + if (result.at(ptr) != get_value("test", "value")) { throw std::domain_error("unsuccessful: " + val.dump()); } } else { - // op must be "add", "remove", "replace", "move", - // "copy", or "test" + // op must be "add", "remove", "replace", "move", "copy", or + // "test" throw std::domain_error("operation value '" + op + "' is invalid"); } } diff --git a/src/json.hpp.re2c b/src/json.hpp.re2c index 37feeec6d..c4c87f5de 100644 --- a/src/json.hpp.re2c +++ b/src/json.hpp.re2c @@ -8828,42 +8828,44 @@ class basic_json */ basic_json apply_patch(const basic_json& patch) const { + // make a working copy to apply the patch to basic_json result = *this; - if (not patch.is_array()) - { - // a JSON patch must be an array of objects - throw std::domain_error("JSON patch must be an array of objects"); - } - - const auto operation_add = [&result](json_pointer & ptr, - basic_json & value) + // wrapper for "add" operation; add value at ptr + const auto operation_add = [&result](json_pointer & ptr, basic_json value) { + // get reference to parent of JSON pointer ptr const auto last_path = ptr.pop_back(); basic_json& parent = result.at(ptr); if (parent.is_object()) { + // use operator[] to add value parent[last_path] = value; } else if (parent.is_array()) { if (last_path == "-") { + // special case: append to back parent.push_back(value); } else { - parent.insert(parent.begin() + std::stoi(last_path), - value); + // default case: insert add offset + parent.insert(parent.begin() + std::stoi(last_path), value); } } }; + // wrapper for "remove" operation; remove value at ptr const auto operation_remove = [&result](json_pointer & ptr) { + // get reference to parent of JSON pointer ptr const auto last_path = ptr.pop_back(); basic_json& parent = result.at(ptr); + + // remove child if (parent.is_object()) { parent.erase(parent.find(last_path)); @@ -8874,41 +8876,57 @@ class basic_json } }; + // type check + if (not patch.is_array()) + { + // a JSON patch must be an array of objects + throw std::domain_error("JSON patch must be an array of objects"); + } + + // iterate and apply th eoperations for (const auto& val : patch) { + // wrapper to get a value for an operation + const auto get_value = [&val](const std::string & op, + const std::string & member, + bool string_type = false) -> basic_json& + { + // find value + auto it = val.m_value.object->find(member); + + // context-sensitive error message + const auto error_msg = (op == "op") ? "operation" : "operation '" + op + "'"; + + // check if desired value is present + if (it == val.m_value.object->end()) + { + throw std::domain_error(error_msg + " must have member '" + member + "'"); + } + + // check if result is of type string + if (string_type and not it->second.is_string()) + { + throw std::domain_error(error_msg + " must have string member '" + member + "'"); + } + + // no error: return value + return it->second; + }; + + // type check if (not val.is_object()) { throw std::domain_error("JSON patch must be an array of objects"); } - // collect members - const auto it_op = val.m_value.object->find("op"); - const auto it_path = val.m_value.object->find("path"); - const auto it_value = val.m_value.object->find("value"); - const auto it_from = val.m_value.object->find("from"); - - if (it_op == val.m_value.object->end() or not it_op->second.is_string()) - { - throw std::domain_error("operation must have a string 'op' member"); - } - - if (it_path == val.m_value.object->end() or not it_op->second.is_string()) - { - throw std::domain_error("operation must have a string 'path' member"); - } - - const std::string op = it_op->second; - const std::string path = it_path->second; - json_pointer ptr(path); + // collect mandatory members + const std::string op = get_value("op", "op", true); + const std::string path = get_value(op, "path", true); + json_pointer ptr(get_value(op, "path", true)); if (op == "add") { - if (it_value == val.m_value.object->end()) - { - throw std::domain_error("'add' operation must have member 'value'"); - } - - operation_add(ptr, it_value->second); + operation_add(ptr, get_value("add", "value")); } else if (op == "remove") { @@ -8916,21 +8934,11 @@ class basic_json } else if (op == "replace") { - if (it_value == val.m_value.object->end()) - { - throw std::domain_error("'replace' operation must have member 'value'"); - } - - result.at(ptr) = it_value->second; + result.at(ptr) = get_value("replace", "value"); } else if (op == "move") { - if (it_from == val.m_value.object->end()) - { - throw std::domain_error("'move' operation must have member 'from'"); - } - - const std::string from_path = it_from->second; + const std::string from_path = get_value("move", "from", true); json_pointer from_ptr(from_path); basic_json v = result[from_ptr]; @@ -8939,32 +8947,22 @@ class basic_json } else if (op == "copy") { - if (it_from == val.m_value.object->end()) - { - throw std::domain_error("'copy' operation must have member 'from'"); - } - - const std::string from_path = it_from->second; + const std::string from_path = get_value("copy", "from", true);; const json_pointer from_ptr(from_path); result[ptr] = result.at(from_ptr); } else if (op == "test") { - if (it_value == val.m_value.object->end()) - { - throw std::domain_error("'test' operation must have member 'value'"); - } - - if (result.at(ptr) != it_value->second) + if (result.at(ptr) != get_value("test", "value")) { throw std::domain_error("unsuccessful: " + val.dump()); } } else { - // op must be "add", "remove", "replace", "move", - // "copy", or "test" + // op must be "add", "remove", "replace", "move", "copy", or + // "test" throw std::domain_error("operation value '" + op + "' is invalid"); } } diff --git a/test/unit.cpp b/test/unit.cpp index 907e68bfc..664648cb6 100644 --- a/test/unit.cpp +++ b/test/unit.cpp @@ -12822,6 +12822,198 @@ TEST_CASE("JSON patch") CHECK(doc.apply_patch(patch) == expected); } } + + SECTION("errors") + { + SECTION("unknown operation") + { + SECTION("missing 'op'") + { + json j; + json patch = {{{"foo", "bar"}}}; + CHECK_THROWS_AS(j.apply_patch(patch), std::domain_error); + CHECK_THROWS_WITH(j.apply_patch(patch), "operation must have member 'op'"); + } + + SECTION("non-string 'op'") + { + json j; + json patch = {{{"op", 1}}}; + CHECK_THROWS_AS(j.apply_patch(patch), std::domain_error); + CHECK_THROWS_WITH(j.apply_patch(patch), "operation must have string member 'op'"); + } + } + + SECTION("add") + { + SECTION("missing 'path'") + { + json j; + json patch = {{{"op", "add"}}}; + CHECK_THROWS_AS(j.apply_patch(patch), std::domain_error); + CHECK_THROWS_WITH(j.apply_patch(patch), "operation 'add' must have member 'path'"); + } + + SECTION("non-string 'path'") + { + json j; + json patch = {{{"op", "add"}, {"path", 1}}}; + CHECK_THROWS_AS(j.apply_patch(patch), std::domain_error); + CHECK_THROWS_WITH(j.apply_patch(patch), "operation 'add' must have string member 'path'"); + } + + SECTION("missing 'value'") + { + json j; + json patch = {{{"op", "add"}, {"path", ""}}}; + CHECK_THROWS_AS(j.apply_patch(patch), std::domain_error); + CHECK_THROWS_WITH(j.apply_patch(patch), "operation 'add' must have member 'value'"); + } + } + + SECTION("remove") + { + SECTION("missing 'path'") + { + json j; + json patch = {{{"op", "remove"}}}; + CHECK_THROWS_AS(j.apply_patch(patch), std::domain_error); + CHECK_THROWS_WITH(j.apply_patch(patch), "operation 'remove' must have member 'path'"); + } + + SECTION("non-string 'path'") + { + json j; + json patch = {{{"op", "remove"}, {"path", 1}}}; + CHECK_THROWS_AS(j.apply_patch(patch), std::domain_error); + CHECK_THROWS_WITH(j.apply_patch(patch), "operation 'remove' must have string member 'path'"); + } + } + + SECTION("replace") + { + SECTION("missing 'path'") + { + json j; + json patch = {{{"op", "replace"}}}; + CHECK_THROWS_AS(j.apply_patch(patch), std::domain_error); + CHECK_THROWS_WITH(j.apply_patch(patch), "operation 'replace' must have member 'path'"); + } + + SECTION("non-string 'path'") + { + json j; + json patch = {{{"op", "replace"}, {"path", 1}}}; + CHECK_THROWS_AS(j.apply_patch(patch), std::domain_error); + CHECK_THROWS_WITH(j.apply_patch(patch), "operation 'replace' must have string member 'path'"); + } + + SECTION("missing 'value'") + { + json j; + json patch = {{{"op", "replace"}, {"path", ""}}}; + CHECK_THROWS_AS(j.apply_patch(patch), std::domain_error); + CHECK_THROWS_WITH(j.apply_patch(patch), "operation 'replace' must have member 'value'"); + } + } + + SECTION("move") + { + SECTION("missing 'path'") + { + json j; + json patch = {{{"op", "move"}}}; + CHECK_THROWS_AS(j.apply_patch(patch), std::domain_error); + CHECK_THROWS_WITH(j.apply_patch(patch), "operation 'move' must have member 'path'"); + } + + SECTION("non-string 'path'") + { + json j; + json patch = {{{"op", "move"}, {"path", 1}}}; + CHECK_THROWS_AS(j.apply_patch(patch), std::domain_error); + CHECK_THROWS_WITH(j.apply_patch(patch), "operation 'move' must have string member 'path'"); + } + + SECTION("missing 'from'") + { + json j; + json patch = {{{"op", "move"}, {"path", ""}}}; + CHECK_THROWS_AS(j.apply_patch(patch), std::domain_error); + CHECK_THROWS_WITH(j.apply_patch(patch), "operation 'move' must have member 'from'"); + } + + SECTION("non-string 'from'") + { + json j; + json patch = {{{"op", "move"}, {"path", ""}, {"from", 1}}}; + CHECK_THROWS_AS(j.apply_patch(patch), std::domain_error); + CHECK_THROWS_WITH(j.apply_patch(patch), "operation 'move' must have string member 'from'"); + } + } + + SECTION("copy") + { + SECTION("missing 'path'") + { + json j; + json patch = {{{"op", "copy"}}}; + CHECK_THROWS_AS(j.apply_patch(patch), std::domain_error); + CHECK_THROWS_WITH(j.apply_patch(patch), "operation 'copy' must have member 'path'"); + } + + SECTION("non-string 'path'") + { + json j; + json patch = {{{"op", "copy"}, {"path", 1}}}; + CHECK_THROWS_AS(j.apply_patch(patch), std::domain_error); + CHECK_THROWS_WITH(j.apply_patch(patch), "operation 'copy' must have string member 'path'"); + } + + SECTION("missing 'from'") + { + json j; + json patch = {{{"op", "copy"}, {"path", ""}}}; + CHECK_THROWS_AS(j.apply_patch(patch), std::domain_error); + CHECK_THROWS_WITH(j.apply_patch(patch), "operation 'copy' must have member 'from'"); + } + + SECTION("non-string 'from'") + { + json j; + json patch = {{{"op", "copy"}, {"path", ""}, {"from", 1}}}; + CHECK_THROWS_AS(j.apply_patch(patch), std::domain_error); + CHECK_THROWS_WITH(j.apply_patch(patch), "operation 'copy' must have string member 'from'"); + } + } + + SECTION("test") + { + SECTION("missing 'path'") + { + json j; + json patch = {{{"op", "test"}}}; + CHECK_THROWS_AS(j.apply_patch(patch), std::domain_error); + CHECK_THROWS_WITH(j.apply_patch(patch), "operation 'test' must have member 'path'"); + } + + SECTION("non-string 'path'") + { + json j; + json patch = {{{"op", "test"}, {"path", 1}}}; + CHECK_THROWS_AS(j.apply_patch(patch), std::domain_error); + CHECK_THROWS_WITH(j.apply_patch(patch), "operation 'test' must have string member 'path'"); + } + + SECTION("missing 'value'") + { + json j; + json patch = {{{"op", "test"}, {"path", ""}}}; + CHECK_THROWS_AS(j.apply_patch(patch), std::domain_error); + CHECK_THROWS_WITH(j.apply_patch(patch), "operation 'test' must have member 'value'"); + } + } + } } TEST_CASE("regression tests") From 8d4cf5ef8d0f3ad5bd7efb32dc7d3b44acc386e9 Mon Sep 17 00:00:00 2001 From: Niels Date: Sun, 24 Apr 2016 19:04:10 +0200 Subject: [PATCH 026/133] oops --- src/json.hpp | 2 +- src/json.hpp.re2c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/json.hpp b/src/json.hpp index b7a6f64a8..0a1db1c32 100644 --- a/src/json.hpp +++ b/src/json.hpp @@ -9612,7 +9612,7 @@ basic_json_parser_63: // collect mandatory members const std::string op = get_value("op", "op", true); const std::string path = get_value(op, "path", true); - json_pointer ptr(get_value(op, "path", true)); + json_pointer ptr(path); if (op == "add") { diff --git a/src/json.hpp.re2c b/src/json.hpp.re2c index c4c87f5de..52d76148c 100644 --- a/src/json.hpp.re2c +++ b/src/json.hpp.re2c @@ -8922,7 +8922,7 @@ class basic_json // collect mandatory members const std::string op = get_value("op", "op", true); const std::string path = get_value(op, "path", true); - json_pointer ptr(get_value(op, "path", true)); + json_pointer ptr(path); if (op == "add") { From 96cfe7463fa4faf32a2e618065955fc4ef43ff57 Mon Sep 17 00:00:00 2001 From: Niels Date: Sun, 24 Apr 2016 19:09:12 +0200 Subject: [PATCH 027/133] fixed some warnings --- src/json.hpp | 16 ++++++++-------- src/json.hpp.re2c | 16 ++++++++-------- 2 files changed, 16 insertions(+), 16 deletions(-) diff --git a/src/json.hpp b/src/json.hpp index 0a1db1c32..bfe45ada2 100644 --- a/src/json.hpp +++ b/src/json.hpp @@ -9522,7 +9522,7 @@ basic_json_parser_63: basic_json result = *this; // wrapper for "add" operation; add value at ptr - const auto operation_add = [&result](json_pointer & ptr, basic_json value) + const auto operation_add = [&result](json_pointer & ptr, basic_json val) { // get reference to parent of JSON pointer ptr const auto last_path = ptr.pop_back(); @@ -9531,19 +9531,19 @@ basic_json_parser_63: if (parent.is_object()) { // use operator[] to add value - parent[last_path] = value; + parent[last_path] = val; } else if (parent.is_array()) { if (last_path == "-") { // special case: append to back - parent.push_back(value); + parent.push_back(val); } else { // default case: insert add offset - parent.insert(parent.begin() + std::stoi(last_path), value); + parent.insert(parent.begin() + std::stoi(last_path), val); } } }; @@ -9579,7 +9579,7 @@ basic_json_parser_63: // wrapper to get a value for an operation const auto get_value = [&val](const std::string & op, const std::string & member, - bool string_type = false) -> basic_json& + bool string_type) -> basic_json& { // find value auto it = val.m_value.object->find(member); @@ -9616,7 +9616,7 @@ basic_json_parser_63: if (op == "add") { - operation_add(ptr, get_value("add", "value")); + operation_add(ptr, get_value("add", "value", false)); } else if (op == "remove") { @@ -9624,7 +9624,7 @@ basic_json_parser_63: } else if (op == "replace") { - result.at(ptr) = get_value("replace", "value"); + result.at(ptr) = get_value("replace", "value", false); } else if (op == "move") { @@ -9644,7 +9644,7 @@ basic_json_parser_63: } else if (op == "test") { - if (result.at(ptr) != get_value("test", "value")) + if (result.at(ptr) != get_value("test", "value", false)) { throw std::domain_error("unsuccessful: " + val.dump()); } diff --git a/src/json.hpp.re2c b/src/json.hpp.re2c index 52d76148c..af6df6edd 100644 --- a/src/json.hpp.re2c +++ b/src/json.hpp.re2c @@ -8832,7 +8832,7 @@ class basic_json basic_json result = *this; // wrapper for "add" operation; add value at ptr - const auto operation_add = [&result](json_pointer & ptr, basic_json value) + const auto operation_add = [&result](json_pointer & ptr, basic_json val) { // get reference to parent of JSON pointer ptr const auto last_path = ptr.pop_back(); @@ -8841,19 +8841,19 @@ class basic_json if (parent.is_object()) { // use operator[] to add value - parent[last_path] = value; + parent[last_path] = val; } else if (parent.is_array()) { if (last_path == "-") { // special case: append to back - parent.push_back(value); + parent.push_back(val); } else { // default case: insert add offset - parent.insert(parent.begin() + std::stoi(last_path), value); + parent.insert(parent.begin() + std::stoi(last_path), val); } } }; @@ -8889,7 +8889,7 @@ class basic_json // wrapper to get a value for an operation const auto get_value = [&val](const std::string & op, const std::string & member, - bool string_type = false) -> basic_json& + bool string_type) -> basic_json& { // find value auto it = val.m_value.object->find(member); @@ -8926,7 +8926,7 @@ class basic_json if (op == "add") { - operation_add(ptr, get_value("add", "value")); + operation_add(ptr, get_value("add", "value", false)); } else if (op == "remove") { @@ -8934,7 +8934,7 @@ class basic_json } else if (op == "replace") { - result.at(ptr) = get_value("replace", "value"); + result.at(ptr) = get_value("replace", "value", false); } else if (op == "move") { @@ -8954,7 +8954,7 @@ class basic_json } else if (op == "test") { - if (result.at(ptr) != get_value("test", "value")) + if (result.at(ptr) != get_value("test", "value", false)) { throw std::domain_error("unsuccessful: " + val.dump()); } From 28f73ed406ec8b4a5d79ea486f92160f844dfb9b Mon Sep 17 00:00:00 2001 From: Robert Marki Date: Sun, 24 Apr 2016 16:55:32 +0200 Subject: [PATCH 028/133] Refactor CMake listfile to define an interface imported library Define the library as an interface imported library so other targets can use the library as a dependency and use the interface properties of the library. --- CMakeLists.txt | 33 +++++++++++++-------------------- 1 file changed, 13 insertions(+), 20 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 16e9f960e..3985171b8 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -2,24 +2,17 @@ cmake_minimum_required(VERSION 2.8) project(json CXX) -add_executable(json_unit - src/json.hpp test/catch.hpp test/unit.cpp -) +add_library(${PROJECT_NAME} INTERFACE IMPORTED GLOBAL) +set_target_properties(${PROJECT_NAME} PROPERTIES + INTERFACE_INCLUDE_DIRECTORIES "${CMAKE_CURRENT_SOURCE_DIR}/src") -if(MSVC) - set(CMAKE_CXX_FLAGS - "/EHsc" - ) - - STRING(REPLACE "/O2" "/Od" CMAKE_CXX_FLAGS_RELEASE ${CMAKE_CXX_FLAGS_RELEASE}) - - add_definitions(-D_SCL_SECURE_NO_WARNINGS) -else(MSVC) - set(CMAKE_CXX_FLAGS - "-std=c++11" - ) -endif(MSVC) - -include_directories( - src test -) +set(UNIT_TEST_NAME "json_unit") +add_executable(${UNIT_TEST_NAME} + "test/catch.hpp" "test/unit.cpp") +set_target_properties(${UNIT_TEST_NAME} PROPERTIES + CXX_STANDARD 11 + CXX_STANDARD_REQUIRED ON + COMPILE_DEFINITIONS "$<$:_SCL_SECURE_NO_WARNINGS>" + COMPILE_OPTIONS "$<$:/EHsc;$<$:/Od>>") +target_include_directories(${UNIT_TEST_NAME} PRIVATE "test") +target_link_libraries(${UNIT_TEST_NAME} ${PROJECT_NAME}) From 30e396043aef78aae28a6785ab0253bc1df401d5 Mon Sep 17 00:00:00 2001 From: Robert Marki Date: Mon, 25 Apr 2016 09:36:05 +0200 Subject: [PATCH 029/133] Export library target and store build directory in package registry --- CMakeLists.txt | 26 +++++++++++++++++--------- 1 file changed, 17 insertions(+), 9 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 3985171b8..6cb02c095 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,18 +1,26 @@ -cmake_minimum_required(VERSION 2.8) +cmake_minimum_required(VERSION 3.0) project(json CXX) -add_library(${PROJECT_NAME} INTERFACE IMPORTED GLOBAL) -set_target_properties(${PROJECT_NAME} PROPERTIES - INTERFACE_INCLUDE_DIRECTORIES "${CMAKE_CURRENT_SOURCE_DIR}/src") +set(JSON_TARGET_NAME ${PROJECT_NAME}) +set(JSON_UNITTEST_TARGET_NAME "json_unit") +set(JSON_PACKAGE_NAME ${JSON_TARGET_NAME}) +set(JSON_TARGETS_FILENAME "${JSON_PACKAGE_NAME}Targets.cmake") -set(UNIT_TEST_NAME "json_unit") -add_executable(${UNIT_TEST_NAME} +add_library(${JSON_TARGET_NAME} INTERFACE) +target_include_directories(${JSON_TARGET_NAME} INTERFACE + $) + +add_executable(${JSON_UNITTEST_TARGET_NAME} "test/catch.hpp" "test/unit.cpp") -set_target_properties(${UNIT_TEST_NAME} PROPERTIES +set_target_properties(${JSON_UNITTEST_TARGET_NAME} PROPERTIES CXX_STANDARD 11 CXX_STANDARD_REQUIRED ON COMPILE_DEFINITIONS "$<$:_SCL_SECURE_NO_WARNINGS>" COMPILE_OPTIONS "$<$:/EHsc;$<$:/Od>>") -target_include_directories(${UNIT_TEST_NAME} PRIVATE "test") -target_link_libraries(${UNIT_TEST_NAME} ${PROJECT_NAME}) +target_include_directories(${JSON_UNITTEST_TARGET_NAME} PRIVATE "test") +target_link_libraries(${JSON_UNITTEST_TARGET_NAME} ${JSON_TARGET_NAME}) + +export(TARGETS ${JSON_TARGET_NAME} + FILE "${CMAKE_BINARY_DIR}/${JSON_TARGETS_FILENAME}") +export(PACKAGE ${JSON_PACKAGE_NAME}) From b1a2e9a7150fd7003c433c4e2693b8cebed2d8d9 Mon Sep 17 00:00:00 2001 From: Robert Marki Date: Mon, 25 Apr 2016 10:23:14 +0200 Subject: [PATCH 030/133] Create an install target for the project - define the project's version in the cmake listfile - create a config and config version file for the cmake package - install the json.hpp file and the package's targets, config and config version files --- CMakeLists.txt | 35 +++++++++++++++++++++++++++++++++-- cmake/config.cmake.in | 6 ++++++ 2 files changed, 39 insertions(+), 2 deletions(-) create mode 100644 cmake/config.cmake.in diff --git a/CMakeLists.txt b/CMakeLists.txt index 6cb02c095..75caa9a2d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,16 +1,25 @@ cmake_minimum_required(VERSION 3.0) -project(json CXX) +# define the project +project(json VERSION 2.0.0 LANGUAGES CXX) +# define project variables set(JSON_TARGET_NAME ${PROJECT_NAME}) set(JSON_UNITTEST_TARGET_NAME "json_unit") set(JSON_PACKAGE_NAME ${JSON_TARGET_NAME}) set(JSON_TARGETS_FILENAME "${JSON_PACKAGE_NAME}Targets.cmake") +set(JSON_CONFIG_FILENAME "${JSON_PACKAGE_NAME}Config.cmake") +set(JSON_CONFIGVERSION_FILENAME "${JSON_PACKAGE_NAME}ConfigVersion.cmake") +set(JSON_CONFIG_DESTINATION "cmake") +set(JSON_INCLUDE_DESTINATION "include/nlohmann") +# create and configure the library target add_library(${JSON_TARGET_NAME} INTERFACE) target_include_directories(${JSON_TARGET_NAME} INTERFACE - $) + $ + $) +# create and configure the unit test target add_executable(${JSON_UNITTEST_TARGET_NAME} "test/catch.hpp" "test/unit.cpp") set_target_properties(${JSON_UNITTEST_TARGET_NAME} PROPERTIES @@ -21,6 +30,28 @@ set_target_properties(${JSON_UNITTEST_TARGET_NAME} PROPERTIES target_include_directories(${JSON_UNITTEST_TARGET_NAME} PRIVATE "test") target_link_libraries(${JSON_UNITTEST_TARGET_NAME} ${JSON_TARGET_NAME}) +# generate a config and config version file for the package +include(CMakePackageConfigHelpers) +configure_package_config_file("cmake/config.cmake.in" + "${CMAKE_BINARY_DIR}/${JSON_CONFIG_FILENAME}" + INSTALL_DESTINATION ${JSON_CONFIG_DESTINATION}) +write_basic_package_version_file("${CMAKE_BINARY_DIR}/${JSON_CONFIGVERSION_FILENAME}" + VERSION ${PROJECT_VERSION} + COMPATIBILITY SameMajorVersion) + +# export the library target and store build directory in package registry export(TARGETS ${JSON_TARGET_NAME} FILE "${CMAKE_BINARY_DIR}/${JSON_TARGETS_FILENAME}") export(PACKAGE ${JSON_PACKAGE_NAME}) + +# install library target and config files +install(TARGETS ${JSON_TARGET_NAME} + EXPORT ${JSON_PACKAGE_NAME}) +install(FILES "src/json.hpp" + DESTINATION ${JSON_INCLUDE_DESTINATION}) +install(EXPORT ${JSON_PACKAGE_NAME} + FILE ${JSON_TARGETS_FILENAME} + DESTINATION ${JSON_CONFIG_DESTINATION}) +install(FILES "${CMAKE_BINARY_DIR}/${JSON_CONFIG_FILENAME}" + "${CMAKE_BINARY_DIR}/${JSON_CONFIGVERSION_FILENAME}" + DESTINATION ${JSON_CONFIG_DESTINATION}) diff --git a/cmake/config.cmake.in b/cmake/config.cmake.in new file mode 100644 index 000000000..3ff97adda --- /dev/null +++ b/cmake/config.cmake.in @@ -0,0 +1,6 @@ +@PACKAGE_INIT@ + +cmake_policy(PUSH) +cmake_policy(SET CMP0024 OLD) +include(${CMAKE_CURRENT_LIST_DIR}/@JSON_TARGETS_FILENAME@) +cmake_policy(POP) \ No newline at end of file From 192a6920342257d2feca3e35c9c4a8b44a792b32 Mon Sep 17 00:00:00 2001 From: Robert Marki Date: Mon, 25 Apr 2016 11:55:03 +0200 Subject: [PATCH 031/133] Generate package config files in cmake's current binary directory Generate the config files of the package in CMAKE_CURRENT_BINARY_DIR instead of CMAKE_BINARY_DIR because the later will refer to the main project's binary directory if the library is included in the project using the add_subdirectory command. --- CMakeLists.txt | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 75caa9a2d..4ae1d8bb5 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -33,15 +33,15 @@ target_link_libraries(${JSON_UNITTEST_TARGET_NAME} ${JSON_TARGET_NAME}) # generate a config and config version file for the package include(CMakePackageConfigHelpers) configure_package_config_file("cmake/config.cmake.in" - "${CMAKE_BINARY_DIR}/${JSON_CONFIG_FILENAME}" + "${CMAKE_CURRENT_BINARY_DIR}/${JSON_CONFIG_FILENAME}" INSTALL_DESTINATION ${JSON_CONFIG_DESTINATION}) -write_basic_package_version_file("${CMAKE_BINARY_DIR}/${JSON_CONFIGVERSION_FILENAME}" +write_basic_package_version_file("${CMAKE_CURRENT_BINARY_DIR}/${JSON_CONFIGVERSION_FILENAME}" VERSION ${PROJECT_VERSION} COMPATIBILITY SameMajorVersion) # export the library target and store build directory in package registry export(TARGETS ${JSON_TARGET_NAME} - FILE "${CMAKE_BINARY_DIR}/${JSON_TARGETS_FILENAME}") + FILE "${CMAKE_CURRENT_BINARY_DIR}/${JSON_TARGETS_FILENAME}") export(PACKAGE ${JSON_PACKAGE_NAME}) # install library target and config files @@ -52,6 +52,6 @@ install(FILES "src/json.hpp" install(EXPORT ${JSON_PACKAGE_NAME} FILE ${JSON_TARGETS_FILENAME} DESTINATION ${JSON_CONFIG_DESTINATION}) -install(FILES "${CMAKE_BINARY_DIR}/${JSON_CONFIG_FILENAME}" - "${CMAKE_BINARY_DIR}/${JSON_CONFIGVERSION_FILENAME}" +install(FILES "${CMAKE_CURRENT_BINARY_DIR}/${JSON_CONFIG_FILENAME}" + "${CMAKE_CURRENT_BINARY_DIR}/${JSON_CONFIGVERSION_FILENAME}" DESTINATION ${JSON_CONFIG_DESTINATION}) From 5e0bf75d6056eee48976f9c4e86ed52461d289aa Mon Sep 17 00:00:00 2001 From: Niels Date: Mon, 25 Apr 2016 23:17:04 +0200 Subject: [PATCH 032/133] cleanup, test, and diff --- README.md | 2 +- doc/examples/diff.cpp | 34 ++ doc/examples/diff.link | 1 + doc/examples/diff.output | 25 + doc/examples/patch.cpp | 30 + doc/examples/patch.link | 1 + doc/examples/patch.output | 11 + src/json.hpp | 753 +++++++++++++++++------- src/json.hpp.re2c | 753 +++++++++++++++++------- test/unit.cpp | 1174 +++++++++++++++++++++++++++---------- 10 files changed, 2068 insertions(+), 716 deletions(-) create mode 100644 doc/examples/diff.cpp create mode 100644 doc/examples/diff.link create mode 100644 doc/examples/diff.output create mode 100644 doc/examples/patch.cpp create mode 100644 doc/examples/patch.link create mode 100644 doc/examples/patch.output diff --git a/README.md b/README.md index 2dd60bf13..8f4779f95 100644 --- a/README.md +++ b/README.md @@ -428,7 +428,7 @@ $ make $ ./json_unit "*" =============================================================================== -All tests passed (3344416 assertions in 30 test cases) +All tests passed (3344554 assertions in 31 test cases) ``` For more information, have a look at the file [.travis.yml](https://github.com/nlohmann/json/blob/master/.travis.yml). diff --git a/doc/examples/diff.cpp b/doc/examples/diff.cpp new file mode 100644 index 000000000..d81a58dbd --- /dev/null +++ b/doc/examples/diff.cpp @@ -0,0 +1,34 @@ +#include + +using json = nlohmann::json; + +int main() +{ + // the source document + json source = R"( + { + "baz": "qux", + "foo": "bar" + } + )"_json; + + // the target document + json target = R"( + { + "baz": "boo", + "hello": [ + "world" + ] + } + )"_json; + + // create the patch + json patch = json::diff(source, target); + + // roundtrip + json patched_source = source.patch(patch); + + // output patch and roundtrip result + std::cout << std::setw(4) << patch << "\n\n" + << std::setw(4) << patched_source << std::endl; +} diff --git a/doc/examples/diff.link b/doc/examples/diff.link new file mode 100644 index 000000000..c3e3fa4d7 --- /dev/null +++ b/doc/examples/diff.link @@ -0,0 +1 @@ +online \ No newline at end of file diff --git a/doc/examples/diff.output b/doc/examples/diff.output new file mode 100644 index 000000000..7dc79791f --- /dev/null +++ b/doc/examples/diff.output @@ -0,0 +1,25 @@ +[ + { + "op": "replace", + "path": "/baz", + "value": "boo" + }, + { + "op": "remove", + "path": "/foo" + }, + { + "op": "add", + "path": "/hello", + "value": [ + "world" + ] + } +] + +{ + "baz": "boo", + "hello": [ + "world" + ] +} diff --git a/doc/examples/patch.cpp b/doc/examples/patch.cpp new file mode 100644 index 000000000..24a52d596 --- /dev/null +++ b/doc/examples/patch.cpp @@ -0,0 +1,30 @@ +#include + +using json = nlohmann::json; + +int main() +{ + // the original document + json doc = R"( + { + "baz": "qux", + "foo": "bar" + } + )"_json; + + // the patch + json patch = R"( + [ + { "op": "replace", "path": "/baz", "value": "boo" }, + { "op": "add", "path": "/hello", "value": ["world"] }, + { "op": "remove", "path": "/foo"} + ] + )"_json; + + // apply the patch + json patched_doc = doc.patch(patch); + + // output original and patched document + std::cout << std::setw(4) << doc << "\n\n" + << std::setw(4) << patched_doc << std::endl; +} diff --git a/doc/examples/patch.link b/doc/examples/patch.link new file mode 100644 index 000000000..5d5032b7b --- /dev/null +++ b/doc/examples/patch.link @@ -0,0 +1 @@ +online \ No newline at end of file diff --git a/doc/examples/patch.output b/doc/examples/patch.output new file mode 100644 index 000000000..eb558fe25 --- /dev/null +++ b/doc/examples/patch.output @@ -0,0 +1,11 @@ +{ + "baz": "qux", + "foo": "bar" +} + +{ + "baz": "boo", + "hello": [ + "world" + ] +} diff --git a/src/json.hpp b/src/json.hpp index bfe45ada2..1785f182f 100644 --- a/src/json.hpp +++ b/src/json.hpp @@ -3595,121 +3595,6 @@ class basic_json } } - /*! - @brief access specified element via JSON Pointer - - Uses a JSON pointer to retrieve a reference to the respective JSON value. - No bound checking is performed. Similar to - @ref operator[](const typename object_t::key_type&), `null` values - are created in arrays and objects if necessary. - - In particular: - - If the JSON pointer points to an object key that does not exist, it - is created an filled with a `null` value before a reference to it - is returned. - - If the JSON pointer points to an array index that does not exist, it - is created an filled with a `null` value before a reference to it - is returned. All indices between the current maximum and the given - index are also filled with `null`. - - The special value `-` is treated as a synonym for the index past the - end. - - @param[in] ptr a JSON pointer - - @return reference to the element pointed to by @a ptr - - @complexity Constant. - - @throw std::out_of_range if the JSON pointer can not be resolved - @throw std::domain_error if an array index begins with '0' - @throw std::invalid_argument if an array index was not a number - - @liveexample{The behavior is shown in the example.,operatorjson_pointer} - - @since version 2.0.0 - */ - reference operator[](const json_pointer& ptr) - { - return ptr.get_unchecked(this); - } - - /*! - @brief access specified element via JSON Pointer - - Uses a JSON pointer to retrieve a reference to the respective JSON value. - No bound checking is performed. The function does not change the JSON - value; no `null` values are created. In particular, the the special value - `-` yields an exception. - - @param[in] ptr JSON pointer to the desired element - - @return const reference to the element pointed to by @a ptr - - @complexity Constant. - - @throw std::out_of_range if the JSON pointer can not be resolved - @throw std::domain_error if an array index begins with '0' - @throw std::invalid_argument if an array index was not a number - - @liveexample{The behavior is shown in the example.,operatorjson_pointer_const} - - @since version 2.0.0 - */ - const_reference operator[](const json_pointer& ptr) const - { - return ptr.get_unchecked(this); - } - - /*! - @brief access specified element via JSON Pointer - - Returns a reference to the element at with specified JSON pointer @a ptr, - with bounds checking. - - @param[in] ptr JSON pointer to the desired element - - @return reference to the element pointed to by @a ptr - - @complexity Constant. - - @throw std::out_of_range if the JSON pointer can not be resolved - @throw std::domain_error if an array index begins with '0' - @throw std::invalid_argument if an array index was not a number - - @liveexample{The behavior is shown in the example.,at_json_pointer} - - @since version 2.0.0 - */ - reference at(const json_pointer& ptr) - { - return ptr.get_checked(this); - } - - /*! - @brief access specified element via JSON Pointer - - Returns a const reference to the element at with specified JSON pointer - @a ptr, with bounds checking. - - @param[in] ptr JSON pointer to the desired element - - @return reference to the element pointed to by @a ptr - - @complexity Constant. - - @throw std::out_of_range if the JSON pointer can not be resolved - @throw std::domain_error if an array index begins with '0' - @throw std::invalid_argument if an array index was not a number - - @liveexample{The behavior is shown in the example.,at_json_pointer_const} - - @since version 2.0.0 - */ - const_reference at(const json_pointer& ptr) const - { - return ptr.get_checked(this); - } - /*! @brief access specified object element with default value @@ -4145,8 +4030,8 @@ class basic_json @throw std::domain_error when called on a type other than JSON array; example: `"cannot use erase() with null"` - @throw std::out_of_range when `idx >= size()`; example: `"index out of - range"` + @throw std::out_of_range when `idx >= size()`; example: `"array index 17 + is out of range"` @complexity Linear in distance between @a idx and the end of the container. @@ -4167,7 +4052,7 @@ class basic_json { if (idx >= size()) { - throw std::out_of_range("index out of range"); + throw std::out_of_range("array index " + std::to_string(idx) + " is out of range"); } assert(m_value.array != nullptr); @@ -8969,9 +8854,17 @@ basic_json_parser_63: : reference_tokens(split(s)) {} + /// test for inequality + bool operator!=(const json_pointer& rhs) const + { + return reference_tokens != rhs.reference_tokens; + } + + private: + /// remove and return last reference pointer std::string pop_back() { - if (reference_tokens.empty()) + if (is_root()) { throw std::domain_error("JSON pointer has no parent"); } @@ -8981,7 +8874,24 @@ basic_json_parser_63: return last; } - private: + /// return whether pointer points to the root document + bool is_root() const + { + return reference_tokens.empty(); + } + + json_pointer top() const + { + if (is_root()) + { + throw std::domain_error("JSON pointer has no parent"); + } + + json_pointer result = *this; + result.reference_tokens = {reference_tokens[0]}; + return result; + } + /*! @brief create and return a reference to the pointed to value */ @@ -9020,7 +8930,7 @@ basic_json_parser_63: case value_t::array: { // create an entry in the array - result = &result->operator[](static_cast(std::stoi(reference_token))); + result = &result->operator[](static_cast(std::stoi(reference_token))); break; } @@ -9083,7 +8993,7 @@ basic_json_parser_63: else { // convert array index to number; unchecked access - ptr = &ptr->operator[](static_cast(std::stoi(reference_token))); + ptr = &ptr->operator[](static_cast(std::stoi(reference_token))); } break; } @@ -9128,7 +9038,7 @@ basic_json_parser_63: } // note: at performs range check - ptr = &ptr->at(static_cast(std::stoi(reference_token))); + ptr = &ptr->at(static_cast(std::stoi(reference_token))); break; } @@ -9180,7 +9090,7 @@ basic_json_parser_63: } // use unchecked array access - ptr = &ptr->operator[](static_cast(std::stoi(reference_token))); + ptr = &ptr->operator[](static_cast(std::stoi(reference_token))); break; } @@ -9224,7 +9134,7 @@ basic_json_parser_63: } // note: at performs range check - ptr = &ptr->at(static_cast(std::stoi(reference_token))); + ptr = &ptr->at(static_cast(std::stoi(reference_token))); break; } @@ -9291,12 +9201,8 @@ basic_json_parser_63: } } - // first transform any occurrence of the sequence '~1' to '/' - replace_substring(reference_token, "~1", "/"); - // then transform any occurrence of the sequence '~0' to '~' - replace_substring(reference_token, "~0", "~"); - // finally, store the reference token + unescape(reference_token); result.push_back(reference_token); } @@ -9332,6 +9238,24 @@ basic_json_parser_63: ); } + /// escape tilde and slash + static std::string escape(std::string s) + { + // escape "~"" to "~0" and "/" to "~1" + replace_substring(s, "~", "~0"); + replace_substring(s, "/", "~1"); + return s; + } + + /// unescape tilde and slash + static void unescape(std::string& s) + { + // first transform any occurrence of the sequence '~1' to '/' + replace_substring(s, "~1", "/"); + // then transform any occurrence of the sequence '~0' to '~' + replace_substring(s, "~0", "~"); + } + /*! @param[in] reference_string the reference string to the current value @param[in] value the value to consider @@ -9339,7 +9263,7 @@ basic_json_parser_63: @note Empty objects or arrays are flattened to `null`. */ - static void flatten(const std::string reference_string, + static void flatten(const std::string& reference_string, const basic_json& value, basic_json& result) { @@ -9376,12 +9300,7 @@ basic_json_parser_63: // iterate object and use keys as reference string for (const auto& element : *value.m_value.object) { - // escape "~"" to "~0" and "/" to "~1" - std::string key(element.first); - replace_substring(key, "~", "~0"); - replace_substring(key, "/", "~1"); - - flatten(reference_string + "/" + key, + flatten(reference_string + "/" + escape(element.first), element.second, result); } } @@ -9435,13 +9354,128 @@ basic_json_parser_63: std::vector reference_tokens {}; }; - //////////////////////////// - // JSON Pointer functions // - //////////////////////////// + ////////////////////////// + // JSON Pointer support // + ////////////////////////// /// @name JSON Pointer functions /// @{ + /*! + @brief access specified element via JSON Pointer + + Uses a JSON pointer to retrieve a reference to the respective JSON value. + No bound checking is performed. Similar to + @ref operator[](const typename object_t::key_type&), `null` values + are created in arrays and objects if necessary. + + In particular: + - If the JSON pointer points to an object key that does not exist, it + is created an filled with a `null` value before a reference to it + is returned. + - If the JSON pointer points to an array index that does not exist, it + is created an filled with a `null` value before a reference to it + is returned. All indices between the current maximum and the given + index are also filled with `null`. + - The special value `-` is treated as a synonym for the index past the + end. + + @param[in] ptr a JSON pointer + + @return reference to the element pointed to by @a ptr + + @complexity Constant. + + @throw std::out_of_range if the JSON pointer can not be resolved + @throw std::domain_error if an array index begins with '0' + @throw std::invalid_argument if an array index was not a number + + @liveexample{The behavior is shown in the example.,operatorjson_pointer} + + @since version 2.0.0 + */ + reference operator[](const json_pointer& ptr) + { + return ptr.get_unchecked(this); + } + + /*! + @brief access specified element via JSON Pointer + + Uses a JSON pointer to retrieve a reference to the respective JSON value. + No bound checking is performed. The function does not change the JSON + value; no `null` values are created. In particular, the the special value + `-` yields an exception. + + @param[in] ptr JSON pointer to the desired element + + @return const reference to the element pointed to by @a ptr + + @complexity Constant. + + @throw std::out_of_range if the JSON pointer can not be resolved + @throw std::domain_error if an array index begins with '0' + @throw std::invalid_argument if an array index was not a number + + @liveexample{The behavior is shown in the example.,operatorjson_pointer_const} + + @since version 2.0.0 + */ + const_reference operator[](const json_pointer& ptr) const + { + return ptr.get_unchecked(this); + } + + /*! + @brief access specified element via JSON Pointer + + Returns a reference to the element at with specified JSON pointer @a ptr, + with bounds checking. + + @param[in] ptr JSON pointer to the desired element + + @return reference to the element pointed to by @a ptr + + @complexity Constant. + + @throw std::out_of_range if the JSON pointer can not be resolved + @throw std::domain_error if an array index begins with '0' + @throw std::invalid_argument if an array index was not a number + + @liveexample{The behavior is shown in the example.,at_json_pointer} + + @since version 2.0.0 + */ + reference at(const json_pointer& ptr) + { + return ptr.get_checked(this); + } + + /*! + @brief access specified element via JSON Pointer + + Returns a const reference to the element at with specified JSON pointer + @a ptr, with bounds checking. + + @param[in] ptr JSON pointer to the desired element + + @return reference to the element pointed to by @a ptr + + @complexity Constant. + + @throw std::out_of_range if the JSON pointer can not be resolved + @throw std::domain_error if an array index begins with '0' + @throw std::invalid_argument if an array index was not a number + + @liveexample{The behavior is shown in the example.,at_json_pointer_const} + + @since version 2.0.0 + */ + const_reference at(const json_pointer& ptr) const + { + return ptr.get_checked(this); + } + /*! @brief return flattened JSON value @@ -9505,45 +9539,146 @@ basic_json_parser_63: /// @} + ////////////////////////// + // JSON Patch functions // + ////////////////////////// + + /// @name JSON Patch functions + /// @{ + /*! @brief applies a JSON patch + [JSON Patch](http://jsonpatch.com) defines a JSON document structure for + expressing a sequence of operations to apply to a JSON) document. With + this funcion, a JSON Patch is applied to the current JSON value by + executing all operations from the patch. + @param[in] patch JSON patch document @return patched document - @note The original JSON value is not changed; that is, the patch is - applied to a copy of the value. + @note The application of a patch is atomic: Either all operations succeed + and the patched document is returned or an exception is thrown. In + any case, the original value is not changed: the patch is applied + to a copy of the value. - @sa [RFC 6902](https://tools.ietf.org/html/rfc6902) + @throw std::out_of_range if a JSON pointer inside the patch could not + be resolved successfully in the current JSON value; example: `"key baz + not found"` + @throw invalid_argument if the JSON patch is malformed (e.g., mandatory + attributes are missing); example: `"operation add must have member path"` + + @complexity Linear in the size of the JSON value and the length of the + JSON patch. As usually only a fraction of the JSON value is affected by + the patch, the complexity can usually be neglected. + + @liveexample{The following code shows how a JSON patch is applied to a + value.,patch} + + @sa @ref diff -- create a JSON patch by comparing two JSON values + + @sa [RFC 6902 (JSON Patch)](https://tools.ietf.org/html/rfc6902) + @sa [RFC 6901 (JSON Pointer)](https://tools.ietf.org/html/rfc6901) + + @since version 2.0.0 */ - basic_json apply_patch(const basic_json& patch) const + basic_json patch(const basic_json& patch) const { // make a working copy to apply the patch to basic_json result = *this; + // the valid JSON Patch operations + enum class patch_operations {add, remove, replace, move, copy, test, invalid}; + + const auto get_op = [](const std::string op) + { + if (op == "add") + { + return patch_operations::add; + } + if (op == "remove") + { + return patch_operations::remove; + } + if (op == "replace") + { + return patch_operations::replace; + } + if (op == "move") + { + return patch_operations::move; + } + if (op == "copy") + { + return patch_operations::copy; + } + if (op == "test") + { + return patch_operations::test; + } + + return patch_operations::invalid; + }; + // wrapper for "add" operation; add value at ptr const auto operation_add = [&result](json_pointer & ptr, basic_json val) { - // get reference to parent of JSON pointer ptr - const auto last_path = ptr.pop_back(); - basic_json& parent = result.at(ptr); - - if (parent.is_object()) + // adding to the root of the target document means replacing it + if (ptr.is_root()) { - // use operator[] to add value - parent[last_path] = val; + result = val; } - else if (parent.is_array()) + else { - if (last_path == "-") + // make sure the top element of the pointer exists + json_pointer top_pointer = ptr.top(); + if (top_pointer != ptr) { - // special case: append to back - parent.push_back(val); + basic_json& x = result.at(top_pointer); } - else + + // get reference to parent of JSON pointer ptr + const auto last_path = ptr.pop_back(); + basic_json& parent = result[ptr]; + + switch (parent.m_type) { - // default case: insert add offset - parent.insert(parent.begin() + std::stoi(last_path), val); + case value_t::null: + case value_t::object: + { + // use operator[] to add value + parent[last_path] = val; + break; + } + + case value_t::array: + { + if (last_path == "-") + { + // special case: append to back + parent.push_back(val); + } + else + { + const auto idx = std::stoi(last_path); + if (static_cast(idx) > parent.size()) + { + // avoid undefined behavior + throw std::out_of_range("array index " + std::to_string(idx) + " is out of range"); + } + else + { + // default case: insert add offset + parent.insert(parent.begin() + static_cast(idx), val); + } + } + break; + } + + default: + { + throw std::domain_error("unexpected parent type " + parent.type_name()); + } } } }; @@ -9558,11 +9693,21 @@ basic_json_parser_63: // remove child if (parent.is_object()) { - parent.erase(parent.find(last_path)); + // perform range check + auto it = parent.find(last_path); + if (it != parent.end()) + { + parent.erase(it); + } + else + { + throw std::out_of_range("key '" + last_path + "' not found"); + } } else if (parent.is_array()) { - parent.erase(parent.begin() + std::stoi(last_path)); + // note erase performs range check + parent.erase(static_cast(std::stoi(last_path))); } }; @@ -9570,7 +9715,7 @@ basic_json_parser_63: if (not patch.is_array()) { // a JSON patch must be an array of objects - throw std::domain_error("JSON patch must be an array of objects"); + throw std::invalid_argument("JSON patch must be an array of objects"); } // iterate and apply th eoperations @@ -9590,13 +9735,13 @@ basic_json_parser_63: // check if desired value is present if (it == val.m_value.object->end()) { - throw std::domain_error(error_msg + " must have member '" + member + "'"); + throw std::invalid_argument(error_msg + " must have member '" + member + "'"); } // check if result is of type string if (string_type and not it->second.is_string()) { - throw std::domain_error(error_msg + " must have string member '" + member + "'"); + throw std::invalid_argument(error_msg + " must have string member '" + member + "'"); } // no error: return value @@ -9606,7 +9751,7 @@ basic_json_parser_63: // type check if (not val.is_object()) { - throw std::domain_error("JSON patch must be an array of objects"); + throw std::invalid_argument("JSON patch must be an array of objects"); } // collect mandatory members @@ -9614,51 +9759,251 @@ basic_json_parser_63: const std::string path = get_value(op, "path", true); json_pointer ptr(path); - if (op == "add") + switch (get_op(op)) { - operation_add(ptr, get_value("add", "value", false)); - } - else if (op == "remove") - { - operation_remove(ptr); - } - else if (op == "replace") - { - result.at(ptr) = get_value("replace", "value", false); - } - else if (op == "move") - { - const std::string from_path = get_value("move", "from", true); - json_pointer from_ptr(from_path); - basic_json v = result[from_ptr]; - - operation_remove(from_ptr); - operation_add(ptr, v); - } - else if (op == "copy") - { - const std::string from_path = get_value("copy", "from", true);; - const json_pointer from_ptr(from_path); - - result[ptr] = result.at(from_ptr); - } - else if (op == "test") - { - if (result.at(ptr) != get_value("test", "value", false)) + case patch_operations::add: { - throw std::domain_error("unsuccessful: " + val.dump()); + operation_add(ptr, get_value("add", "value", false)); + break; + } + + case patch_operations::remove: + { + operation_remove(ptr); + break; + } + + case patch_operations::replace: + { + // the "path" location must exist - use at() + result.at(ptr) = get_value("replace", "value", false); + break; + } + + case patch_operations::move: + { + const std::string from_path = get_value("move", "from", true); + json_pointer from_ptr(from_path); + + // the "from" location must exist - use at() + basic_json v = result.at(from_ptr); + + // The move operation is functionally identical to a + // "remove" operation on the "from" location, followed + // immediately by an "add" operation at the target + // location with the value that was just removed. + operation_remove(from_ptr); + operation_add(ptr, v); + break; + } + + case patch_operations::copy: + { + const std::string from_path = get_value("copy", "from", true);; + const json_pointer from_ptr(from_path); + + // the "from" location must exist - use at() + result[ptr] = result.at(from_ptr); + break; + } + + case patch_operations::test: + { + bool success = false; + try + { + // check if "value" matches the one at "path" + // the "path" location must exist - use at() + success = (result.at(ptr) == get_value("test", "value", false)); + } + catch (std::out_of_range&) + { + // ignore out of range errors: success remains false + } + + // throw an exception if test fails + if (not success) + { + throw std::domain_error("unsuccessful: " + val.dump()); + } + + break; + } + + case patch_operations::invalid: + { + // op must be "add", "remove", "replace", "move", "copy", or + // "test" + throw std::invalid_argument("operation value '" + op + "' is invalid"); } - } - else - { - // op must be "add", "remove", "replace", "move", "copy", or - // "test" - throw std::domain_error("operation value '" + op + "' is invalid"); } } return result; } + + /*! + @brief creates a diff as a JSON patch + + Creates a [JSON Patch](http://jsonpatch.com) so that value @a source can + be changed into the value @a target by calling @ref patch function. + + @invariant For two JSON values @a source and @a target, the following code + yields always `true`: + @code {.cpp} + source.patch(diff(source, target)) == target; + @endcode + + @note Currently, only `remove`, `add`, and `replace` operations are + generated. + + @param[in] source JSON value to copare from + @param[in] target JSON value to copare against + @param[in] path helper value to create JSON pointers + + @return a JSON patch to convert the @a source to @a target + + @complexity Linear in the lengths of @a source and @a target. + + @liveexample{The following code shows how a JSON patch is created as a + diff for two JSON values.,diff} + + @sa @ref patch -- apply a JSON patch + + @sa [RFC 6902 (JSON Patch)](https://tools.ietf.org/html/rfc6902) + + @since version 2.0.0 + */ + static basic_json diff(const basic_json& source, + const basic_json& target, + std::string path = "") noexcept + { + // the patch + basic_json result(value_t::array); + + // if the values are the same, return empty patch + if (source == target) + { + return result; + } + + if (source.type() != target.type()) + { + // different types: replace value + result.push_back( + { + {"op", "replace"}, + {"path", path}, + {"value", target} + }); + } + else + { + switch (source.type()) + { + case value_t::array: + { + // first pass: traverse common elements + size_t i = 0; + while (i < source.size() and i < target.size()) + { + // recursive call to compare array values at index i + auto temp_diff = diff(source[i], target[i], path + "/" + std::to_string(i)); + result.insert(result.end(), temp_diff.begin(), temp_diff.end()); + ++i; + } + + // i now reached the end of at least one array + // in a second pass, traverse the remaining elements + + // remove my remaining elements + while (i < source.size()) + { + result.push_back(object( + { + {"op", "remove"}, + {"path", path + "/" + std::to_string(i)} + })); + ++i; + } + + // add other remaining elements + while (i < target.size()) + { + result.push_back( + { + {"op", "add"}, + {"path", path + "/" + std::to_string(i)}, + {"value", target[i]} + }); + ++i; + } + + break; + } + + case value_t::object: + { + // first pass: traverse this object's elements + for (auto it = source.begin(); it != source.end(); ++it) + { + // escape the key name to be used in a JSON patch + const auto key = json_pointer::escape(it.key()); + + if (target.find(it.key()) != target.end()) + { + // recursive call to compare object values at key it + auto temp_diff = diff(it.value(), target[it.key()], path + "/" + key); + result.insert(result.end(), temp_diff.begin(), temp_diff.end()); + } + else + { + // found a key that is not in o -> remove it + result.push_back(object( + { + {"op", "remove"}, + {"path", path + "/" + key} + })); + } + } + + // second pass: traverse other object's elements + for (auto it = target.begin(); it != target.end(); ++it) + { + if (source.find(it.key()) == source.end()) + { + // found a key that is not in this -> add it + const auto key = json_pointer::escape(it.key()); + result.push_back( + { + {"op", "add"}, + {"path", path + "/" + key}, + {"value", it.value()} + }); + } + } + + break; + } + + default: + { + // both primitive type: replace value + result.push_back( + { + {"op", "replace"}, + {"path", path}, + {"value", target} + }); + break; + } + } + } + + return result; + } + + /// @} }; @@ -9678,9 +10023,9 @@ using json = basic_json<>; } -///////////////////////// -// nonmember functions // -///////////////////////// +/////////////////////// +// nonmember support // +/////////////////////// // specialization of std::swap, and std::hash namespace std diff --git a/src/json.hpp.re2c b/src/json.hpp.re2c index af6df6edd..51b721670 100644 --- a/src/json.hpp.re2c +++ b/src/json.hpp.re2c @@ -3595,121 +3595,6 @@ class basic_json } } - /*! - @brief access specified element via JSON Pointer - - Uses a JSON pointer to retrieve a reference to the respective JSON value. - No bound checking is performed. Similar to - @ref operator[](const typename object_t::key_type&), `null` values - are created in arrays and objects if necessary. - - In particular: - - If the JSON pointer points to an object key that does not exist, it - is created an filled with a `null` value before a reference to it - is returned. - - If the JSON pointer points to an array index that does not exist, it - is created an filled with a `null` value before a reference to it - is returned. All indices between the current maximum and the given - index are also filled with `null`. - - The special value `-` is treated as a synonym for the index past the - end. - - @param[in] ptr a JSON pointer - - @return reference to the element pointed to by @a ptr - - @complexity Constant. - - @throw std::out_of_range if the JSON pointer can not be resolved - @throw std::domain_error if an array index begins with '0' - @throw std::invalid_argument if an array index was not a number - - @liveexample{The behavior is shown in the example.,operatorjson_pointer} - - @since version 2.0.0 - */ - reference operator[](const json_pointer& ptr) - { - return ptr.get_unchecked(this); - } - - /*! - @brief access specified element via JSON Pointer - - Uses a JSON pointer to retrieve a reference to the respective JSON value. - No bound checking is performed. The function does not change the JSON - value; no `null` values are created. In particular, the the special value - `-` yields an exception. - - @param[in] ptr JSON pointer to the desired element - - @return const reference to the element pointed to by @a ptr - - @complexity Constant. - - @throw std::out_of_range if the JSON pointer can not be resolved - @throw std::domain_error if an array index begins with '0' - @throw std::invalid_argument if an array index was not a number - - @liveexample{The behavior is shown in the example.,operatorjson_pointer_const} - - @since version 2.0.0 - */ - const_reference operator[](const json_pointer& ptr) const - { - return ptr.get_unchecked(this); - } - - /*! - @brief access specified element via JSON Pointer - - Returns a reference to the element at with specified JSON pointer @a ptr, - with bounds checking. - - @param[in] ptr JSON pointer to the desired element - - @return reference to the element pointed to by @a ptr - - @complexity Constant. - - @throw std::out_of_range if the JSON pointer can not be resolved - @throw std::domain_error if an array index begins with '0' - @throw std::invalid_argument if an array index was not a number - - @liveexample{The behavior is shown in the example.,at_json_pointer} - - @since version 2.0.0 - */ - reference at(const json_pointer& ptr) - { - return ptr.get_checked(this); - } - - /*! - @brief access specified element via JSON Pointer - - Returns a const reference to the element at with specified JSON pointer - @a ptr, with bounds checking. - - @param[in] ptr JSON pointer to the desired element - - @return reference to the element pointed to by @a ptr - - @complexity Constant. - - @throw std::out_of_range if the JSON pointer can not be resolved - @throw std::domain_error if an array index begins with '0' - @throw std::invalid_argument if an array index was not a number - - @liveexample{The behavior is shown in the example.,at_json_pointer_const} - - @since version 2.0.0 - */ - const_reference at(const json_pointer& ptr) const - { - return ptr.get_checked(this); - } - /*! @brief access specified object element with default value @@ -4145,8 +4030,8 @@ class basic_json @throw std::domain_error when called on a type other than JSON array; example: `"cannot use erase() with null"` - @throw std::out_of_range when `idx >= size()`; example: `"index out of - range"` + @throw std::out_of_range when `idx >= size()`; example: `"array index 17 + is out of range"` @complexity Linear in distance between @a idx and the end of the container. @@ -4167,7 +4052,7 @@ class basic_json { if (idx >= size()) { - throw std::out_of_range("index out of range"); + throw std::out_of_range("array index " + std::to_string(idx) + " is out of range"); } assert(m_value.array != nullptr); @@ -8279,9 +8164,17 @@ class basic_json : reference_tokens(split(s)) {} + /// test for inequality + bool operator!=(const json_pointer& rhs) const + { + return reference_tokens != rhs.reference_tokens; + } + + private: + /// remove and return last reference pointer std::string pop_back() { - if (reference_tokens.empty()) + if (is_root()) { throw std::domain_error("JSON pointer has no parent"); } @@ -8291,7 +8184,24 @@ class basic_json return last; } - private: + /// return whether pointer points to the root document + bool is_root() const + { + return reference_tokens.empty(); + } + + json_pointer top() const + { + if (is_root()) + { + throw std::domain_error("JSON pointer has no parent"); + } + + json_pointer result = *this; + result.reference_tokens = {reference_tokens[0]}; + return result; + } + /*! @brief create and return a reference to the pointed to value */ @@ -8330,7 +8240,7 @@ class basic_json case value_t::array: { // create an entry in the array - result = &result->operator[](static_cast(std::stoi(reference_token))); + result = &result->operator[](static_cast(std::stoi(reference_token))); break; } @@ -8393,7 +8303,7 @@ class basic_json else { // convert array index to number; unchecked access - ptr = &ptr->operator[](static_cast(std::stoi(reference_token))); + ptr = &ptr->operator[](static_cast(std::stoi(reference_token))); } break; } @@ -8438,7 +8348,7 @@ class basic_json } // note: at performs range check - ptr = &ptr->at(static_cast(std::stoi(reference_token))); + ptr = &ptr->at(static_cast(std::stoi(reference_token))); break; } @@ -8490,7 +8400,7 @@ class basic_json } // use unchecked array access - ptr = &ptr->operator[](static_cast(std::stoi(reference_token))); + ptr = &ptr->operator[](static_cast(std::stoi(reference_token))); break; } @@ -8534,7 +8444,7 @@ class basic_json } // note: at performs range check - ptr = &ptr->at(static_cast(std::stoi(reference_token))); + ptr = &ptr->at(static_cast(std::stoi(reference_token))); break; } @@ -8601,12 +8511,8 @@ class basic_json } } - // first transform any occurrence of the sequence '~1' to '/' - replace_substring(reference_token, "~1", "/"); - // then transform any occurrence of the sequence '~0' to '~' - replace_substring(reference_token, "~0", "~"); - // finally, store the reference token + unescape(reference_token); result.push_back(reference_token); } @@ -8642,6 +8548,24 @@ class basic_json ); } + /// escape tilde and slash + static std::string escape(std::string s) + { + // escape "~"" to "~0" and "/" to "~1" + replace_substring(s, "~", "~0"); + replace_substring(s, "/", "~1"); + return s; + } + + /// unescape tilde and slash + static void unescape(std::string& s) + { + // first transform any occurrence of the sequence '~1' to '/' + replace_substring(s, "~1", "/"); + // then transform any occurrence of the sequence '~0' to '~' + replace_substring(s, "~0", "~"); + } + /*! @param[in] reference_string the reference string to the current value @param[in] value the value to consider @@ -8649,7 +8573,7 @@ class basic_json @note Empty objects or arrays are flattened to `null`. */ - static void flatten(const std::string reference_string, + static void flatten(const std::string& reference_string, const basic_json& value, basic_json& result) { @@ -8686,12 +8610,7 @@ class basic_json // iterate object and use keys as reference string for (const auto& element : *value.m_value.object) { - // escape "~"" to "~0" and "/" to "~1" - std::string key(element.first); - replace_substring(key, "~", "~0"); - replace_substring(key, "/", "~1"); - - flatten(reference_string + "/" + key, + flatten(reference_string + "/" + escape(element.first), element.second, result); } } @@ -8745,13 +8664,128 @@ class basic_json std::vector reference_tokens {}; }; - //////////////////////////// - // JSON Pointer functions // - //////////////////////////// + ////////////////////////// + // JSON Pointer support // + ////////////////////////// /// @name JSON Pointer functions /// @{ + /*! + @brief access specified element via JSON Pointer + + Uses a JSON pointer to retrieve a reference to the respective JSON value. + No bound checking is performed. Similar to + @ref operator[](const typename object_t::key_type&), `null` values + are created in arrays and objects if necessary. + + In particular: + - If the JSON pointer points to an object key that does not exist, it + is created an filled with a `null` value before a reference to it + is returned. + - If the JSON pointer points to an array index that does not exist, it + is created an filled with a `null` value before a reference to it + is returned. All indices between the current maximum and the given + index are also filled with `null`. + - The special value `-` is treated as a synonym for the index past the + end. + + @param[in] ptr a JSON pointer + + @return reference to the element pointed to by @a ptr + + @complexity Constant. + + @throw std::out_of_range if the JSON pointer can not be resolved + @throw std::domain_error if an array index begins with '0' + @throw std::invalid_argument if an array index was not a number + + @liveexample{The behavior is shown in the example.,operatorjson_pointer} + + @since version 2.0.0 + */ + reference operator[](const json_pointer& ptr) + { + return ptr.get_unchecked(this); + } + + /*! + @brief access specified element via JSON Pointer + + Uses a JSON pointer to retrieve a reference to the respective JSON value. + No bound checking is performed. The function does not change the JSON + value; no `null` values are created. In particular, the the special value + `-` yields an exception. + + @param[in] ptr JSON pointer to the desired element + + @return const reference to the element pointed to by @a ptr + + @complexity Constant. + + @throw std::out_of_range if the JSON pointer can not be resolved + @throw std::domain_error if an array index begins with '0' + @throw std::invalid_argument if an array index was not a number + + @liveexample{The behavior is shown in the example.,operatorjson_pointer_const} + + @since version 2.0.0 + */ + const_reference operator[](const json_pointer& ptr) const + { + return ptr.get_unchecked(this); + } + + /*! + @brief access specified element via JSON Pointer + + Returns a reference to the element at with specified JSON pointer @a ptr, + with bounds checking. + + @param[in] ptr JSON pointer to the desired element + + @return reference to the element pointed to by @a ptr + + @complexity Constant. + + @throw std::out_of_range if the JSON pointer can not be resolved + @throw std::domain_error if an array index begins with '0' + @throw std::invalid_argument if an array index was not a number + + @liveexample{The behavior is shown in the example.,at_json_pointer} + + @since version 2.0.0 + */ + reference at(const json_pointer& ptr) + { + return ptr.get_checked(this); + } + + /*! + @brief access specified element via JSON Pointer + + Returns a const reference to the element at with specified JSON pointer + @a ptr, with bounds checking. + + @param[in] ptr JSON pointer to the desired element + + @return reference to the element pointed to by @a ptr + + @complexity Constant. + + @throw std::out_of_range if the JSON pointer can not be resolved + @throw std::domain_error if an array index begins with '0' + @throw std::invalid_argument if an array index was not a number + + @liveexample{The behavior is shown in the example.,at_json_pointer_const} + + @since version 2.0.0 + */ + const_reference at(const json_pointer& ptr) const + { + return ptr.get_checked(this); + } + /*! @brief return flattened JSON value @@ -8815,45 +8849,146 @@ class basic_json /// @} + ////////////////////////// + // JSON Patch functions // + ////////////////////////// + + /// @name JSON Patch functions + /// @{ + /*! @brief applies a JSON patch + [JSON Patch](http://jsonpatch.com) defines a JSON document structure for + expressing a sequence of operations to apply to a JSON) document. With + this funcion, a JSON Patch is applied to the current JSON value by + executing all operations from the patch. + @param[in] patch JSON patch document @return patched document - @note The original JSON value is not changed; that is, the patch is - applied to a copy of the value. + @note The application of a patch is atomic: Either all operations succeed + and the patched document is returned or an exception is thrown. In + any case, the original value is not changed: the patch is applied + to a copy of the value. - @sa [RFC 6902](https://tools.ietf.org/html/rfc6902) + @throw std::out_of_range if a JSON pointer inside the patch could not + be resolved successfully in the current JSON value; example: `"key baz + not found"` + @throw invalid_argument if the JSON patch is malformed (e.g., mandatory + attributes are missing); example: `"operation add must have member path"` + + @complexity Linear in the size of the JSON value and the length of the + JSON patch. As usually only a fraction of the JSON value is affected by + the patch, the complexity can usually be neglected. + + @liveexample{The following code shows how a JSON patch is applied to a + value.,patch} + + @sa @ref diff -- create a JSON patch by comparing two JSON values + + @sa [RFC 6902 (JSON Patch)](https://tools.ietf.org/html/rfc6902) + @sa [RFC 6901 (JSON Pointer)](https://tools.ietf.org/html/rfc6901) + + @since version 2.0.0 */ - basic_json apply_patch(const basic_json& patch) const + basic_json patch(const basic_json& patch) const { // make a working copy to apply the patch to basic_json result = *this; + // the valid JSON Patch operations + enum class patch_operations {add, remove, replace, move, copy, test, invalid}; + + const auto get_op = [](const std::string op) + { + if (op == "add") + { + return patch_operations::add; + } + if (op == "remove") + { + return patch_operations::remove; + } + if (op == "replace") + { + return patch_operations::replace; + } + if (op == "move") + { + return patch_operations::move; + } + if (op == "copy") + { + return patch_operations::copy; + } + if (op == "test") + { + return patch_operations::test; + } + + return patch_operations::invalid; + }; + // wrapper for "add" operation; add value at ptr const auto operation_add = [&result](json_pointer & ptr, basic_json val) { - // get reference to parent of JSON pointer ptr - const auto last_path = ptr.pop_back(); - basic_json& parent = result.at(ptr); - - if (parent.is_object()) + // adding to the root of the target document means replacing it + if (ptr.is_root()) { - // use operator[] to add value - parent[last_path] = val; + result = val; } - else if (parent.is_array()) + else { - if (last_path == "-") + // make sure the top element of the pointer exists + json_pointer top_pointer = ptr.top(); + if (top_pointer != ptr) { - // special case: append to back - parent.push_back(val); + basic_json& x = result.at(top_pointer); } - else + + // get reference to parent of JSON pointer ptr + const auto last_path = ptr.pop_back(); + basic_json& parent = result[ptr]; + + switch (parent.m_type) { - // default case: insert add offset - parent.insert(parent.begin() + std::stoi(last_path), val); + case value_t::null: + case value_t::object: + { + // use operator[] to add value + parent[last_path] = val; + break; + } + + case value_t::array: + { + if (last_path == "-") + { + // special case: append to back + parent.push_back(val); + } + else + { + const auto idx = std::stoi(last_path); + if (static_cast(idx) > parent.size()) + { + // avoid undefined behavior + throw std::out_of_range("array index " + std::to_string(idx) + " is out of range"); + } + else + { + // default case: insert add offset + parent.insert(parent.begin() + static_cast(idx), val); + } + } + break; + } + + default: + { + throw std::domain_error("unexpected parent type " + parent.type_name()); + } } } }; @@ -8868,11 +9003,21 @@ class basic_json // remove child if (parent.is_object()) { - parent.erase(parent.find(last_path)); + // perform range check + auto it = parent.find(last_path); + if (it != parent.end()) + { + parent.erase(it); + } + else + { + throw std::out_of_range("key '" + last_path + "' not found"); + } } else if (parent.is_array()) { - parent.erase(parent.begin() + std::stoi(last_path)); + // note erase performs range check + parent.erase(static_cast(std::stoi(last_path))); } }; @@ -8880,7 +9025,7 @@ class basic_json if (not patch.is_array()) { // a JSON patch must be an array of objects - throw std::domain_error("JSON patch must be an array of objects"); + throw std::invalid_argument("JSON patch must be an array of objects"); } // iterate and apply th eoperations @@ -8900,13 +9045,13 @@ class basic_json // check if desired value is present if (it == val.m_value.object->end()) { - throw std::domain_error(error_msg + " must have member '" + member + "'"); + throw std::invalid_argument(error_msg + " must have member '" + member + "'"); } // check if result is of type string if (string_type and not it->second.is_string()) { - throw std::domain_error(error_msg + " must have string member '" + member + "'"); + throw std::invalid_argument(error_msg + " must have string member '" + member + "'"); } // no error: return value @@ -8916,7 +9061,7 @@ class basic_json // type check if (not val.is_object()) { - throw std::domain_error("JSON patch must be an array of objects"); + throw std::invalid_argument("JSON patch must be an array of objects"); } // collect mandatory members @@ -8924,51 +9069,251 @@ class basic_json const std::string path = get_value(op, "path", true); json_pointer ptr(path); - if (op == "add") + switch (get_op(op)) { - operation_add(ptr, get_value("add", "value", false)); - } - else if (op == "remove") - { - operation_remove(ptr); - } - else if (op == "replace") - { - result.at(ptr) = get_value("replace", "value", false); - } - else if (op == "move") - { - const std::string from_path = get_value("move", "from", true); - json_pointer from_ptr(from_path); - basic_json v = result[from_ptr]; - - operation_remove(from_ptr); - operation_add(ptr, v); - } - else if (op == "copy") - { - const std::string from_path = get_value("copy", "from", true);; - const json_pointer from_ptr(from_path); - - result[ptr] = result.at(from_ptr); - } - else if (op == "test") - { - if (result.at(ptr) != get_value("test", "value", false)) + case patch_operations::add: { - throw std::domain_error("unsuccessful: " + val.dump()); + operation_add(ptr, get_value("add", "value", false)); + break; + } + + case patch_operations::remove: + { + operation_remove(ptr); + break; + } + + case patch_operations::replace: + { + // the "path" location must exist - use at() + result.at(ptr) = get_value("replace", "value", false); + break; + } + + case patch_operations::move: + { + const std::string from_path = get_value("move", "from", true); + json_pointer from_ptr(from_path); + + // the "from" location must exist - use at() + basic_json v = result.at(from_ptr); + + // The move operation is functionally identical to a + // "remove" operation on the "from" location, followed + // immediately by an "add" operation at the target + // location with the value that was just removed. + operation_remove(from_ptr); + operation_add(ptr, v); + break; + } + + case patch_operations::copy: + { + const std::string from_path = get_value("copy", "from", true);; + const json_pointer from_ptr(from_path); + + // the "from" location must exist - use at() + result[ptr] = result.at(from_ptr); + break; + } + + case patch_operations::test: + { + bool success = false; + try + { + // check if "value" matches the one at "path" + // the "path" location must exist - use at() + success = (result.at(ptr) == get_value("test", "value", false)); + } + catch (std::out_of_range&) + { + // ignore out of range errors: success remains false + } + + // throw an exception if test fails + if (not success) + { + throw std::domain_error("unsuccessful: " + val.dump()); + } + + break; + } + + case patch_operations::invalid: + { + // op must be "add", "remove", "replace", "move", "copy", or + // "test" + throw std::invalid_argument("operation value '" + op + "' is invalid"); } - } - else - { - // op must be "add", "remove", "replace", "move", "copy", or - // "test" - throw std::domain_error("operation value '" + op + "' is invalid"); } } return result; } + + /*! + @brief creates a diff as a JSON patch + + Creates a [JSON Patch](http://jsonpatch.com) so that value @a source can + be changed into the value @a target by calling @ref patch function. + + @invariant For two JSON values @a source and @a target, the following code + yields always `true`: + @code {.cpp} + source.patch(diff(source, target)) == target; + @endcode + + @note Currently, only `remove`, `add`, and `replace` operations are + generated. + + @param[in] source JSON value to copare from + @param[in] target JSON value to copare against + @param[in] path helper value to create JSON pointers + + @return a JSON patch to convert the @a source to @a target + + @complexity Linear in the lengths of @a source and @a target. + + @liveexample{The following code shows how a JSON patch is created as a + diff for two JSON values.,diff} + + @sa @ref patch -- apply a JSON patch + + @sa [RFC 6902 (JSON Patch)](https://tools.ietf.org/html/rfc6902) + + @since version 2.0.0 + */ + static basic_json diff(const basic_json& source, + const basic_json& target, + std::string path = "") noexcept + { + // the patch + basic_json result(value_t::array); + + // if the values are the same, return empty patch + if (source == target) + { + return result; + } + + if (source.type() != target.type()) + { + // different types: replace value + result.push_back( + { + {"op", "replace"}, + {"path", path}, + {"value", target} + }); + } + else + { + switch (source.type()) + { + case value_t::array: + { + // first pass: traverse common elements + size_t i = 0; + while (i < source.size() and i < target.size()) + { + // recursive call to compare array values at index i + auto temp_diff = diff(source[i], target[i], path + "/" + std::to_string(i)); + result.insert(result.end(), temp_diff.begin(), temp_diff.end()); + ++i; + } + + // i now reached the end of at least one array + // in a second pass, traverse the remaining elements + + // remove my remaining elements + while (i < source.size()) + { + result.push_back(object( + { + {"op", "remove"}, + {"path", path + "/" + std::to_string(i)} + })); + ++i; + } + + // add other remaining elements + while (i < target.size()) + { + result.push_back( + { + {"op", "add"}, + {"path", path + "/" + std::to_string(i)}, + {"value", target[i]} + }); + ++i; + } + + break; + } + + case value_t::object: + { + // first pass: traverse this object's elements + for (auto it = source.begin(); it != source.end(); ++it) + { + // escape the key name to be used in a JSON patch + const auto key = json_pointer::escape(it.key()); + + if (target.find(it.key()) != target.end()) + { + // recursive call to compare object values at key it + auto temp_diff = diff(it.value(), target[it.key()], path + "/" + key); + result.insert(result.end(), temp_diff.begin(), temp_diff.end()); + } + else + { + // found a key that is not in o -> remove it + result.push_back(object( + { + {"op", "remove"}, + {"path", path + "/" + key} + })); + } + } + + // second pass: traverse other object's elements + for (auto it = target.begin(); it != target.end(); ++it) + { + if (source.find(it.key()) == source.end()) + { + // found a key that is not in this -> add it + const auto key = json_pointer::escape(it.key()); + result.push_back( + { + {"op", "add"}, + {"path", path + "/" + key}, + {"value", it.value()} + }); + } + } + + break; + } + + default: + { + // both primitive type: replace value + result.push_back( + { + {"op", "replace"}, + {"path", path}, + {"value", target} + }); + break; + } + } + } + + return result; + } + + /// @} }; @@ -8988,9 +9333,9 @@ using json = basic_json<>; } -///////////////////////// -// nonmember functions // -///////////////////////// +/////////////////////// +// nonmember support // +/////////////////////// // specialization of std::swap, and std::hash namespace std diff --git a/test/unit.cpp b/test/unit.cpp index 664648cb6..f6c49883b 100644 --- a/test/unit.cpp +++ b/test/unit.cpp @@ -3455,7 +3455,7 @@ TEST_CASE("element access") { json jarray = {1, 1u, true, nullptr, "string", 42.23, json::object(), {1, 2, 3}}; CHECK_THROWS_AS(jarray.erase(8), std::out_of_range); - CHECK_THROWS_WITH(jarray.erase(8), "index out of range"); + CHECK_THROWS_WITH(jarray.erase(8), "array index 8 is out of range"); } } @@ -12395,304 +12395,384 @@ TEST_CASE("JSON patch") { SECTION("examples from RFC 6902") { - SECTION("example A.1 - Adding an Object Member") + SECTION("4. Operations") { - // An example target JSON document: - json doc = R"( - { "foo": "bar"} - )"_json; + // the ordering of members in JSON objects is not significant: + json op1 = R"({ "op": "add", "path": "/a/b/c", "value": "foo" })"_json; + json op2 = R"({ "path": "/a/b/c", "op": "add", "value": "foo" })"_json; + json op3 = R"({ "value": "foo", "path": "/a/b/c", "op": "add" })"_json; - // A JSON Patch document: - json patch = R"( - [ - { "op": "add", "path": "/baz", "value": "qux" } - ] - )"_json; - - // The resulting JSON document: - json expected = R"( - { - "baz": "qux", - "foo": "bar" - } - )"_json; - - // check if patched value is as expected - CHECK(doc.apply_patch(patch) == expected); + // check if the operation objects are equivalent + CHECK(op1 == op2); + CHECK(op1 == op3); } - SECTION("example A.2 - Adding an Array Element") + SECTION("4.1 add") { - // An example target JSON document: - json doc = R"( - { "foo": [ "bar", "baz" ] } - )"_json; + json patch = R"([{ "op": "add", "path": "/a/b/c", "value": [ "foo", "bar" ] }])"_json; - // A JSON Patch document: - json patch = R"( - [ - { "op": "add", "path": "/foo/1", "value": "qux" } - ] - )"_json; + // However, the object itself or an array containing it does need + // to exist, and it remains an error for that not to be the case. + // For example, an "add" with a target location of "/a/b" starting + // with this document + json doc1 = R"({ "a": { "foo": 1 } })"_json; - // The resulting JSON document: - json expected = R"( - { "foo": [ "bar", "qux", "baz" ] } - )"_json; - - // check if patched value is as expected - CHECK(doc.apply_patch(patch) == expected); - } - - SECTION("example A.3 - Removing an Object Member") - { - // An example target JSON document: - json doc = R"( + // is not an error, because "a" exists, and "b" will be added to + // its value. + CHECK_NOTHROW(doc1.patch(patch)); + CHECK(doc1.patch(patch) == R"( { - "baz": "qux", - "foo": "bar" - } - )"_json; - - // A JSON Patch document: - json patch = R"( - [ - { "op": "remove", "path": "/baz" } - ] - )"_json; - - // The resulting JSON document: - json expected = R"( - { "foo": "bar" } - )"_json; - - // check if patched value is as expected - CHECK(doc.apply_patch(patch) == expected); - } - - SECTION("example A.4 - Removing an Array Element") - { - // An example target JSON document: - json doc = R"( - { "foo": [ "bar", "qux", "baz" ] } - )"_json; - - // A JSON Patch document: - json patch = R"( - [ - { "op": "remove", "path": "/foo/1" } - ] - )"_json; - - // The resulting JSON document: - json expected = R"( - { "foo": [ "bar", "baz" ] } - )"_json; - - // check if patched value is as expected - CHECK(doc.apply_patch(patch) == expected); - } - - SECTION("example A.5 - Replacing a Value") - { - // An example target JSON document: - json doc = R"( - { - "baz": "qux", - "foo": "bar" - } - )"_json; - - // A JSON Patch document: - json patch = R"( - [ - { "op": "replace", "path": "/baz", "value": "boo" } - ] - )"_json; - - json expected = R"( - { - "baz": "boo", - "foo": "bar" - } - )"_json; - - // check if patched value is as expected - CHECK(doc.apply_patch(patch) == expected); - } - - SECTION("example A.6 - Moving a Value") - { - // An example target JSON document: - json doc = R"( - { - "foo": { - "bar": "baz", - "waldo": "fred" - }, - "qux": { - "corge": "grault" + "a": { + "foo": 1, + "b": { + "c": [ "foo", "bar" ] + } } } - )"_json; + )"_json); + + // It is an error in this document: + json doc2 = R"({ "q": { "bar": 2 } })"_json; + + // because "a" does not exist. + CHECK_THROWS_AS(doc2.patch(patch), std::out_of_range); + CHECK_THROWS_WITH(doc2.patch(patch), "key 'a' not found"); + } + + SECTION("4.2 remove") + { + // If removing an element from an array, any elements above the + // specified index are shifted one position to the left. + json doc = {1, 2, 3, 4}; + json patch = {{{"op", "remove"}, {"path", "/1"}}}; + CHECK(doc.patch(patch) == json({1, 3, 4})); + } + + SECTION("A.1. Adding an Object Member") + { + // An example target JSON document: + json doc = R"( + { "foo": "bar"} + )"_json; // A JSON Patch document: json patch = R"( - [ - { "op": "move", "from": "/foo/waldo", "path": "/qux/thud" } - ] - )"_json; + [ + { "op": "add", "path": "/baz", "value": "qux" } + ] + )"_json; // The resulting JSON document: json expected = R"( - { - "foo": { - "bar": "baz" - }, - "qux": { - "corge": "grault", - "thud": "fred" + { + "baz": "qux", + "foo": "bar" } - } - )"_json; + )"_json; // check if patched value is as expected - CHECK(doc.apply_patch(patch) == expected); + CHECK(doc.patch(patch) == expected); + + // check roundtrip + CHECK(doc.patch(json::diff(doc, expected)) == expected); } - SECTION("example A.7 - Moving a Value") + SECTION("A.2. Adding an Array Element") { // An example target JSON document: json doc = R"( - { "foo": [ "all", "grass", "cows", "eat" ] } - )"_json; + { "foo": [ "bar", "baz" ] } + )"_json; // A JSON Patch document: json patch = R"( - [ - { "op": "move", "from": "/foo/1", "path": "/foo/3" } - ] - )"_json; + [ + { "op": "add", "path": "/foo/1", "value": "qux" } + ] + )"_json; // The resulting JSON document: json expected = R"( - { "foo": [ "all", "cows", "eat", "grass" ] } - )"_json; + { "foo": [ "bar", "qux", "baz" ] } + )"_json; // check if patched value is as expected - CHECK(doc.apply_patch(patch) == expected); + CHECK(doc.patch(patch) == expected); + + // check roundtrip + CHECK(doc.patch(json::diff(doc, expected)) == expected); } - SECTION("example A.8 - Testing a Value: Success") + SECTION("A.3. Removing an Object Member") { // An example target JSON document: json doc = R"( - { - "baz": "qux", - "foo": [ "a", 2, "c" ] - } - )"_json; + { + "baz": "qux", + "foo": "bar" + } + )"_json; + + // A JSON Patch document: + json patch = R"( + [ + { "op": "remove", "path": "/baz" } + ] + )"_json; + + // The resulting JSON document: + json expected = R"( + { "foo": "bar" } + )"_json; + + // check if patched value is as expected + CHECK(doc.patch(patch) == expected); + + // check roundtrip + CHECK(doc.patch(json::diff(doc, expected)) == expected); + } + + SECTION("A.4. Removing an Array Element") + { + // An example target JSON document: + json doc = R"( + { "foo": [ "bar", "qux", "baz" ] } + )"_json; + + // A JSON Patch document: + json patch = R"( + [ + { "op": "remove", "path": "/foo/1" } + ] + )"_json; + + // The resulting JSON document: + json expected = R"( + { "foo": [ "bar", "baz" ] } + )"_json; + + // check if patched value is as expected + CHECK(doc.patch(patch) == expected); + + // check roundtrip + CHECK(doc.patch(json::diff(doc, expected)) == expected); + } + + SECTION("A.5. Replacing a Value") + { + // An example target JSON document: + json doc = R"( + { + "baz": "qux", + "foo": "bar" + } + )"_json; + + // A JSON Patch document: + json patch = R"( + [ + { "op": "replace", "path": "/baz", "value": "boo" } + ] + )"_json; + + json expected = R"( + { + "baz": "boo", + "foo": "bar" + } + )"_json; + + // check if patched value is as expected + CHECK(doc.patch(patch) == expected); + + // check roundtrip + CHECK(doc.patch(json::diff(doc, expected)) == expected); + } + + SECTION("A.6. Moving a Value") + { + // An example target JSON document: + json doc = R"( + { + "foo": { + "bar": "baz", + "waldo": "fred" + }, + "qux": { + "corge": "grault" + } + } + )"_json; + + // A JSON Patch document: + json patch = R"( + [ + { "op": "move", "from": "/foo/waldo", "path": "/qux/thud" } + ] + )"_json; + + // The resulting JSON document: + json expected = R"( + { + "foo": { + "bar": "baz" + }, + "qux": { + "corge": "grault", + "thud": "fred" + } + } + )"_json; + + // check if patched value is as expected + CHECK(doc.patch(patch) == expected); + + // check roundtrip + CHECK(doc.patch(json::diff(doc, expected)) == expected); + } + + SECTION("A.7. Moving a Value") + { + // An example target JSON document: + json doc = R"( + { "foo": [ "all", "grass", "cows", "eat" ] } + )"_json; + + // A JSON Patch document: + json patch = R"( + [ + { "op": "move", "from": "/foo/1", "path": "/foo/3" } + ] + )"_json; + + // The resulting JSON document: + json expected = R"( + { "foo": [ "all", "cows", "eat", "grass" ] } + )"_json; + + // check if patched value is as expected + CHECK(doc.patch(patch) == expected); + + // check roundtrip + CHECK(doc.patch(json::diff(doc, expected)) == expected); + } + + SECTION("A.8. Testing a Value: Success") + { + // An example target JSON document: + json doc = R"( + { + "baz": "qux", + "foo": [ "a", 2, "c" ] + } + )"_json; // A JSON Patch document that will result in successful evaluation: json patch = R"( - [ - { "op": "test", "path": "/baz", "value": "qux" }, - { "op": "test", "path": "/foo/1", "value": 2 } - ] - )"_json; + [ + { "op": "test", "path": "/baz", "value": "qux" }, + { "op": "test", "path": "/foo/1", "value": 2 } + ] + )"_json; // check if evaluation does not throw - CHECK_NOTHROW(doc.apply_patch(patch)); + CHECK_NOTHROW(doc.patch(patch)); // check if patched document is unchanged - CHECK(doc.apply_patch(patch) == doc); + CHECK(doc.patch(patch) == doc); } - SECTION("example A.9 - Testing a Value: Error") + SECTION("A.9. Testing a Value: Error") { // An example target JSON document: json doc = R"( - { "baz": "qux" } - )"_json; + { "baz": "qux" } + )"_json; // A JSON Patch document that will result in an error condition: json patch = R"( - [ - { "op": "test", "path": "/baz", "value": "bar" } - ] - )"_json; + [ + { "op": "test", "path": "/baz", "value": "bar" } + ] + )"_json; // check that evaluation throws - CHECK_THROWS_AS(doc.apply_patch(patch), std::domain_error); - CHECK_THROWS_WITH(doc.apply_patch(patch), "unsuccessful: " + patch[0].dump()); + CHECK_THROWS_AS(doc.patch(patch), std::domain_error); + CHECK_THROWS_WITH(doc.patch(patch), "unsuccessful: " + patch[0].dump()); } - SECTION("example A.10 - Adding a Nested Member Object") + SECTION("A.10. Adding a Nested Member Object") { // An example target JSON document: json doc = R"( - { "foo": "bar" } - )"_json; + { "foo": "bar" } + )"_json; // A JSON Patch document: json patch = R"( - [ - { "op": "add", "path": "/child", "value": { "grandchild": { } } } - ] - )"_json; + [ + { "op": "add", "path": "/child", "value": { "grandchild": { } } } + ] + )"_json; // The resulting JSON document: - json expected = R"( - { - "foo": "bar", - "child": { - "grandchild": { - } - } - } - )"_json; - - // check if patched value is as expected - CHECK(doc.apply_patch(patch) == expected); - } - - SECTION("example A.11 - Ignoring Unrecognized Elements") - { - // An example target JSON document: - json doc = R"( - { "foo": "bar" } - )"_json; - - // A JSON Patch document: - json patch = R"( - [ - { "op": "add", "path": "/baz", "value": "qux", "xyz": 123 } - ] - )"_json; - json expected = R"( { "foo": "bar", - "baz": "qux" - } - )"_json; + "child": { + "grandchild": { + } + } + } + )"_json; // check if patched value is as expected - CHECK(doc.apply_patch(patch) == expected); + CHECK(doc.patch(patch) == expected); + + // check roundtrip + CHECK(doc.patch(json::diff(doc, expected)) == expected); } - SECTION("example A.12 - Adding to a Nonexistent Target") + SECTION("A.11. Ignoring Unrecognized Elements") { // An example target JSON document: json doc = R"( - { "foo": "bar" } - )"_json; + { "foo": "bar" } + )"_json; // A JSON Patch document: json patch = R"( - [ - { "op": "add", "path": "/baz/bat", "value": "qux" } - ] - )"_json; + [ + { "op": "add", "path": "/baz", "value": "qux", "xyz": 123 } + ] + )"_json; + + json expected = R"( + { + "foo": "bar", + "baz": "qux" + } + )"_json; + + // check if patched value is as expected + CHECK(doc.patch(patch) == expected); + + // check roundtrip + CHECK(doc.patch(json::diff(doc, expected)) == expected); + } + + SECTION("A.12. Adding to a Nonexistent Target") + { + // An example target JSON document: + json doc = R"( + { "foo": "bar" } + )"_json; + + // A JSON Patch document: + json patch = R"( + [ + { "op": "add", "path": "/baz/bat", "value": "qux" } + ] + )"_json; // This JSON Patch document, applied to the target JSON document // above, would result in an error (therefore, it would not be @@ -12700,89 +12780,150 @@ TEST_CASE("JSON patch") // references neither the root of the document, nor a member of // an existing object, nor a member of an existing array. - CHECK_THROWS_AS(doc.apply_patch(patch), std::out_of_range); - CHECK_THROWS_WITH(doc.apply_patch(patch), "key 'baz' not found"); + CHECK_THROWS_AS(doc.patch(patch), std::out_of_range); + CHECK_THROWS_WITH(doc.patch(patch), "key 'baz' not found"); } - // A.13. Invalid JSON Patch Document + // A.13. Invalid JSON Patch Document // not applicable - SECTION("example A.14 - Escape Ordering") + SECTION("A.14. Escape Ordering") { // An example target JSON document: json doc = R"( - { - "/": 9, - "~1": 10 - } - )"_json; + { + "/": 9, + "~1": 10 + } + )"_json; // A JSON Patch document: json patch = R"( - [ - {"op": "test", "path": "/~01", "value": 10} - ] - )"_json; + [ + {"op": "test", "path": "/~01", "value": 10} + ] + )"_json; json expected = R"( - { - "/": 9, - "~1": 10 - } - )"_json; + { + "/": 9, + "~1": 10 + } + )"_json; // check if patched value is as expected - CHECK(doc.apply_patch(patch) == expected); + CHECK(doc.patch(patch) == expected); + + // check roundtrip + CHECK(doc.patch(json::diff(doc, expected)) == expected); } - SECTION("example A.15 - Comparing Strings and Numbers") + SECTION("A.15. Comparing Strings and Numbers") { // An example target JSON document: json doc = R"( - { - "/": 9, - "~1": 10 - } - )"_json; + { + "/": 9, + "~1": 10 + } + )"_json; // A JSON Patch document that will result in an error condition: json patch = R"( - [ - {"op": "test", "path": "/~01", "value": "10"} - ] - )"_json; + [ + {"op": "test", "path": "/~01", "value": "10"} + ] + )"_json; // check that evaluation throws - CHECK_THROWS_AS(doc.apply_patch(patch), std::domain_error); - CHECK_THROWS_WITH(doc.apply_patch(patch), "unsuccessful: " + patch[0].dump()); + CHECK_THROWS_AS(doc.patch(patch), std::domain_error); + CHECK_THROWS_WITH(doc.patch(patch), "unsuccessful: " + patch[0].dump()); } - SECTION("example A.16 - Adding an Array Value") + SECTION("A.16. Adding an Array Value") { // An example target JSON document: json doc = R"( - { "foo": ["bar"] } - )"_json; + { "foo": ["bar"] } + )"_json; // A JSON Patch document: json patch = R"( - [ - { "op": "add", "path": "/foo/-", "value": ["abc", "def"] } - ] - )"_json; + [ + { "op": "add", "path": "/foo/-", "value": ["abc", "def"] } + ] + )"_json; // The resulting JSON document: json expected = R"( - { "foo": ["bar", ["abc", "def"]] } - )"_json; + { "foo": ["bar", ["abc", "def"]] } + )"_json; // check if patched value is as expected - CHECK(doc.apply_patch(patch) == expected); + CHECK(doc.patch(patch) == expected); + + // check roundtrip + CHECK(doc.patch(json::diff(doc, expected)) == expected); } } SECTION("own examples") { + SECTION("add") + { + SECTION("add to the root element") + { + // If the path is the root of the target document - the + // specified value becomes the entire content of the target + // document. + + // An example target JSON document: + json doc = 17; + + // A JSON Patch document: + json patch = R"( + [ + { "op": "add", "path": "", "value": [1,2,3] } + ] + )"_json; + + // The resulting JSON document: + json expected = {1, 2, 3}; + + // check if patched value is as expected + CHECK(doc.patch(patch) == expected); + + // check roundtrip + CHECK(doc.patch(json::diff(doc, expected)) == expected); + } + + SECTION("add to end of the array") + { + // The specified index MUST NOT be greater than the number of + // elements in the array. The example below uses and index of + // exactly the number of elements in the array which is legal. + + // An example target JSON document: + json doc = {0, 1, 2}; + + // A JSON Patch document: + json patch = R"( + [ + { "op": "add", "path": "/3", "value": 3 } + ] + )"_json; + + // The resulting JSON document: + json expected = {0, 1, 2, 3}; + + // check if patched value is as expected + CHECK(doc.patch(patch) == expected); + + // check roundtrip + CHECK(doc.patch(json::diff(doc, expected)) == expected); + } + } + SECTION("copy") { // An example target JSON document: @@ -12805,6 +12946,7 @@ TEST_CASE("JSON patch") ] )"_json; + // The resulting JSON document: json expected = R"( { "foo": { @@ -12819,7 +12961,60 @@ TEST_CASE("JSON patch") )"_json; // check if patched value is as expected - CHECK(doc.apply_patch(patch) == expected); + CHECK(doc.patch(patch) == expected); + + // check roundtrip + CHECK(doc.patch(json::diff(doc, expected)) == expected); + } + + SECTION("replace") + { + json j = "string"; + json patch = {{{"op", "replace"}, {"path", ""}, {"value", 1}}}; + CHECK(j.patch(patch) == json(1)); + } + + SECTION("documentation GIF") + { + { + // a JSON patch + json p1 = R"( + [{"op": "add", "path": "/GB", "value": "London"}] + )"_json; + + // a JSON value + json source = R"( + {"D": "Berlin", "F": "Paris"} + )"_json; + + // apply the patch + json target = source.patch(p1); + // target = { "D": "Berlin", "F": "Paris", "GB": "London" } + CHECK(target == R"({ "D": "Berlin", "F": "Paris", "GB": "London" })"_json); + + // create a diff from two JSONs + json p2 = json::diff(target, source); + // p2 = [{"op": "delete", "path": "/GB"}] + CHECK(p2 == R"([{"op":"remove","path":"/GB"}])"_json); + } + { + // a JSON value + json j = {"good", "bad", "ugly"}; + + // a JSON pointer + auto ptr = json::json_pointer("/2"); + + // use to access elements + j[ptr] = {{"it", "cattivo"}}; + CHECK(j == R"(["good","bad",{"it":"cattivo"}])"_json); + + // use user-defined string literal + j["/2/en"_json_pointer] = "ugly"; + CHECK(j == R"(["good","bad",{"en":"ugly","it":"cattivo"}])"_json); + + json flat = j.flatten(); + CHECK(flat == R"({"/0":"good","/1":"bad","/2/en":"ugly","/2/it":"cattivo"})"_json); + } } } @@ -12827,20 +13022,44 @@ TEST_CASE("JSON patch") { SECTION("unknown operation") { + SECTION("not an array") + { + json j; + json patch = {{"op", "add"}, {"path", ""}, {"value", 1}}; + CHECK_THROWS_AS(j.patch(patch), std::invalid_argument); + CHECK_THROWS_WITH(j.patch(patch), "JSON patch must be an array of objects"); + } + + SECTION("not an array of objects") + { + json j; + json patch = {"op", "add", "path", "", "value", 1}; + CHECK_THROWS_AS(j.patch(patch), std::invalid_argument); + CHECK_THROWS_WITH(j.patch(patch), "JSON patch must be an array of objects"); + } + SECTION("missing 'op'") { json j; json patch = {{{"foo", "bar"}}}; - CHECK_THROWS_AS(j.apply_patch(patch), std::domain_error); - CHECK_THROWS_WITH(j.apply_patch(patch), "operation must have member 'op'"); + CHECK_THROWS_AS(j.patch(patch), std::invalid_argument); + CHECK_THROWS_WITH(j.patch(patch), "operation must have member 'op'"); } SECTION("non-string 'op'") { json j; json patch = {{{"op", 1}}}; - CHECK_THROWS_AS(j.apply_patch(patch), std::domain_error); - CHECK_THROWS_WITH(j.apply_patch(patch), "operation must have string member 'op'"); + CHECK_THROWS_AS(j.patch(patch), std::invalid_argument); + CHECK_THROWS_WITH(j.patch(patch), "operation must have string member 'op'"); + } + + SECTION("invalid operation") + { + json j; + json patch = {{{"op", "foo"}, {"path", ""}}}; + CHECK_THROWS_AS(j.patch(patch), std::invalid_argument); + CHECK_THROWS_WITH(j.patch(patch), "operation value 'foo' is invalid"); } } @@ -12850,24 +13069,32 @@ TEST_CASE("JSON patch") { json j; json patch = {{{"op", "add"}}}; - CHECK_THROWS_AS(j.apply_patch(patch), std::domain_error); - CHECK_THROWS_WITH(j.apply_patch(patch), "operation 'add' must have member 'path'"); + CHECK_THROWS_AS(j.patch(patch), std::invalid_argument); + CHECK_THROWS_WITH(j.patch(patch), "operation 'add' must have member 'path'"); } SECTION("non-string 'path'") { json j; json patch = {{{"op", "add"}, {"path", 1}}}; - CHECK_THROWS_AS(j.apply_patch(patch), std::domain_error); - CHECK_THROWS_WITH(j.apply_patch(patch), "operation 'add' must have string member 'path'"); + CHECK_THROWS_AS(j.patch(patch), std::invalid_argument); + CHECK_THROWS_WITH(j.patch(patch), "operation 'add' must have string member 'path'"); } SECTION("missing 'value'") { json j; json patch = {{{"op", "add"}, {"path", ""}}}; - CHECK_THROWS_AS(j.apply_patch(patch), std::domain_error); - CHECK_THROWS_WITH(j.apply_patch(patch), "operation 'add' must have member 'value'"); + CHECK_THROWS_AS(j.patch(patch), std::invalid_argument); + CHECK_THROWS_WITH(j.patch(patch), "operation 'add' must have member 'value'"); + } + + SECTION("invalid array index") + { + json j = {1, 2}; + json patch = {{{"op", "add"}, {"path", "/4"}, {"value", 4}}}; + CHECK_THROWS_AS(j.patch(patch), std::out_of_range); + CHECK_THROWS_WITH(j.patch(patch), "array index 4 is out of range"); } } @@ -12877,16 +13104,40 @@ TEST_CASE("JSON patch") { json j; json patch = {{{"op", "remove"}}}; - CHECK_THROWS_AS(j.apply_patch(patch), std::domain_error); - CHECK_THROWS_WITH(j.apply_patch(patch), "operation 'remove' must have member 'path'"); + CHECK_THROWS_AS(j.patch(patch), std::invalid_argument); + CHECK_THROWS_WITH(j.patch(patch), "operation 'remove' must have member 'path'"); } SECTION("non-string 'path'") { json j; json patch = {{{"op", "remove"}, {"path", 1}}}; - CHECK_THROWS_AS(j.apply_patch(patch), std::domain_error); - CHECK_THROWS_WITH(j.apply_patch(patch), "operation 'remove' must have string member 'path'"); + CHECK_THROWS_AS(j.patch(patch), std::invalid_argument); + CHECK_THROWS_WITH(j.patch(patch), "operation 'remove' must have string member 'path'"); + } + + SECTION("nonexisting target location (array)") + { + json j = {1, 2, 3}; + json patch = {{{"op", "remove"}, {"path", "/17"}}}; + CHECK_THROWS_AS(j.patch(patch), std::out_of_range); + CHECK_THROWS_WITH(j.patch(patch), "array index 17 is out of range"); + } + + SECTION("nonexisting target location (object)") + { + json j = {{"foo", 1}, {"bar", 2}}; + json patch = {{{"op", "remove"}, {"path", "/baz"}}}; + CHECK_THROWS_AS(j.patch(patch), std::out_of_range); + CHECK_THROWS_WITH(j.patch(patch), "key 'baz' not found"); + } + + SECTION("root element as target location") + { + json j = "string"; + json patch = {{{"op", "remove"}, {"path", ""}}}; + CHECK_THROWS_AS(j.patch(patch), std::domain_error); + CHECK_THROWS_WITH(j.patch(patch), "JSON pointer has no parent"); } } @@ -12896,24 +13147,40 @@ TEST_CASE("JSON patch") { json j; json patch = {{{"op", "replace"}}}; - CHECK_THROWS_AS(j.apply_patch(patch), std::domain_error); - CHECK_THROWS_WITH(j.apply_patch(patch), "operation 'replace' must have member 'path'"); + CHECK_THROWS_AS(j.patch(patch), std::invalid_argument); + CHECK_THROWS_WITH(j.patch(patch), "operation 'replace' must have member 'path'"); } SECTION("non-string 'path'") { json j; json patch = {{{"op", "replace"}, {"path", 1}}}; - CHECK_THROWS_AS(j.apply_patch(patch), std::domain_error); - CHECK_THROWS_WITH(j.apply_patch(patch), "operation 'replace' must have string member 'path'"); + CHECK_THROWS_AS(j.patch(patch), std::invalid_argument); + CHECK_THROWS_WITH(j.patch(patch), "operation 'replace' must have string member 'path'"); } SECTION("missing 'value'") { json j; json patch = {{{"op", "replace"}, {"path", ""}}}; - CHECK_THROWS_AS(j.apply_patch(patch), std::domain_error); - CHECK_THROWS_WITH(j.apply_patch(patch), "operation 'replace' must have member 'value'"); + CHECK_THROWS_AS(j.patch(patch), std::invalid_argument); + CHECK_THROWS_WITH(j.patch(patch), "operation 'replace' must have member 'value'"); + } + + SECTION("nonexisting target location (array)") + { + json j = {1, 2, 3}; + json patch = {{{"op", "replace"}, {"path", "/17"}, {"value", 19}}}; + CHECK_THROWS_AS(j.patch(patch), std::out_of_range); + CHECK_THROWS_WITH(j.patch(patch), "array index 17 is out of range"); + } + + SECTION("nonexisting target location (object)") + { + json j = {{"foo", 1}, {"bar", 2}}; + json patch = {{{"op", "replace"}, {"path", "/baz"}, {"value", 3}}}; + CHECK_THROWS_AS(j.patch(patch), std::out_of_range); + CHECK_THROWS_WITH(j.patch(patch), "key 'baz' not found"); } } @@ -12923,32 +13190,48 @@ TEST_CASE("JSON patch") { json j; json patch = {{{"op", "move"}}}; - CHECK_THROWS_AS(j.apply_patch(patch), std::domain_error); - CHECK_THROWS_WITH(j.apply_patch(patch), "operation 'move' must have member 'path'"); + CHECK_THROWS_AS(j.patch(patch), std::invalid_argument); + CHECK_THROWS_WITH(j.patch(patch), "operation 'move' must have member 'path'"); } SECTION("non-string 'path'") { json j; json patch = {{{"op", "move"}, {"path", 1}}}; - CHECK_THROWS_AS(j.apply_patch(patch), std::domain_error); - CHECK_THROWS_WITH(j.apply_patch(patch), "operation 'move' must have string member 'path'"); + CHECK_THROWS_AS(j.patch(patch), std::invalid_argument); + CHECK_THROWS_WITH(j.patch(patch), "operation 'move' must have string member 'path'"); } SECTION("missing 'from'") { json j; json patch = {{{"op", "move"}, {"path", ""}}}; - CHECK_THROWS_AS(j.apply_patch(patch), std::domain_error); - CHECK_THROWS_WITH(j.apply_patch(patch), "operation 'move' must have member 'from'"); + CHECK_THROWS_AS(j.patch(patch), std::invalid_argument); + CHECK_THROWS_WITH(j.patch(patch), "operation 'move' must have member 'from'"); } SECTION("non-string 'from'") { json j; json patch = {{{"op", "move"}, {"path", ""}, {"from", 1}}}; - CHECK_THROWS_AS(j.apply_patch(patch), std::domain_error); - CHECK_THROWS_WITH(j.apply_patch(patch), "operation 'move' must have string member 'from'"); + CHECK_THROWS_AS(j.patch(patch), std::invalid_argument); + CHECK_THROWS_WITH(j.patch(patch), "operation 'move' must have string member 'from'"); + } + + SECTION("nonexisting from location (array)") + { + json j = {1, 2, 3}; + json patch = {{{"op", "move"}, {"path", "/0"}, {"from", "/5"}}}; + CHECK_THROWS_AS(j.patch(patch), std::out_of_range); + CHECK_THROWS_WITH(j.patch(patch), "array index 5 is out of range"); + } + + SECTION("nonexisting from location (object)") + { + json j = {{"foo", 1}, {"bar", 2}}; + json patch = {{{"op", "move"}, {"path", "/baz"}, {"from", "/baz"}}}; + CHECK_THROWS_AS(j.patch(patch), std::out_of_range); + CHECK_THROWS_WITH(j.patch(patch), "key 'baz' not found"); } } @@ -12958,32 +13241,48 @@ TEST_CASE("JSON patch") { json j; json patch = {{{"op", "copy"}}}; - CHECK_THROWS_AS(j.apply_patch(patch), std::domain_error); - CHECK_THROWS_WITH(j.apply_patch(patch), "operation 'copy' must have member 'path'"); + CHECK_THROWS_AS(j.patch(patch), std::invalid_argument); + CHECK_THROWS_WITH(j.patch(patch), "operation 'copy' must have member 'path'"); } SECTION("non-string 'path'") { json j; json patch = {{{"op", "copy"}, {"path", 1}}}; - CHECK_THROWS_AS(j.apply_patch(patch), std::domain_error); - CHECK_THROWS_WITH(j.apply_patch(patch), "operation 'copy' must have string member 'path'"); + CHECK_THROWS_AS(j.patch(patch), std::invalid_argument); + CHECK_THROWS_WITH(j.patch(patch), "operation 'copy' must have string member 'path'"); } SECTION("missing 'from'") { json j; json patch = {{{"op", "copy"}, {"path", ""}}}; - CHECK_THROWS_AS(j.apply_patch(patch), std::domain_error); - CHECK_THROWS_WITH(j.apply_patch(patch), "operation 'copy' must have member 'from'"); + CHECK_THROWS_AS(j.patch(patch), std::invalid_argument); + CHECK_THROWS_WITH(j.patch(patch), "operation 'copy' must have member 'from'"); } SECTION("non-string 'from'") { json j; json patch = {{{"op", "copy"}, {"path", ""}, {"from", 1}}}; - CHECK_THROWS_AS(j.apply_patch(patch), std::domain_error); - CHECK_THROWS_WITH(j.apply_patch(patch), "operation 'copy' must have string member 'from'"); + CHECK_THROWS_AS(j.patch(patch), std::invalid_argument); + CHECK_THROWS_WITH(j.patch(patch), "operation 'copy' must have string member 'from'"); + } + + SECTION("nonexisting from location (array)") + { + json j = {1, 2, 3}; + json patch = {{{"op", "copy"}, {"path", "/0"}, {"from", "/5"}}}; + CHECK_THROWS_AS(j.patch(patch), std::out_of_range); + CHECK_THROWS_WITH(j.patch(patch), "array index 5 is out of range"); + } + + SECTION("nonexisting from location (object)") + { + json j = {{"foo", 1}, {"bar", 2}}; + json patch = {{{"op", "copy"}, {"path", "/fob"}, {"from", "/baz"}}}; + CHECK_THROWS_AS(j.patch(patch), std::out_of_range); + CHECK_THROWS_WITH(j.patch(patch), "key 'baz' not found"); } } @@ -12993,27 +13292,288 @@ TEST_CASE("JSON patch") { json j; json patch = {{{"op", "test"}}}; - CHECK_THROWS_AS(j.apply_patch(patch), std::domain_error); - CHECK_THROWS_WITH(j.apply_patch(patch), "operation 'test' must have member 'path'"); + CHECK_THROWS_AS(j.patch(patch), std::invalid_argument); + CHECK_THROWS_WITH(j.patch(patch), "operation 'test' must have member 'path'"); } SECTION("non-string 'path'") { json j; json patch = {{{"op", "test"}, {"path", 1}}}; - CHECK_THROWS_AS(j.apply_patch(patch), std::domain_error); - CHECK_THROWS_WITH(j.apply_patch(patch), "operation 'test' must have string member 'path'"); + CHECK_THROWS_AS(j.patch(patch), std::invalid_argument); + CHECK_THROWS_WITH(j.patch(patch), "operation 'test' must have string member 'path'"); } SECTION("missing 'value'") { json j; json patch = {{{"op", "test"}, {"path", ""}}}; - CHECK_THROWS_AS(j.apply_patch(patch), std::domain_error); - CHECK_THROWS_WITH(j.apply_patch(patch), "operation 'test' must have member 'value'"); + CHECK_THROWS_AS(j.patch(patch), std::invalid_argument); + CHECK_THROWS_WITH(j.patch(patch), "operation 'test' must have member 'value'"); } } } + + SECTION("Examples from jsonpatch.com") + { + SECTION("Simple Example") + { + // The original document + json doc = R"( + { + "baz": "qux", + "foo": "bar" + } + )"_json; + + // The patch + json patch = R"( + [ + { "op": "replace", "path": "/baz", "value": "boo" }, + { "op": "add", "path": "/hello", "value": ["world"] }, + { "op": "remove", "path": "/foo"} + ] + )"_json; + + // The result + json result = R"( + { + "baz": "boo", + "hello": ["world"] + } + )"_json; + + // check if patched value is as expected + CHECK(doc.patch(patch) == result); + + // check roundtrip + CHECK(doc.patch(json::diff(doc, result)) == result); + } + + SECTION("Operations") + { + // The original document + json doc = R"( + { + "biscuits": [ + {"name":"Digestive"}, + {"name": "Choco Liebniz"} + ] + } + )"_json; + + SECTION("add") + { + // The patch + json patch = R"( + [ + {"op": "add", "path": "/biscuits/1", "value": {"name": "Ginger Nut"}} + ] + )"_json; + + // The result + json result = R"( + { + "biscuits": [ + {"name": "Digestive"}, + {"name": "Ginger Nut"}, + {"name": "Choco Liebniz"} + ] + } + )"_json; + + // check if patched value is as expected + CHECK(doc.patch(patch) == result); + + // check roundtrip + CHECK(doc.patch(json::diff(doc, result)) == result); + } + + SECTION("remove") + { + // The patch + json patch = R"( + [ + {"op": "remove", "path": "/biscuits"} + ] + )"_json; + + // The result + json result = R"( + {} + )"_json; + + // check if patched value is as expected + CHECK(doc.patch(patch) == result); + + // check roundtrip + CHECK(doc.patch(json::diff(doc, result)) == result); + } + + SECTION("replace") + { + // The patch + json patch = R"( + [ + {"op": "replace", "path": "/biscuits/0/name", "value": "Chocolate Digestive"} + ] + )"_json; + + // The result + json result = R"( + { + "biscuits": [ + {"name": "Chocolate Digestive"}, + {"name": "Choco Liebniz"} + ] + } + )"_json; + + // check if patched value is as expected + CHECK(doc.patch(patch) == result); + + // check roundtrip + CHECK(doc.patch(json::diff(doc, result)) == result); + } + + SECTION("copy") + { + // The patch + json patch = R"( + [ + {"op": "copy", "from": "/biscuits/0", "path": "/best_biscuit"} + ] + )"_json; + + // The result + json result = R"( + { + "biscuits": [ + {"name": "Digestive"}, + {"name": "Choco Liebniz"} + ], + "best_biscuit": { + "name": "Digestive" + } + } + )"_json; + + // check if patched value is as expected + CHECK(doc.patch(patch) == result); + + // check roundtrip + CHECK(doc.patch(json::diff(doc, result)) == result); + } + + SECTION("move") + { + // The patch + json patch = R"( + [ + {"op": "move", "from": "/biscuits", "path": "/cookies"} + ] + )"_json; + + // The result + json result = R"( + { + "cookies": [ + {"name": "Digestive"}, + {"name": "Choco Liebniz"} + ] + } + )"_json; + + // check if patched value is as expected + CHECK(doc.patch(patch) == result); + + // check roundtrip + CHECK(doc.patch(json::diff(doc, result)) == result); + } + + SECTION("test") + { + // The patch + json patch = R"( + [ + {"op": "test", "path": "/best_biscuit/name", "value": "Choco Liebniz"} + ] + )"_json; + + // the test will fail + CHECK_THROWS_AS(doc.patch(patch), std::domain_error); + CHECK_THROWS_WITH(doc.patch(patch), "unsuccessful: " + patch[0].dump()); + } + } + } + + SECTION("Examples from bruth.github.io/jsonpatch-js") + { + SECTION("add") + { + CHECK(R"( {} )"_json.patch( + R"( [{"op": "add", "path": "/foo", "value": "bar"}] )"_json + ) == R"( {"foo": "bar"} )"_json); + + CHECK(R"( {"foo": [1, 3]} )"_json.patch( + R"( [{"op": "add", "path": "/foo", "value": "bar"}] )"_json + ) == R"( {"foo": "bar"} )"_json); + + CHECK(R"( {"foo": [{}]} )"_json.patch( + R"( [{"op": "add", "path": "/foo/0/bar", "value": "baz"}] )"_json + ) == R"( {"foo": [{"bar": "baz"}]} )"_json); + } + + SECTION("remove") + { + CHECK(R"( {"foo": "bar"} )"_json.patch( + R"( [{"op": "remove", "path": "/foo"}] )"_json + ) == R"( {} )"_json); + + CHECK(R"( {"foo": [1, 2, 3]} )"_json.patch( + R"( [{"op": "remove", "path": "/foo/1"}] )"_json + ) == R"( {"foo": [1, 3]} )"_json); + + CHECK(R"( {"foo": [{"bar": "baz"}]} )"_json.patch( + R"( [{"op": "remove", "path": "/foo/0/bar"}] )"_json + ) == R"( {"foo": [{}]} )"_json); + } + + SECTION("replace") + { + CHECK(R"( {"foo": "bar"} )"_json.patch( + R"( [{"op": "replace", "path": "/foo", "value": 1}] )"_json + ) == R"( {"foo": 1} )"_json); + + CHECK(R"( {"foo": [1, 2, 3]} )"_json.patch( + R"( [{"op": "replace", "path": "/foo/1", "value": 4}] )"_json + ) == R"( {"foo": [1, 4, 3]} )"_json); + + CHECK(R"( {"foo": [{"bar": "baz"}]} )"_json.patch( + R"( [{"op": "replace", "path": "/foo/0/bar", "value": 1}] )"_json + ) == R"( {"foo": [{"bar": 1}]} )"_json); + } + + SECTION("move") + { + CHECK(R"( {"foo": [1, 2, 3]} )"_json.patch( + R"( [{"op": "move", "from": "/foo", "path": "/bar"}] )"_json + ) == R"( {"bar": [1, 2, 3]} )"_json); + } + + SECTION("copy") + { + CHECK(R"( {"foo": [1, 2, 3]} )"_json.patch( + R"( [{"op": "copy", "from": "/foo/1", "path": "/bar"}] )"_json + ) == R"( {"foo": [1, 2, 3], "bar": 2} )"_json); + } + + SECTION("copy") + { + CHECK_NOTHROW(R"( {"foo": "bar"} )"_json.patch( + R"( [{"op": "test", "path": "/foo", "value": "bar"}] )"_json)); + } + } } TEST_CASE("regression tests") From 9af8f7d09421d2023c32013a3c2504f5130dcc1d Mon Sep 17 00:00:00 2001 From: Niels Date: Tue, 26 Apr 2016 20:38:01 +0200 Subject: [PATCH 033/133] update after #238 --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 2dd60bf13..d4b2fbea2 100644 --- a/README.md +++ b/README.md @@ -410,7 +410,7 @@ I deeply appreciate the help of the following people. - [Lv Zheng](https://github.com/lv-zheng) fixed a namespace issue with `int64_t` and `uint64_t`. - [abc100m](https://github.com/abc100m) analyzed the issues with GCC 4.8 and proposed a [partial solution](https://github.com/nlohmann/json/pull/212). - [zewt](https://github.com/zewt) added useful notes to the README file about Android. -- [Róbert Márki](https://github.com/robertmrk) added a fix to use move iterators. +- [Róbert Márki](https://github.com/robertmrk) added a fix to use move iterators and improved the integration via CMake . Thanks a lot for helping out! From e35805cf3a30ff4052e879746bbfc4544813706c Mon Sep 17 00:00:00 2001 From: Niels Date: Fri, 29 Apr 2016 19:29:02 +0200 Subject: [PATCH 034/133] added GCC 6 and Clang 3.8 to Travis --- .travis.yml | 24 ++++++++++++++++-------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/.travis.yml b/.travis.yml index 629bec876..fd405df84 100644 --- a/.travis.yml +++ b/.travis.yml @@ -30,6 +30,14 @@ matrix: packages: ['g++-5', 'valgrind'] env: COMPILER=g++-5 + - os: linux + compiler: gcc + addons: + apt: + sources: ['ubuntu-toolchain-r-test'] + packages: ['g++-6', 'valgrind'] + env: COMPILER=g++-6 + - os: linux compiler: clang addons: @@ -45,6 +53,14 @@ matrix: sources: ['ubuntu-toolchain-r-test', 'llvm-toolchain-precise-3.7'] packages: ['clang-3.7', 'valgrind'] env: COMPILER=clang++-3.7 + + - os: linux + compiler: clang + addons: + apt: + sources: ['ubuntu-toolchain-r-test', 'llvm-toolchain-precise-3.8'] + packages: ['clang-3.8', 'valgrind'] + env: COMPILER=clang++-3.8 # - os: osx # compiler: clang @@ -57,11 +73,3 @@ script: - make CXX=$COMPILER CXXFLAGS="-lstdc++" - ./json_unit "*" - valgrind --error-exitcode=1 --leak-check=full ./json_unit - -notifications: - webhooks: - urls: - - https://webhooks.gitter.im/e/f1196addb0e97a5ff396 - on_success: change - on_failure: always - on_start: never From 86d7e3090f0e5d47626436a019149584e2d18f86 Mon Sep 17 00:00:00 2001 From: Niels Date: Fri, 29 Apr 2016 19:33:43 +0200 Subject: [PATCH 035/133] removed GCC 6, added Clang 3.5 --- .travis.yml | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/.travis.yml b/.travis.yml index fd405df84..495882353 100644 --- a/.travis.yml +++ b/.travis.yml @@ -30,13 +30,21 @@ matrix: packages: ['g++-5', 'valgrind'] env: COMPILER=g++-5 +# - os: linux +# compiler: gcc +# addons: +# apt: +# sources: ['ubuntu-toolchain-r-test'] +# packages: ['g++-6', 'valgrind'] +# env: COMPILER=g++-6 + - os: linux - compiler: gcc + compiler: clang addons: apt: - sources: ['ubuntu-toolchain-r-test'] - packages: ['g++-6', 'valgrind'] - env: COMPILER=g++-6 + sources: ['ubuntu-toolchain-r-test', 'llvm-toolchain-precise-3.5'] + packages: ['clang-3.5', 'valgrind'] + env: COMPILER=clang++-3.5 - os: linux compiler: clang From ca604c5a2ebb751aed3156011c220bbf3f9596de Mon Sep 17 00:00:00 2001 From: Niels Date: Fri, 29 Apr 2016 19:37:52 +0200 Subject: [PATCH 036/133] trying Clang 3.9 --- .travis.yml | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/.travis.yml b/.travis.yml index 495882353..4b3b700b7 100644 --- a/.travis.yml +++ b/.travis.yml @@ -38,13 +38,8 @@ matrix: # packages: ['g++-6', 'valgrind'] # env: COMPILER=g++-6 - - os: linux - compiler: clang - addons: - apt: - sources: ['ubuntu-toolchain-r-test', 'llvm-toolchain-precise-3.5'] - packages: ['clang-3.5', 'valgrind'] - env: COMPILER=clang++-3.5 + # Clang 3.5 is not able to compile the code, + # see https://travis-ci.org/nlohmann/json/jobs/126720186 - os: linux compiler: clang @@ -69,6 +64,14 @@ matrix: sources: ['ubuntu-toolchain-r-test', 'llvm-toolchain-precise-3.8'] packages: ['clang-3.8', 'valgrind'] env: COMPILER=clang++-3.8 + + - os: linux + compiler: clang + addons: + apt: + sources: ['ubuntu-toolchain-r-test', 'llvm-toolchain-precise-3.9'] + packages: ['clang-3.9', 'valgrind'] + env: COMPILER=clang++-3.9 # - os: osx # compiler: clang From 68c50073a425af9fa2381d041c8e5dad240162f6 Mon Sep 17 00:00:00 2001 From: Niels Date: Fri, 29 Apr 2016 19:46:37 +0200 Subject: [PATCH 037/133] added OSX --- .travis.yml | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/.travis.yml b/.travis.yml index 4b3b700b7..cd8957592 100644 --- a/.travis.yml +++ b/.travis.yml @@ -69,16 +69,17 @@ matrix: compiler: clang addons: apt: - sources: ['ubuntu-toolchain-r-test', 'llvm-toolchain-precise-3.9'] + sources: ['ubuntu-toolchain-r-test', 'llvm-toolchain-precise'] packages: ['clang-3.9', 'valgrind'] env: COMPILER=clang++-3.9 - # - os: osx - # compiler: clang - # env: COMPILER=clang - # before_install: - # - brew update - # - brew install valgrind + - os: osx + osx_image: xcode7.3 + compiler: clang + env: COMPILER=clang + before_install: + - brew update + - brew install valgrind script: - make CXX=$COMPILER CXXFLAGS="-lstdc++" From 40abeb28d584dc8b7f1c3aaff1ac9c1312568051 Mon Sep 17 00:00:00 2001 From: Niels Date: Fri, 29 Apr 2016 20:00:33 +0200 Subject: [PATCH 038/133] Valgrind only for Linux --- .travis.yml | 26 ++++++++++++++++++++++---- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/.travis.yml b/.travis.yml index cd8957592..f7c915119 100644 --- a/.travis.yml +++ b/.travis.yml @@ -45,7 +45,7 @@ matrix: compiler: clang addons: apt: - sources: ['ubuntu-toolchain-r-test', 'llvm-toolchain-precise-3.6'] + sources: ['ubuntu-toolchain-r-test', 'llvm-toolchain-precise'] packages: ['clang-3.6', 'valgrind'] env: COMPILER=clang++-3.6 @@ -53,7 +53,7 @@ matrix: compiler: clang addons: apt: - sources: ['ubuntu-toolchain-r-test', 'llvm-toolchain-precise-3.7'] + sources: ['ubuntu-toolchain-r-test', 'llvm-toolchain-precise'] packages: ['clang-3.7', 'valgrind'] env: COMPILER=clang++-3.7 @@ -61,7 +61,7 @@ matrix: compiler: clang addons: apt: - sources: ['ubuntu-toolchain-r-test', 'llvm-toolchain-precise-3.8'] + sources: ['ubuntu-toolchain-r-test', 'llvm-toolchain-precise'] packages: ['clang-3.8', 'valgrind'] env: COMPILER=clang++-3.8 @@ -72,7 +72,23 @@ matrix: sources: ['ubuntu-toolchain-r-test', 'llvm-toolchain-precise'] packages: ['clang-3.9', 'valgrind'] env: COMPILER=clang++-3.9 + + - os: osx + osx_image: xcode7.1 + compiler: clang + env: COMPILER=clang + before_install: + - brew update + - brew install valgrind + - os: osx + osx_image: xcode7.2 + compiler: clang + env: COMPILER=clang + before_install: + - brew update + - brew install valgrind + - os: osx osx_image: xcode7.3 compiler: clang @@ -84,4 +100,6 @@ matrix: script: - make CXX=$COMPILER CXXFLAGS="-lstdc++" - ./json_unit "*" - - valgrind --error-exitcode=1 --leak-check=full ./json_unit + - if [ "${os}" = "linux" ]; then + valgrind --error-exitcode=1 --leak-check=full ./json_unit ; + fi From a07cdb14ecfbf84c38643c23b3490a684991eb4c Mon Sep 17 00:00:00 2001 From: Niels Date: Fri, 29 Apr 2016 20:01:11 +0200 Subject: [PATCH 039/133] don't install valgrind for OSX --- .travis.yml | 9 --------- 1 file changed, 9 deletions(-) diff --git a/.travis.yml b/.travis.yml index f7c915119..79fad4708 100644 --- a/.travis.yml +++ b/.travis.yml @@ -77,25 +77,16 @@ matrix: osx_image: xcode7.1 compiler: clang env: COMPILER=clang - before_install: - - brew update - - brew install valgrind - os: osx osx_image: xcode7.2 compiler: clang env: COMPILER=clang - before_install: - - brew update - - brew install valgrind - os: osx osx_image: xcode7.3 compiler: clang env: COMPILER=clang - before_install: - - brew update - - brew install valgrind script: - make CXX=$COMPILER CXXFLAGS="-lstdc++" From ddc5442c91b54837060404f91e46f27d968f60d2 Mon Sep 17 00:00:00 2001 From: Niels Date: Fri, 29 Apr 2016 20:09:41 +0200 Subject: [PATCH 040/133] cleanup --- .travis.yml | 28 ++++++++++++++++++++++++---- 1 file changed, 24 insertions(+), 4 deletions(-) diff --git a/.travis.yml b/.travis.yml index 79fad4708..2133d17ac 100644 --- a/.travis.yml +++ b/.travis.yml @@ -45,7 +45,7 @@ matrix: compiler: clang addons: apt: - sources: ['ubuntu-toolchain-r-test', 'llvm-toolchain-precise'] + sources: ['ubuntu-toolchain-r-test', 'llvm-toolchain-precise-3.6'] packages: ['clang-3.6', 'valgrind'] env: COMPILER=clang++-3.6 @@ -53,7 +53,7 @@ matrix: compiler: clang addons: apt: - sources: ['ubuntu-toolchain-r-test', 'llvm-toolchain-precise'] + sources: ['ubuntu-toolchain-r-test', 'llvm-toolchain-precise-3.7'] packages: ['clang-3.7', 'valgrind'] env: COMPILER=clang++-3.7 @@ -61,7 +61,7 @@ matrix: compiler: clang addons: apt: - sources: ['ubuntu-toolchain-r-test', 'llvm-toolchain-precise'] + sources: ['ubuntu-toolchain-r-test', 'llvm-toolchain-precise-3.8'] packages: ['clang-3.8', 'valgrind'] env: COMPILER=clang++-3.8 @@ -73,6 +73,26 @@ matrix: packages: ['clang-3.9', 'valgrind'] env: COMPILER=clang++-3.9 + - os: osx + osx_image: beta-xcode6.1 + compiler: clang + env: COMPILER=clang + + - os: osx + osx_image: beta-xcode6.2 + compiler: clang + env: COMPILER=clang + + - os: osx + osx_image: beta-xcode6.3 + compiler: clang + env: COMPILER=clang + + - os: osx + osx_image: xcode6.4 + compiler: clang + env: COMPILER=clang + - os: osx osx_image: xcode7.1 compiler: clang @@ -91,6 +111,6 @@ matrix: script: - make CXX=$COMPILER CXXFLAGS="-lstdc++" - ./json_unit "*" - - if [ "${os}" = "linux" ]; then + - if [ "${TRAVIS_OS_NAME}" = "linux" ]; then valgrind --error-exitcode=1 --leak-check=full ./json_unit ; fi From b685737d53c4adbd5869b238c46a8782ffd3f237 Mon Sep 17 00:00:00 2001 From: Niels Date: Fri, 29 Apr 2016 20:18:20 +0200 Subject: [PATCH 041/133] added MinGW --- .travis.yml | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 2133d17ac..3341f8236 100644 --- a/.travis.yml +++ b/.travis.yml @@ -30,6 +30,14 @@ matrix: packages: ['g++-5', 'valgrind'] env: COMPILER=g++-5 + - os: linux + compiler: gcc + addons: + apt: + sources: ['ubuntu-toolchain-r-test'] + packages: ['g++-mingw-w64'] + env: COMPILER=g++-mingw-w64 + # - os: linux # compiler: gcc # addons: @@ -111,6 +119,6 @@ matrix: script: - make CXX=$COMPILER CXXFLAGS="-lstdc++" - ./json_unit "*" - - if [ "${TRAVIS_OS_NAME}" = "linux" ]; then + - if [ `which valgrind` ]; then valgrind --error-exitcode=1 --leak-check=full ./json_unit ; fi From c019088d3b750841c8565a30c564d23d438b5b0e Mon Sep 17 00:00:00 2001 From: Niels Date: Fri, 29 Apr 2016 20:35:40 +0200 Subject: [PATCH 042/133] wrong MinGW binary --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 3341f8236..c038866e4 100644 --- a/.travis.yml +++ b/.travis.yml @@ -36,7 +36,7 @@ matrix: apt: sources: ['ubuntu-toolchain-r-test'] packages: ['g++-mingw-w64'] - env: COMPILER=g++-mingw-w64 + env: COMPILER=i686-w64-mingw32-g++ # - os: linux # compiler: gcc From 74544b42af024c1d4f1942be534859aa22947276 Mon Sep 17 00:00:00 2001 From: Niels Date: Fri, 29 Apr 2016 20:48:47 +0200 Subject: [PATCH 043/133] removed MinGW compiler (too old) --- .travis.yml | 8 -------- 1 file changed, 8 deletions(-) diff --git a/.travis.yml b/.travis.yml index c038866e4..882f98d2f 100644 --- a/.travis.yml +++ b/.travis.yml @@ -30,14 +30,6 @@ matrix: packages: ['g++-5', 'valgrind'] env: COMPILER=g++-5 - - os: linux - compiler: gcc - addons: - apt: - sources: ['ubuntu-toolchain-r-test'] - packages: ['g++-mingw-w64'] - env: COMPILER=i686-w64-mingw32-g++ - # - os: linux # compiler: gcc # addons: From 62f81a60d7a9d62ee2fcf2569b8f4a7aceea5551 Mon Sep 17 00:00:00 2001 From: Niels Date: Fri, 29 Apr 2016 21:23:13 +0200 Subject: [PATCH 044/133] hopefully fixed a warning --- src/json.hpp | 6 ++++-- src/json.hpp.re2c | 6 ++++-- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/src/json.hpp b/src/json.hpp index 57a8f4c72..65ced7305 100644 --- a/src/json.hpp +++ b/src/json.hpp @@ -6078,9 +6078,11 @@ class basic_json { // convert a number 0..15 to its hex representation // (0..f) - auto hexify = [](const char v) -> char + const auto hexify = [](const int v) -> char { - return (v < 10) ? ('0' + v) : ('a' + v - 10); + return (v < 10) + ? ('0' + static_cast(v)) + : ('a' + static_cast(v - 10)); }; // print character c as \uxxxx diff --git a/src/json.hpp.re2c b/src/json.hpp.re2c index cdd96ee91..0aa8321e5 100644 --- a/src/json.hpp.re2c +++ b/src/json.hpp.re2c @@ -6078,9 +6078,11 @@ class basic_json { // convert a number 0..15 to its hex representation // (0..f) - auto hexify = [](const char v) -> char + const auto hexify = [](const int v) -> char { - return (v < 10) ? ('0' + v) : ('a' + v - 10); + return (v < 10) + ? ('0' + static_cast(v)) + : ('a' + static_cast(v - 10)); }; // print character c as \uxxxx From 1d3b4dd1583d1eeacf7df3c0f9ad2f356b378712 Mon Sep 17 00:00:00 2001 From: Niels Date: Sat, 30 Apr 2016 00:03:47 +0200 Subject: [PATCH 045/133] added test cases --- ChangeLog.md | 5 ++- doc/examples/json_pointer__to_string.cpp | 34 +++++++++++++++++ doc/examples/json_pointer__to_string.link | 1 + doc/examples/json_pointer__to_string.output | 12 ++++++ src/json.hpp | 37 +++++++++++++++++-- src/json.hpp.re2c | 37 +++++++++++++++++-- test/unit.cpp | 41 +++++++++++++++++++++ 7 files changed, 160 insertions(+), 7 deletions(-) create mode 100644 doc/examples/json_pointer__to_string.cpp create mode 100644 doc/examples/json_pointer__to_string.link create mode 100644 doc/examples/json_pointer__to_string.output diff --git a/ChangeLog.md b/ChangeLog.md index 0acd10f5a..75827603f 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -5,10 +5,12 @@ All notable changes to this project will be documented in this file. This projec [Full Changelog](https://github.com/nlohmann/json/compare/v1.1.0...HEAD) +- Additional integration options [\#237](https://github.com/nlohmann/json/issues/237) +- Can't use basic\_json::iterator as a base iterator for std::move\_iterator [\#233](https://github.com/nlohmann/json/issues/233) - Provide a FAQ [\#163](https://github.com/nlohmann/json/issues/163) - Create PULL\_REQUEST\_TEMPLATE.md [\#213](https://github.com/nlohmann/json/pull/213) ([whackashoe](https://github.com/whackashoe)) - fixed noexcept; added constexpr [\#208](https://github.com/nlohmann/json/pull/208) ([nlohmann](https://github.com/nlohmann)) -- Add support for afl-fuzz testing [\#207](https://github.com/nlohmann/json/pull/207) ([msm-](https://github.com/msm-)) +- Add support for afl-fuzz testing [\#207](https://github.com/nlohmann/json/pull/207) ([mykter](https://github.com/mykter)) - Issue \#178 - Extending support to full uint64\_t/int64\_t range and unsigned type \(updated\) [\#193](https://github.com/nlohmann/json/pull/193) ([twelsby](https://github.com/twelsby)) - double values are serialized with commas as decimal points [\#228](https://github.com/nlohmann/json/issues/228) @@ -26,6 +28,7 @@ All notable changes to this project will be documented in this file. This projec - Conflicting typedef of ssize\_t on Windows 32 bit when using Boost.Python [\#204](https://github.com/nlohmann/json/issues/204) - Integer conversion to unsigned [\#178](https://github.com/nlohmann/json/issues/178) +- Implement additional integration options [\#238](https://github.com/nlohmann/json/pull/238) ([robertmrk](https://github.com/robertmrk)) - make serialization locale-independent [\#232](https://github.com/nlohmann/json/pull/232) ([nlohmann](https://github.com/nlohmann)) - fixes \#223 by updating README.md [\#227](https://github.com/nlohmann/json/pull/227) ([kevin--](https://github.com/kevin--)) - Use namespace std for int64\_t and uint64\_t [\#226](https://github.com/nlohmann/json/pull/226) ([lv-zheng](https://github.com/lv-zheng)) diff --git a/doc/examples/json_pointer__to_string.cpp b/doc/examples/json_pointer__to_string.cpp new file mode 100644 index 000000000..4cb053c53 --- /dev/null +++ b/doc/examples/json_pointer__to_string.cpp @@ -0,0 +1,34 @@ +#include + +using json = nlohmann::json; + +int main() +{ + // different JSON Pointers + json::json_pointer ptr1(""); + json::json_pointer ptr2("/foo"); + json::json_pointer ptr3("/foo/0"); + json::json_pointer ptr4("/"); + json::json_pointer ptr5("/a~1b"); + json::json_pointer ptr6("/c%d"); + json::json_pointer ptr7("/e^f"); + json::json_pointer ptr8("/g|h"); + json::json_pointer ptr9("/i\\j"); + json::json_pointer ptr10("/k\"l"); + json::json_pointer ptr11("/ "); + json::json_pointer ptr12("/m~0n"); + + + std::cout << ptr1.to_string() << '\n' + << ptr2.to_string() << '\n' + << ptr3.to_string() << '\n' + << ptr4.to_string() << '\n' + << ptr5.to_string() << '\n' + << ptr6.to_string() << '\n' + << ptr7.to_string() << '\n' + << ptr8.to_string() << '\n' + << ptr9.to_string() << '\n' + << ptr10.to_string() << '\n' + << ptr11.to_string() << '\n' + << ptr12.to_string() << std::endl; +} diff --git a/doc/examples/json_pointer__to_string.link b/doc/examples/json_pointer__to_string.link new file mode 100644 index 000000000..407609b20 --- /dev/null +++ b/doc/examples/json_pointer__to_string.link @@ -0,0 +1 @@ +online \ No newline at end of file diff --git a/doc/examples/json_pointer__to_string.output b/doc/examples/json_pointer__to_string.output new file mode 100644 index 000000000..c4b5ea8fa --- /dev/null +++ b/doc/examples/json_pointer__to_string.output @@ -0,0 +1,12 @@ + +/foo +/foo/0 +/ +/a~1b +/c%d +/e^f +/g|h +/i\j +/k"l +/ +/m~0n diff --git a/src/json.hpp b/src/json.hpp index 1785f182f..6b22e89d4 100644 --- a/src/json.hpp +++ b/src/json.hpp @@ -8818,6 +8818,10 @@ basic_json_parser_63: /*! @brief JSON Pointer + A JSON pointer defines a string syntax for identifying a specific value + within a JSON document. It can be used with functions `at` and + `operator[]`. Furthermore, JSON pointers are the base for JSON patches. + @sa [RFC 6901](https://tools.ietf.org/html/rfc6901) @since version 2.0.0 @@ -8854,10 +8858,37 @@ basic_json_parser_63: : reference_tokens(split(s)) {} - /// test for inequality - bool operator!=(const json_pointer& rhs) const + /*! + @brief return a string representation of the JSON pointer + + @invariant For each JSON pointer `ptr`, it holds: + @code {.cpp} + ptr == json_pointer(ptr.to_string()); + @endcode + + @return a string representation of the JSON pointer + + @liveexample{The example shows the result of `to_string`., + json_pointer__to_string} + + @since version 2.0.0 + */ + std::string to_string() const noexcept { - return reference_tokens != rhs.reference_tokens; + std::string result; + + for (const auto& reference_token : reference_tokens) + { + result += "/" + escape(reference_token); + } + + return result; + } + + /// @copydoc to_string() + operator std::string() const + { + return to_string(); } private: diff --git a/src/json.hpp.re2c b/src/json.hpp.re2c index 51b721670..3dab33bbe 100644 --- a/src/json.hpp.re2c +++ b/src/json.hpp.re2c @@ -8128,6 +8128,10 @@ class basic_json /*! @brief JSON Pointer + A JSON pointer defines a string syntax for identifying a specific value + within a JSON document. It can be used with functions `at` and + `operator[]`. Furthermore, JSON pointers are the base for JSON patches. + @sa [RFC 6901](https://tools.ietf.org/html/rfc6901) @since version 2.0.0 @@ -8164,10 +8168,37 @@ class basic_json : reference_tokens(split(s)) {} - /// test for inequality - bool operator!=(const json_pointer& rhs) const + /*! + @brief return a string representation of the JSON pointer + + @invariant For each JSON pointer `ptr`, it holds: + @code {.cpp} + ptr == json_pointer(ptr.to_string()); + @endcode + + @return a string representation of the JSON pointer + + @liveexample{The example shows the result of `to_string`., + json_pointer__to_string} + + @since version 2.0.0 + */ + std::string to_string() const noexcept { - return reference_tokens != rhs.reference_tokens; + std::string result; + + for (const auto& reference_token : reference_tokens) + { + result += "/" + escape(reference_token); + } + + return result; + } + + /// @copydoc to_string() + operator std::string() const + { + return to_string(); } private: diff --git a/test/unit.cpp b/test/unit.cpp index f6c49883b..d038b8679 100644 --- a/test/unit.cpp +++ b/test/unit.cpp @@ -12035,6 +12035,36 @@ TEST_CASE("Unicode", "[hide]") // the array has 1112064 + 1 elemnts (a terminating "null" value) CHECK(j.size() == 1112065); + + SECTION("check JSON Pointers") + { + for (auto s : j) + { + // skip non-string JSON values + if (not s.is_string()) + { + continue; + } + + std::string ptr = s; + + // tilde must be followed by 0 or 1 + if (ptr == "~") + { + ptr += "0"; + } + + // JSON Pointers must begin with "/" + ptr = "/" + ptr; + + CHECK_NOTHROW(json::json_pointer("/" + ptr)); + + // check escape/unescape roundtrip + auto escaped = json::json_pointer::escape(ptr); + json::json_pointer::unescape(escaped); + CHECK(escaped == ptr); + } + } } SECTION("ignore byte-order-mark") @@ -12389,6 +12419,17 @@ TEST_CASE("JSON pointers") json j_object(json::value_t::object); CHECK(j_object.flatten().unflatten() == json()); } + + SECTION("string representation") + { + for (auto ptr : + {"", "/foo", "/foo/0", "/", "/a~1b", "/c%d", "/e^f", "/g|h", "/i\\j", "/k\"l", "/ ", "/m~0n" + }) + { + CHECK(json::json_pointer(ptr).to_string() == ptr); + CHECK(json::json_pointer(ptr) == ptr); + } + } } TEST_CASE("JSON patch") From f4ecceab19442e46813de74c3f1571e16ceffa42 Mon Sep 17 00:00:00 2001 From: Niels Date: Sat, 30 Apr 2016 00:12:19 +0200 Subject: [PATCH 046/133] cleanup --- test/unit.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/test/unit.cpp b/test/unit.cpp index d038b8679..2ad28a746 100644 --- a/test/unit.cpp +++ b/test/unit.cpp @@ -12427,7 +12427,6 @@ TEST_CASE("JSON pointers") }) { CHECK(json::json_pointer(ptr).to_string() == ptr); - CHECK(json::json_pointer(ptr) == ptr); } } } From be16d005e4e7167c23344e78b72b5229706d347d Mon Sep 17 00:00:00 2001 From: Niels Date: Sat, 30 Apr 2016 00:25:11 +0200 Subject: [PATCH 047/133] get compiler versions --- .travis.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.travis.yml b/.travis.yml index 882f98d2f..979c5aabf 100644 --- a/.travis.yml +++ b/.travis.yml @@ -109,6 +109,7 @@ matrix: env: COMPILER=clang script: + - $COMPILER --version - make CXX=$COMPILER CXXFLAGS="-lstdc++" - ./json_unit "*" - if [ `which valgrind` ]; then From 7c04bc3db659cfd02bbe1903bea4447a672aed83 Mon Sep 17 00:00:00 2001 From: Niels Date: Sat, 30 Apr 2016 00:43:33 +0200 Subject: [PATCH 048/133] added name call --- .travis.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.travis.yml b/.travis.yml index 979c5aabf..d1748dff5 100644 --- a/.travis.yml +++ b/.travis.yml @@ -109,6 +109,7 @@ matrix: env: COMPILER=clang script: + - uname -a - $COMPILER --version - make CXX=$COMPILER CXXFLAGS="-lstdc++" - ./json_unit "*" From 9170740f45b033c9fbd06f084890e18bffec091e Mon Sep 17 00:00:00 2001 From: Niels Date: Sat, 30 Apr 2016 01:01:41 +0200 Subject: [PATCH 049/133] added documentation on Travis compilers --- README.md | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/README.md b/README.md index 90be576cf..1f1e09274 100644 --- a/README.md +++ b/README.md @@ -48,6 +48,8 @@ Though it's 2016 already, the support for C++11 is still a bit sparse. Currently - Clang 3.4 - 3.9 (and possibly later) - Microsoft Visual C++ 14.0 RC (and possibly later) +The code is currently checked with Travis for GCC 4.9, GCC + I would be happy to learn about other compilers/versions. Please note: @@ -63,6 +65,24 @@ Please note: - For GCC running on MinGW or Android SDK, the error `'to_string' is not a member of 'std'` (or similarly, for `strtod`) may occur. Note this is not an issue with the code, but rather with the compiler itself. On Android, see above to build with a newer environment. For MinGW, please refer to [this site](http://tehsausage.com/mingw-to-string) and [this discussion](https://github.com/nlohmann/json/issues/136) for information on how to fix this bug. +The following compilers are currently used in [continuous integration](https://travis-ci.org/nlohmann/json): + +| Compiler | Operating System | Version String | +|-----------------|------------------------------|----------------| +| GCC 4.9.3 | Ubuntu 14.04.3 LTS | g++-4.9 (Ubuntu 4.9.3-8ubuntu2~14.04) 4.9.3 | +| GCC 5.3.0 | Ubuntu 14.04.3 LTS | g++-5 (Ubuntu 5.3.0-3ubuntu1~14.04) 5.3.0 20151204 | +| Clang 3.6.2 | Ubuntu 14.04.3 LTS | Ubuntu clang version 3.6.2-svn240577-1~exp1 (branches/release_36) (based on LLVM 3.6.2) | +| Clang 3.7.1 | Ubuntu 14.04.3 LTS | Ubuntu clang version 3.7.1-svn253571-1~exp1 (branches/release_37) (based on LLVM 3.7.1) | +| Clang 3.8.1 | Ubuntu 14.04.3 LTS | clang version 3.8.1-svn265380-1~exp1 (branches/release_38) | +| Clang 3.9.0 | Ubuntu 14.04.3 LTS | clang version 3.9.0-svn267478-1~exp1 (trunk) | +| Clang Xcode 6.1 | Darwin Kernel Version 13.4.0 | Apple LLVM version 6.0 (clang-600.0.54) (based on LLVM 3.5svn) | +| Clang Xcode 6.2 | Darwin Kernel Version 13.4.0 | Apple LLVM version 6.0 (clang-600.0.57) (based on LLVM 3.5svn) | +| Clang Xcode 6.3 | Darwin Kernel Version 14.3.0 | Apple LLVM version 6.1.0 (clang-602.0.49) (based on LLVM 3.6.0svn) | +| Clang Xcode 6.4 | Darwin Kernel Version 14.3.0 | Apple LLVM version 6.1.0 (clang-602.0.53) (based on LLVM 3.6.0svn) | +| Clang Xcode 7.1 | Darwin Kernel Version 14.5.0 | Apple LLVM version 7.0.0 (clang-700.1.76) | +| Clang Xcode 7.2 | Darwin Kernel Version 15.0.0 | Apple LLVM version 7.0.2 (clang-700.1.81) | +| Clang Xcode 7.3 | Darwin Kernel Version 14.5.0 | Apple LLVM version 7.3.0 (clang-703.0.29) | + ## Examples Here are some examples to give you an idea how to use the class. From a21f8b0c77646f3eb225bc98ed3f9ca586101068 Mon Sep 17 00:00:00 2001 From: Niels Date: Sat, 30 Apr 2016 01:21:35 +0200 Subject: [PATCH 050/133] added AppVeyor information --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 1f1e09274..28794d9ce 100644 --- a/README.md +++ b/README.md @@ -82,6 +82,7 @@ The following compilers are currently used in [continuous integration](https://t | Clang Xcode 7.1 | Darwin Kernel Version 14.5.0 | Apple LLVM version 7.0.0 (clang-700.1.76) | | Clang Xcode 7.2 | Darwin Kernel Version 15.0.0 | Apple LLVM version 7.0.2 (clang-700.1.81) | | Clang Xcode 7.3 | Darwin Kernel Version 14.5.0 | Apple LLVM version 7.3.0 (clang-703.0.29) | +| Visual Studio 14 2015 | Windows Server 2012 R2 (x64) | Microsoft (R) Build Engine version 14.0.25123.0 | ## Examples From ea84a85b132b2e9bdf1e61aa55b657eba5e254f1 Mon Sep 17 00:00:00 2001 From: Niels Date: Sat, 30 Apr 2016 10:39:03 +0200 Subject: [PATCH 051/133] simplified flatten/unflatten examples --- README.md | 2 +- doc/examples/flatten.cpp | 9 +-------- doc/examples/flatten.link | 2 +- doc/examples/flatten.output | 5 ----- doc/examples/unflatten.cpp | 4 ---- doc/examples/unflatten.link | 2 +- doc/examples/unflatten.output | 6 +----- 7 files changed, 5 insertions(+), 25 deletions(-) diff --git a/README.md b/README.md index 28794d9ce..1f501b73c 100644 --- a/README.md +++ b/README.md @@ -449,7 +449,7 @@ $ make $ ./json_unit "*" =============================================================================== -All tests passed (3344554 assertions in 31 test cases) +All tests passed (5568699 assertions in 31 test cases) ``` For more information, have a look at the file [.travis.yml](https://github.com/nlohmann/json/blob/master/.travis.yml). diff --git a/doc/examples/flatten.cpp b/doc/examples/flatten.cpp index 0601f8a3f..ace53a21b 100644 --- a/doc/examples/flatten.cpp +++ b/doc/examples/flatten.cpp @@ -20,18 +20,11 @@ int main() { "object", { {"currency", "USD"}, - {"value", 42.99}, - {"", "empty string"}, - {"/", "slash"}, - {"~", "tilde"}, - {"~1", "tilde1"} + {"value", 42.99} } } }; // call flatten() std::cout << std::setw(4) << j.flatten() << '\n'; - - // flatten for a primitive value - std::cout << j["pi"].flatten() << '\n'; } diff --git a/doc/examples/flatten.link b/doc/examples/flatten.link index 0fe78bbb1..817d06277 100644 --- a/doc/examples/flatten.link +++ b/doc/examples/flatten.link @@ -1 +1 @@ -online \ No newline at end of file +online \ No newline at end of file diff --git a/doc/examples/flatten.output b/doc/examples/flatten.output index fedfc8ef2..33bd4c4b9 100644 --- a/doc/examples/flatten.output +++ b/doc/examples/flatten.output @@ -6,12 +6,7 @@ "/list/2": 2, "/name": "Niels", "/nothing": null, - "/object/": "empty string", "/object/currency": "USD", "/object/value": 42.99, - "/object/~0": "tilde", - "/object/~01": "tilde1", - "/object/~1": "slash", "/pi": 3.141 } -{"":3.141} diff --git a/doc/examples/unflatten.cpp b/doc/examples/unflatten.cpp index 39c674c94..e2b9b6b86 100644 --- a/doc/examples/unflatten.cpp +++ b/doc/examples/unflatten.cpp @@ -14,12 +14,8 @@ int main() {"/list/2", 2}, {"/name", "Niels"}, {"/nothing", nullptr}, - {"/object/", "empty string"}, {"/object/currency", "USD"}, {"/object/value", 42.99}, - {"/object/~0", "tilde"}, - {"/object/~01", "tilde1"}, - {"/object/~1", "slash"}, {"/pi", 3.141} }; diff --git a/doc/examples/unflatten.link b/doc/examples/unflatten.link index bc7594a0a..d564ab012 100644 --- a/doc/examples/unflatten.link +++ b/doc/examples/unflatten.link @@ -1 +1 @@ -online \ No newline at end of file +online \ No newline at end of file diff --git a/doc/examples/unflatten.output b/doc/examples/unflatten.output index f57c9c9a1..ed48385ae 100644 --- a/doc/examples/unflatten.output +++ b/doc/examples/unflatten.output @@ -11,12 +11,8 @@ "name": "Niels", "nothing": null, "object": { - "": "empty string", - "/": "slash", "currency": "USD", - "value": 42.99, - "~": "tilde", - "~1": "tilde1" + "value": 42.99 }, "pi": 3.141 } From 9073b2ca392893b84bbee789ccb171dda7bef022 Mon Sep 17 00:00:00 2001 From: Niels Date: Sat, 30 Apr 2016 16:22:27 +0200 Subject: [PATCH 052/133] hopefully removed some warnings --- src/json.hpp | 6 +++--- src/json.hpp.re2c | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/json.hpp b/src/json.hpp index 65ced7305..80b67710a 100644 --- a/src/json.hpp +++ b/src/json.hpp @@ -757,7 +757,7 @@ class basic_json /// assignment type_data_t& operator=(value_t rhs) { - bits.type = static_cast(rhs); + bits.type = static_cast(rhs) & 15; // avoid overflow return *this; } @@ -765,7 +765,7 @@ class basic_json type_data_t(value_t t) noexcept { *reinterpret_cast(this) = 0; - bits.type = static_cast(t); + bits.type = static_cast(t) & 15; // avoid overflow } /// default constructor @@ -6082,7 +6082,7 @@ class basic_json { return (v < 10) ? ('0' + static_cast(v)) - : ('a' + static_cast(v - 10)); + : ('a' + static_cast((v - 10) & 0xff)); }; // print character c as \uxxxx diff --git a/src/json.hpp.re2c b/src/json.hpp.re2c index 0aa8321e5..1c80915b0 100644 --- a/src/json.hpp.re2c +++ b/src/json.hpp.re2c @@ -757,7 +757,7 @@ class basic_json /// assignment type_data_t& operator=(value_t rhs) { - bits.type = static_cast(rhs); + bits.type = static_cast(rhs) & 15; // avoid overflow return *this; } @@ -765,7 +765,7 @@ class basic_json type_data_t(value_t t) noexcept { *reinterpret_cast(this) = 0; - bits.type = static_cast(t); + bits.type = static_cast(t) & 15; // avoid overflow } /// default constructor @@ -6082,7 +6082,7 @@ class basic_json { return (v < 10) ? ('0' + static_cast(v)) - : ('a' + static_cast(v - 10)); + : ('a' + static_cast((v - 10) & 0xff)); }; // print character c as \uxxxx From c04275966f8e1d2aba154074ef823b5973e1cb68 Mon Sep 17 00:00:00 2001 From: Niels Date: Sat, 7 May 2016 18:33:43 +0200 Subject: [PATCH 053/133] improved test coverage --- README.md | 2 +- src/json.hpp | 3 ++- src/json.hpp.re2c | 3 ++- test/unit.cpp | 6 ++++++ 4 files changed, 11 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 1f501b73c..f8cb20d6e 100644 --- a/README.md +++ b/README.md @@ -449,7 +449,7 @@ $ make $ ./json_unit "*" =============================================================================== -All tests passed (5568699 assertions in 31 test cases) +All tests passed (5568703 assertions in 31 test cases) ``` For more information, have a look at the file [.travis.yml](https://github.com/nlohmann/json/blob/master/.travis.yml). diff --git a/src/json.hpp b/src/json.hpp index 6b22e89d4..932ab9e54 100644 --- a/src/json.hpp +++ b/src/json.hpp @@ -9708,7 +9708,8 @@ basic_json_parser_63: default: { - throw std::domain_error("unexpected parent type " + parent.type_name()); + // if there exists a parent it cannot be primitive + assert(false); // LCOV_EXCL_LINE } } } diff --git a/src/json.hpp.re2c b/src/json.hpp.re2c index 3dab33bbe..77a1eea9a 100644 --- a/src/json.hpp.re2c +++ b/src/json.hpp.re2c @@ -9018,7 +9018,8 @@ class basic_json default: { - throw std::domain_error("unexpected parent type " + parent.type_name()); + // if there exists a parent it cannot be primitive + assert(false); // LCOV_EXCL_LINE } } } diff --git a/test/unit.cpp b/test/unit.cpp index 2ad28a746..de00166f7 100644 --- a/test/unit.cpp +++ b/test/unit.cpp @@ -12094,6 +12094,12 @@ TEST_CASE("JSON pointers") CHECK_THROWS_AS(json::json_pointer("/~"), std::domain_error); CHECK_THROWS_WITH(json::json_pointer("/~"), "escape error: '~' must be followed with '0' or '1'"); + + json::json_pointer p; + CHECK_THROWS_AS(p.top(), std::domain_error); + CHECK_THROWS_WITH(p.top(), "JSON pointer has no parent"); + CHECK_THROWS_AS(p.pop_back(), std::domain_error); + CHECK_THROWS_WITH(p.pop_back(), "JSON pointer has no parent"); } SECTION("examples from RFC 6901") From 85a30813c8d9b0eccefcdc59e9e4e602a7fffae7 Mon Sep 17 00:00:00 2001 From: Niels Date: Sat, 7 May 2016 20:22:58 +0200 Subject: [PATCH 054/133] removed unnecessary code (numbers must not begin with "+") --- README.md | 2 +- src/json.hpp | 4 ---- src/json.hpp.re2c | 4 ---- test/unit.cpp | 4 ++++ 4 files changed, 5 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index f8cb20d6e..c9f3a713a 100644 --- a/README.md +++ b/README.md @@ -449,7 +449,7 @@ $ make $ ./json_unit "*" =============================================================================== -All tests passed (5568703 assertions in 31 test cases) +All tests passed (5568705 assertions in 31 test cases) ``` For more information, have a look at the file [.travis.yml](https://github.com/nlohmann/json/blob/master/.travis.yml). diff --git a/src/json.hpp b/src/json.hpp index 932ab9e54..515365501 100644 --- a/src/json.hpp +++ b/src/json.hpp @@ -8448,10 +8448,6 @@ basic_json_parser_63: { type = value_t::number_unsigned; max = static_cast(std::numeric_limits::max()); - if (*curptr == '+') - { - curptr++; - } } // count the significant figures diff --git a/src/json.hpp.re2c b/src/json.hpp.re2c index 77a1eea9a..c8b66e920 100644 --- a/src/json.hpp.re2c +++ b/src/json.hpp.re2c @@ -7758,10 +7758,6 @@ class basic_json { type = value_t::number_unsigned; max = static_cast(std::numeric_limits::max()); - if (*curptr == '+') - { - curptr++; - } } // count the significant figures diff --git a/test/unit.cpp b/test/unit.cpp index de00166f7..9b735108d 100644 --- a/test/unit.cpp +++ b/test/unit.cpp @@ -9776,6 +9776,10 @@ TEST_CASE("parser class") CHECK_THROWS_AS(json::parser("-0e-:").parse(), std::invalid_argument); CHECK_THROWS_AS(json::parser("-0f").parse(), std::invalid_argument); + // numbers must not begin with "+" + CHECK_THROWS_AS(json::parser("+1").parse(), std::invalid_argument); + CHECK_THROWS_AS(json::parser("+0").parse(), std::invalid_argument); + CHECK_THROWS_WITH(json::parser("01").parse(), "parse error - unexpected number literal; expected end of input"); CHECK_THROWS_WITH(json::parser("--1").parse(), "parse error - unexpected '-'"); From fadf286653c41823804bd224d88db39d7835c9da Mon Sep 17 00:00:00 2001 From: Niels Date: Sun, 8 May 2016 14:35:32 +0200 Subject: [PATCH 055/133] added test case for std::bad_alloc --- test/unit.cpp | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/test/unit.cpp b/test/unit.cpp index 9b735108d..af52e1751 100644 --- a/test/unit.cpp +++ b/test/unit.cpp @@ -13993,3 +13993,34 @@ TEST_CASE("regression tests") CHECK(dest == expected); } } + +// special test case to check if memory is leaked if constructor throws + +template +struct my_allocator : std::allocator +{ + template + void construct(T*, Args&& ...) + { + throw std::bad_alloc(); + } +}; + +TEST_CASE("bad_alloc") +{ + SECTION("bad_alloc") + { + // create JSON type using the throwing allocator + using my_json = nlohmann::basic_json; + + // creating an object should throw + CHECK_THROWS_AS(my_json j(my_json::value_t::object), std::bad_alloc); + } +} From 6d8e00ade80b72ffbb849c363cb4bd0f37d0804d Mon Sep 17 00:00:00 2001 From: Niels Date: Sun, 8 May 2016 17:17:17 +0200 Subject: [PATCH 056/133] another try to remove a warning --- src/json.hpp | 2 +- src/json.hpp.re2c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/json.hpp b/src/json.hpp index 459f7f3df..bc6fd7098 100644 --- a/src/json.hpp +++ b/src/json.hpp @@ -5967,7 +5967,7 @@ class basic_json { return (v < 10) ? ('0' + static_cast(v)) - : ('a' + static_cast((v - 10) & 0xff)); + : ('a' + static_cast((v - 10) & 0x1f)); }; // print character c as \uxxxx diff --git a/src/json.hpp.re2c b/src/json.hpp.re2c index 685024a5f..793cc7380 100644 --- a/src/json.hpp.re2c +++ b/src/json.hpp.re2c @@ -5967,7 +5967,7 @@ class basic_json { return (v < 10) ? ('0' + static_cast(v)) - : ('a' + static_cast((v - 10) & 0xff)); + : ('a' + static_cast((v - 10) & 0x1f)); }; // print character c as \uxxxx From 9ecf83f630fc950f0e0b67bd99ecf68f2b8afa68 Mon Sep 17 00:00:00 2001 From: Niels Date: Sun, 8 May 2016 20:28:20 +0200 Subject: [PATCH 057/133] working on #235 --- doc/examples/push_back__initializer_list.cpp | 26 ++++++ doc/examples/push_back__initializer_list.link | 1 + .../push_back__initializer_list.output | 4 + src/json.hpp | 50 +++++++++++- src/json.hpp.re2c | 50 +++++++++++- test/unit.cpp | 81 +++++++++++++++++++ 6 files changed, 210 insertions(+), 2 deletions(-) create mode 100644 doc/examples/push_back__initializer_list.cpp create mode 100644 doc/examples/push_back__initializer_list.link create mode 100644 doc/examples/push_back__initializer_list.output diff --git a/doc/examples/push_back__initializer_list.cpp b/doc/examples/push_back__initializer_list.cpp new file mode 100644 index 000000000..9fe01ad79 --- /dev/null +++ b/doc/examples/push_back__initializer_list.cpp @@ -0,0 +1,26 @@ +#include + +using json = nlohmann::json; + +int main() +{ + // create JSON values + json object = {{"one", 1}, {"two", 2}}; + json null; + + // print values + std::cout << object << '\n'; + std::cout << null << '\n'; + + // add values: + object.push_back({"three", 3}); // object is extended + object += {"four", 4}; // object is extended + null.push_back({"five", 5}); // null is converted to array + + // print values + std::cout << object << '\n'; + std::cout << null << '\n'; + + // would throw: + //object.push_back({1, 2, 3}); +} diff --git a/doc/examples/push_back__initializer_list.link b/doc/examples/push_back__initializer_list.link new file mode 100644 index 000000000..2b5abaeda --- /dev/null +++ b/doc/examples/push_back__initializer_list.link @@ -0,0 +1 @@ +online \ No newline at end of file diff --git a/doc/examples/push_back__initializer_list.output b/doc/examples/push_back__initializer_list.output new file mode 100644 index 000000000..668eb25d7 --- /dev/null +++ b/doc/examples/push_back__initializer_list.output @@ -0,0 +1,4 @@ +{"one":1,"two":2} +null +{"four":4,"one":1,"three":3,"two":2} +[["five",5]] diff --git a/src/json.hpp b/src/json.hpp index 515365501..37080ebb7 100644 --- a/src/json.hpp +++ b/src/json.hpp @@ -4878,7 +4878,55 @@ class basic_json reference operator+=(const typename object_t::value_type& val) { push_back(val); - return operator[](val.first); + return *this; + } + + /*! + @brief add an object to an object + + This function allows to use `push_back` with an initializer list. In case + + 1. the current value is an object, + 2. the initializer list @a init contains only two elements, and + 3. the first element of @a init is a string, + + @a init is converted into an object element and added using + @ref push_back(const typename object_t::value_type&). Otherwise, @a init + is converted to a JSON value and added using @ref push_back(basic_json&&). + + @param init an initializer list + + @complexity Linear in the size of the initializer list @a init. + + @note This function is required to resolve an ambiguous overload error, + because pairs like `{"key", "value"}` can be both interpreted as + `object_t::value_type` or `std::initializer_list`, see + https://github.com/nlohmann/json/issues/235 for more information. + + @liveexample{The example shows how initializer lists are treated as + objects when possible.,push_back__initializer_list} + */ + void push_back(std::initializer_list init) + { + if (is_object() and init.size() == 2 and init.begin()->is_string()) + { + const string_t key = *init.begin(); + push_back(typename object_t::value_type(key, *(init.begin() + 1))); + } + else + { + push_back(basic_json(init)); + } + } + + /*! + @brief add an object to an object + @copydoc push_back(std::initializer_list) + */ + reference operator+=(std::initializer_list init) + { + push_back(init); + return *this; } /*! diff --git a/src/json.hpp.re2c b/src/json.hpp.re2c index c8b66e920..4321f0aa3 100644 --- a/src/json.hpp.re2c +++ b/src/json.hpp.re2c @@ -4878,7 +4878,55 @@ class basic_json reference operator+=(const typename object_t::value_type& val) { push_back(val); - return operator[](val.first); + return *this; + } + + /*! + @brief add an object to an object + + This function allows to use `push_back` with an initializer list. In case + + 1. the current value is an object, + 2. the initializer list @a init contains only two elements, and + 3. the first element of @a init is a string, + + @a init is converted into an object element and added using + @ref push_back(const typename object_t::value_type&). Otherwise, @a init + is converted to a JSON value and added using @ref push_back(basic_json&&). + + @param init an initializer list + + @complexity Linear in the size of the initializer list @a init. + + @note This function is required to resolve an ambiguous overload error, + because pairs like `{"key", "value"}` can be both interpreted as + `object_t::value_type` or `std::initializer_list`, see + https://github.com/nlohmann/json/issues/235 for more information. + + @liveexample{The example shows how initializer lists are treated as + objects when possible.,push_back__initializer_list} + */ + void push_back(std::initializer_list init) + { + if (is_object() and init.size() == 2 and init.begin()->is_string()) + { + const string_t key = *init.begin(); + push_back(typename object_t::value_type(key, *(init.begin() + 1))); + } + else + { + push_back(basic_json(init)); + } + } + + /*! + @brief add an object to an object + @copydoc push_back(std::initializer_list) + */ + reference operator+=(std::initializer_list init) + { + push_back(init); + return *this; } /*! diff --git a/test/unit.cpp b/test/unit.cpp index af52e1751..e42430c35 100644 --- a/test/unit.cpp +++ b/test/unit.cpp @@ -7920,6 +7920,42 @@ TEST_CASE("modifiers") "cannot use push_back() with number"); } } + + SECTION("with initializer_list") + { + SECTION("null") + { + json j; + j.push_back({"foo", "bar"}); + CHECK(j == json::array({{"foo", "bar"}})); + + json k; + k.push_back({1, 2, 3}); + CHECK(k == json::array({{1, 2, 3}})); + } + + SECTION("array") + { + json j = {1, 2, 3}; + j.push_back({"foo", "bar"}); + CHECK(j == json({1, 2, 3, {"foo", "bar"}})); + + json k = {1, 2, 3}; + k.push_back({1, 2, 3}); + CHECK(k == json({1, 2, 3, {1, 2, 3}})); + } + + SECTION("object") + { + json j = {{"key1", 1}}; + j.push_back({"key2", "bar"}); + CHECK(j == json({{"key1", 1}, {"key2", "bar"}})); + + json k = {{"key1", 1}}; + CHECK_THROWS_AS(k.push_back({1, 2, 3, 4}), std::domain_error); + CHECK_THROWS_WITH(k.push_back({1, 2, 3, 4}), "cannot use push_back() with object"); + } + } } SECTION("operator+=") @@ -8016,6 +8052,42 @@ TEST_CASE("modifiers") "cannot use push_back() with number"); } } + + SECTION("with initializer_list") + { + SECTION("null") + { + json j; + j += {"foo", "bar"}; + CHECK(j == json::array({{"foo", "bar"}})); + + json k; + k += {1, 2, 3}; + CHECK(k == json::array({{1, 2, 3}})); + } + + SECTION("array") + { + json j = {1, 2, 3}; + j += {"foo", "bar"}; + CHECK(j == json({1, 2, 3, {"foo", "bar"}})); + + json k = {1, 2, 3}; + k += {1, 2, 3}; + CHECK(k == json({1, 2, 3, {1, 2, 3}})); + } + + SECTION("object") + { + json j = {{"key1", 1}}; + j += {"key2", "bar"}; + CHECK(j == json({{"key1", 1}, {"key2", "bar"}})); + + json k = {{"key1", 1}}; + CHECK_THROWS_AS((k += {1, 2, 3, 4}), std::domain_error); + CHECK_THROWS_WITH((k += {1, 2, 3, 4}), "cannot use push_back() with object"); + } + } } SECTION("insert") @@ -13992,6 +14064,15 @@ TEST_CASE("regression tests") CHECK(dest == expected); } + + SECTION("issue ##235 - ambiguous overload for 'push_back' and 'operator+='") + { + json data = {{"key", "value"}}; + data.push_back({"key2", "value2"}); + data += {"key3", "value3"}; + + CHECK(data == json({{"key", "value"}, {"key2", "value2"}, {"key3", "value3"}})); + } } // special test case to check if memory is leaked if constructor throws From 6a98a6c964068f407e98970f886fe310eb89e8f2 Mon Sep 17 00:00:00 2001 From: Chris Kitching Date: Sun, 8 May 2016 16:30:24 +0100 Subject: [PATCH 058/133] Add CMake option to disable building the tests (Default builds) --- CMakeLists.txt | 24 +++++++++++++++--------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 4ae1d8bb5..05eda6472 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -3,6 +3,8 @@ cmake_minimum_required(VERSION 3.0) # define the project project(json VERSION 2.0.0 LANGUAGES CXX) +option(BuildTests "Build the unit tests" ON) + # define project variables set(JSON_TARGET_NAME ${PROJECT_NAME}) set(JSON_UNITTEST_TARGET_NAME "json_unit") @@ -20,15 +22,19 @@ target_include_directories(${JSON_TARGET_NAME} INTERFACE $) # create and configure the unit test target -add_executable(${JSON_UNITTEST_TARGET_NAME} - "test/catch.hpp" "test/unit.cpp") -set_target_properties(${JSON_UNITTEST_TARGET_NAME} PROPERTIES - CXX_STANDARD 11 - CXX_STANDARD_REQUIRED ON - COMPILE_DEFINITIONS "$<$:_SCL_SECURE_NO_WARNINGS>" - COMPILE_OPTIONS "$<$:/EHsc;$<$:/Od>>") -target_include_directories(${JSON_UNITTEST_TARGET_NAME} PRIVATE "test") -target_link_libraries(${JSON_UNITTEST_TARGET_NAME} ${JSON_TARGET_NAME}) +if (BuildTests) + add_executable(${JSON_UNITTEST_TARGET_NAME} + "test/catch.hpp" + "test/unit.cpp" + ) + set_target_properties(${JSON_UNITTEST_TARGET_NAME} PROPERTIES + CXX_STANDARD 11 + CXX_STANDARD_REQUIRED ON + COMPILE_DEFINITIONS "$<$:_SCL_SECURE_NO_WARNINGS>" + COMPILE_OPTIONS "$<$:/EHsc;$<$:/Od>>") + target_include_directories(${JSON_UNITTEST_TARGET_NAME} PRIVATE "test") + target_link_libraries(${JSON_UNITTEST_TARGET_NAME} ${JSON_TARGET_NAME}) +endif() # generate a config and config version file for the package include(CMakePackageConfigHelpers) From bf7b6d15c771cd9dedc1ddce2dbc9676d14d85e8 Mon Sep 17 00:00:00 2001 From: Chris Kitching Date: Wed, 11 May 2016 01:10:29 +0100 Subject: [PATCH 059/133] Unset execute bit on sample.json --- test/json_testsuite/sample.json | 0 1 file changed, 0 insertions(+), 0 deletions(-) mode change 100755 => 100644 test/json_testsuite/sample.json diff --git a/test/json_testsuite/sample.json b/test/json_testsuite/sample.json old mode 100755 new mode 100644 From b6becce8fb29f9f3d21dd2edc6c0f21474b619bd Mon Sep 17 00:00:00 2001 From: Chris Kitching Date: Wed, 11 May 2016 01:12:56 +0100 Subject: [PATCH 060/133] Don't use variable for the test target name I'm not sure that using a variable for target names really helps with clarity. Unlike paths, target names aren't really something you change. In a sense, targets are themselves a sort of variable, so having a variable to name a variable seems just a bit gnarly. --- CMakeLists.txt | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 05eda6472..b51f83ab7 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -7,7 +7,6 @@ option(BuildTests "Build the unit tests" ON) # define project variables set(JSON_TARGET_NAME ${PROJECT_NAME}) -set(JSON_UNITTEST_TARGET_NAME "json_unit") set(JSON_PACKAGE_NAME ${JSON_TARGET_NAME}) set(JSON_TARGETS_FILENAME "${JSON_PACKAGE_NAME}Targets.cmake") set(JSON_CONFIG_FILENAME "${JSON_PACKAGE_NAME}Config.cmake") @@ -23,17 +22,17 @@ target_include_directories(${JSON_TARGET_NAME} INTERFACE # create and configure the unit test target if (BuildTests) - add_executable(${JSON_UNITTEST_TARGET_NAME} + add_executable(json_unit "test/catch.hpp" "test/unit.cpp" ) - set_target_properties(${JSON_UNITTEST_TARGET_NAME} PROPERTIES + set_target_properties(json_unit PROPERTIES CXX_STANDARD 11 CXX_STANDARD_REQUIRED ON COMPILE_DEFINITIONS "$<$:_SCL_SECURE_NO_WARNINGS>" COMPILE_OPTIONS "$<$:/EHsc;$<$:/Od>>") - target_include_directories(${JSON_UNITTEST_TARGET_NAME} PRIVATE "test") - target_link_libraries(${JSON_UNITTEST_TARGET_NAME} ${JSON_TARGET_NAME}) + target_include_directories(json_unit PRIVATE "test") + target_link_libraries(json_unit ${JSON_TARGET_NAME}) endif() # generate a config and config version file for the package From 4e6aacda3625a0212edef4b8eb7e3bbdb8989775 Mon Sep 17 00:00:00 2001 From: Chris Kitching Date: Wed, 11 May 2016 01:14:56 +0100 Subject: [PATCH 061/133] Use definitely-unique target/project name There exist lots of json libraries, and project/target names must be globally unique. If someone integrated with this library in a particularly stupid way, using a generic name like "json" might cause a problem. --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index b51f83ab7..caa4a0ee4 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,7 +1,7 @@ cmake_minimum_required(VERSION 3.0) # define the project -project(json VERSION 2.0.0 LANGUAGES CXX) +project(nlohmann_json VERSION 2.0.0 LANGUAGES CXX) option(BuildTests "Build the unit tests" ON) From af76508fe773dba22047d4bc6a31464a00afbb58 Mon Sep 17 00:00:00 2001 From: Chris Kitching Date: Wed, 11 May 2016 01:25:54 +0100 Subject: [PATCH 062/133] Introduce structure to the test/ directory This introduces a clear separation between test data and test binaries. Test data is moved into test/data, and the test binaries move into test/src. A new CMake script specific to building the tests is introduced in /test to slightly clean up the toplevel one. As well as tidying things up, this makes the next step trivial... --- .github/CONTRIBUTING.md | 2 +- .github/PULL_REQUEST_TEMPLATE.md | 2 +- .travis.yml | 2 +- CMakeLists.txt | 12 +- Makefile | 10 +- README.md | 2 +- test/CMakeLists.txt | 15 ++ test/{ => data}/json.org/1.json | 0 test/{ => data}/json.org/2.json | 0 test/{ => data}/json.org/3.json | 0 test/{ => data}/json.org/4.json | 0 test/{ => data}/json.org/5.json | 0 .../json_nlohmann_tests/all_unicode.json | 0 test/{ => data}/json_nlohmann_tests/bom.json | 0 .../json_roundtrip/roundtrip01.json | 0 .../json_roundtrip/roundtrip02.json | 0 .../json_roundtrip/roundtrip03.json | 0 .../json_roundtrip/roundtrip04.json | 0 .../json_roundtrip/roundtrip05.json | 0 .../json_roundtrip/roundtrip06.json | 0 .../json_roundtrip/roundtrip07.json | 0 .../json_roundtrip/roundtrip08.json | 0 .../json_roundtrip/roundtrip09.json | 0 .../json_roundtrip/roundtrip10.json | 0 .../json_roundtrip/roundtrip11.json | 0 .../json_roundtrip/roundtrip12.json | 0 .../json_roundtrip/roundtrip13.json | 0 .../json_roundtrip/roundtrip14.json | 0 .../json_roundtrip/roundtrip15.json | 0 .../json_roundtrip/roundtrip16.json | 0 .../json_roundtrip/roundtrip17.json | 0 .../json_roundtrip/roundtrip18.json | 0 .../json_roundtrip/roundtrip19.json | 0 .../json_roundtrip/roundtrip20.json | 0 .../json_roundtrip/roundtrip21.json | 0 .../json_roundtrip/roundtrip22.json | 0 .../json_roundtrip/roundtrip23.json | 0 .../json_roundtrip/roundtrip24.json | 0 .../json_roundtrip/roundtrip25.json | 0 .../json_roundtrip/roundtrip26.json | 0 .../json_roundtrip/roundtrip27.json | 0 .../json_roundtrip/roundtrip28.json | 0 .../json_roundtrip/roundtrip29.json | 0 .../json_roundtrip/roundtrip30.json | 0 .../json_roundtrip/roundtrip31.json | 0 .../json_roundtrip/roundtrip32.json | 0 test/{ => data}/json_tests/fail1.json | 0 test/{ => data}/json_tests/fail10.json | 0 test/{ => data}/json_tests/fail11.json | 0 test/{ => data}/json_tests/fail12.json | 0 test/{ => data}/json_tests/fail13.json | 0 test/{ => data}/json_tests/fail14.json | 0 test/{ => data}/json_tests/fail15.json | 0 test/{ => data}/json_tests/fail16.json | 0 test/{ => data}/json_tests/fail17.json | 0 test/{ => data}/json_tests/fail18.json | 0 test/{ => data}/json_tests/fail19.json | 0 test/{ => data}/json_tests/fail2.json | 0 test/{ => data}/json_tests/fail20.json | 0 test/{ => data}/json_tests/fail21.json | 0 test/{ => data}/json_tests/fail22.json | 0 test/{ => data}/json_tests/fail23.json | 0 test/{ => data}/json_tests/fail24.json | 0 test/{ => data}/json_tests/fail25.json | 0 test/{ => data}/json_tests/fail26.json | 0 test/{ => data}/json_tests/fail27.json | 0 test/{ => data}/json_tests/fail28.json | 0 test/{ => data}/json_tests/fail29.json | 0 test/{ => data}/json_tests/fail3.json | 0 test/{ => data}/json_tests/fail30.json | 0 test/{ => data}/json_tests/fail31.json | 0 test/{ => data}/json_tests/fail32.json | 0 test/{ => data}/json_tests/fail33.json | 0 test/{ => data}/json_tests/fail4.json | 0 test/{ => data}/json_tests/fail5.json | 0 test/{ => data}/json_tests/fail6.json | 0 test/{ => data}/json_tests/fail7.json | 0 test/{ => data}/json_tests/fail8.json | 0 test/{ => data}/json_tests/fail9.json | 0 test/{ => data}/json_tests/pass1.json | 0 test/{ => data}/json_tests/pass2.json | 0 test/{ => data}/json_tests/pass3.json | 0 test/{ => data}/json_testsuite/README.md | 0 test/{ => data}/json_testsuite/sample.json | 0 test/{ => src}/catch.hpp | 0 test/{ => src}/fuzz.cpp | 0 test/{ => src}/unit.cpp | 156 +++++++++--------- 87 files changed, 103 insertions(+), 98 deletions(-) create mode 100644 test/CMakeLists.txt rename test/{ => data}/json.org/1.json (100%) rename test/{ => data}/json.org/2.json (100%) rename test/{ => data}/json.org/3.json (100%) rename test/{ => data}/json.org/4.json (100%) rename test/{ => data}/json.org/5.json (100%) rename test/{ => data}/json_nlohmann_tests/all_unicode.json (100%) rename test/{ => data}/json_nlohmann_tests/bom.json (100%) rename test/{ => data}/json_roundtrip/roundtrip01.json (100%) rename test/{ => data}/json_roundtrip/roundtrip02.json (100%) rename test/{ => data}/json_roundtrip/roundtrip03.json (100%) rename test/{ => data}/json_roundtrip/roundtrip04.json (100%) rename test/{ => data}/json_roundtrip/roundtrip05.json (100%) rename test/{ => data}/json_roundtrip/roundtrip06.json (100%) rename test/{ => data}/json_roundtrip/roundtrip07.json (100%) rename test/{ => data}/json_roundtrip/roundtrip08.json (100%) rename test/{ => data}/json_roundtrip/roundtrip09.json (100%) rename test/{ => data}/json_roundtrip/roundtrip10.json (100%) rename test/{ => data}/json_roundtrip/roundtrip11.json (100%) rename test/{ => data}/json_roundtrip/roundtrip12.json (100%) rename test/{ => data}/json_roundtrip/roundtrip13.json (100%) rename test/{ => data}/json_roundtrip/roundtrip14.json (100%) rename test/{ => data}/json_roundtrip/roundtrip15.json (100%) rename test/{ => data}/json_roundtrip/roundtrip16.json (100%) rename test/{ => data}/json_roundtrip/roundtrip17.json (100%) rename test/{ => data}/json_roundtrip/roundtrip18.json (100%) rename test/{ => data}/json_roundtrip/roundtrip19.json (100%) rename test/{ => data}/json_roundtrip/roundtrip20.json (100%) rename test/{ => data}/json_roundtrip/roundtrip21.json (100%) rename test/{ => data}/json_roundtrip/roundtrip22.json (100%) rename test/{ => data}/json_roundtrip/roundtrip23.json (100%) rename test/{ => data}/json_roundtrip/roundtrip24.json (100%) rename test/{ => data}/json_roundtrip/roundtrip25.json (100%) rename test/{ => data}/json_roundtrip/roundtrip26.json (100%) rename test/{ => data}/json_roundtrip/roundtrip27.json (100%) rename test/{ => data}/json_roundtrip/roundtrip28.json (100%) rename test/{ => data}/json_roundtrip/roundtrip29.json (100%) rename test/{ => data}/json_roundtrip/roundtrip30.json (100%) rename test/{ => data}/json_roundtrip/roundtrip31.json (100%) rename test/{ => data}/json_roundtrip/roundtrip32.json (100%) rename test/{ => data}/json_tests/fail1.json (100%) rename test/{ => data}/json_tests/fail10.json (100%) rename test/{ => data}/json_tests/fail11.json (100%) rename test/{ => data}/json_tests/fail12.json (100%) rename test/{ => data}/json_tests/fail13.json (100%) rename test/{ => data}/json_tests/fail14.json (100%) rename test/{ => data}/json_tests/fail15.json (100%) rename test/{ => data}/json_tests/fail16.json (100%) rename test/{ => data}/json_tests/fail17.json (100%) rename test/{ => data}/json_tests/fail18.json (100%) rename test/{ => data}/json_tests/fail19.json (100%) rename test/{ => data}/json_tests/fail2.json (100%) rename test/{ => data}/json_tests/fail20.json (100%) rename test/{ => data}/json_tests/fail21.json (100%) rename test/{ => data}/json_tests/fail22.json (100%) rename test/{ => data}/json_tests/fail23.json (100%) rename test/{ => data}/json_tests/fail24.json (100%) rename test/{ => data}/json_tests/fail25.json (100%) rename test/{ => data}/json_tests/fail26.json (100%) rename test/{ => data}/json_tests/fail27.json (100%) rename test/{ => data}/json_tests/fail28.json (100%) rename test/{ => data}/json_tests/fail29.json (100%) rename test/{ => data}/json_tests/fail3.json (100%) rename test/{ => data}/json_tests/fail30.json (100%) rename test/{ => data}/json_tests/fail31.json (100%) rename test/{ => data}/json_tests/fail32.json (100%) rename test/{ => data}/json_tests/fail33.json (100%) rename test/{ => data}/json_tests/fail4.json (100%) rename test/{ => data}/json_tests/fail5.json (100%) rename test/{ => data}/json_tests/fail6.json (100%) rename test/{ => data}/json_tests/fail7.json (100%) rename test/{ => data}/json_tests/fail8.json (100%) rename test/{ => data}/json_tests/fail9.json (100%) rename test/{ => data}/json_tests/pass1.json (100%) rename test/{ => data}/json_tests/pass2.json (100%) rename test/{ => data}/json_tests/pass3.json (100%) rename test/{ => data}/json_testsuite/README.md (100%) rename test/{ => data}/json_testsuite/sample.json (100%) rename test/{ => src}/catch.hpp (100%) rename test/{ => src}/fuzz.cpp (100%) rename test/{ => src}/unit.cpp (99%) diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md index ea57e6505..eba242872 100644 --- a/.github/CONTRIBUTING.md +++ b/.github/CONTRIBUTING.md @@ -35,7 +35,7 @@ There are currently two files which need to be edited: To run [`re2c`](http://re2c.org) and generate/overwrite file `src/json.hpp` with your changes in file `src/json.hpp.re2c`. -2. [`test/unit.cpp`](https://github.com/nlohmann/json/blob/master/test/unit.cpp) - This contains the [Catch](https://github.com/philsquared/Catch) unit tests which currently cover [100 %](https://coveralls.io/github/nlohmann/json) of the library's code. +2. [`test/src/unit.cpp`](https://github.com/nlohmann/json/blob/master/test/unit.cpp) - This contains the [Catch](https://github.com/philsquared/Catch) unit tests which currently cover [100 %](https://coveralls.io/github/nlohmann/json) of the library's code. If you add or change a feature, please also add a unit test to this file. The unit tests can be compiled with diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index 27920581c..49d166595 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -14,7 +14,7 @@ There are currently two files which need to be edited: To run [`re2c`](http://re2c.org) and generate/overwrite file `src/json.hpp` with your changes in file `src/json.hpp.re2c`. -2. [`test/unit.cpp`](https://github.com/nlohmann/json/blob/master/test/unit.cpp) - This contains the [Catch](https://github.com/philsquared/Catch) unit tests which currently cover [100 %](https://coveralls.io/github/nlohmann/json) of the library's code. +2. [`test/src/unit.cpp`](https://github.com/nlohmann/json/blob/master/test/unit.cpp) - This contains the [Catch](https://github.com/philsquared/Catch) unit tests which currently cover [100 %](https://coveralls.io/github/nlohmann/json) of the library's code. If you add or change a feature, please also add a unit test to this file. The unit tests can be compiled with diff --git a/.travis.yml b/.travis.yml index d1748dff5..1ada0084c 100644 --- a/.travis.yml +++ b/.travis.yml @@ -19,7 +19,7 @@ matrix: - touch src/json.hpp - make json_unit CXXFLAGS="-fprofile-arcs -ftest-coverage -std=c++11 -lstdc++" CXX=$COMPILER - ./json_unit "*" - - coveralls --exclude test/catch.hpp --exclude test/unit.cpp --include src/json.hpp --gcov-options '\-lp' --gcov 'gcov-4.9' + - coveralls --exclude test/src/catch.hpp --exclude test/src/unit.cpp --include src/json.hpp --gcov-options '\-lp' --gcov 'gcov-4.9' env: COMPILER=g++-4.9 - os: linux diff --git a/CMakeLists.txt b/CMakeLists.txt index caa4a0ee4..18e9c651f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -22,17 +22,7 @@ target_include_directories(${JSON_TARGET_NAME} INTERFACE # create and configure the unit test target if (BuildTests) - add_executable(json_unit - "test/catch.hpp" - "test/unit.cpp" - ) - set_target_properties(json_unit PROPERTIES - CXX_STANDARD 11 - CXX_STANDARD_REQUIRED ON - COMPILE_DEFINITIONS "$<$:_SCL_SECURE_NO_WARNINGS>" - COMPILE_OPTIONS "$<$:/EHsc;$<$:/Od>>") - target_include_directories(json_unit PRIVATE "test") - target_link_libraries(json_unit ${JSON_TARGET_NAME}) + add_subdirectory(test) endif() # generate a config and config version file for the package diff --git a/Makefile b/Makefile index d0a80379c..6fdc06b9d 100644 --- a/Makefile +++ b/Makefile @@ -19,8 +19,8 @@ clean: # additional flags FLAGS = -Wall -Wextra -pedantic -Weffc++ -Wcast-align -Wcast-qual -Wctor-dtor-privacy -Wdisabled-optimization -Wformat=2 -Winit-self -Wmissing-declarations -Wmissing-include-dirs -Wold-style-cast -Woverloaded-virtual -Wredundant-decls -Wshadow -Wsign-conversion -Wsign-promo -Wstrict-overflow=5 -Wswitch -Wundef -Wno-unused -Wnon-virtual-dtor -Wreorder -Wdeprecated -Wfloat-equal -# build unit tests -json_unit: test/unit.cpp src/json.hpp test/catch.hpp +# build unit tests (TODO: Does this want its own makefile?) +json_unit: test/src/unit.cpp src/json.hpp test/src/catch.hpp $(CXX) -std=c++11 $(CXXFLAGS) $(FLAGS) $(CPPFLAGS) -I src -I test $< $(LDFLAGS) -o $@ @@ -43,11 +43,11 @@ fuzz_testing: mkdir -p fuzz-testing fuzz-testing/testcases fuzz-testing/out $(MAKE) fuzz CXX=afl-clang++ mv fuzz fuzz-testing - find test/json_tests -size -5k -name *json | xargs -I{} cp "{}" fuzz-testing/testcases + find test/data/json_tests -size -5k -name *json | xargs -I{} cp "{}" fuzz-testing/testcases @echo "Execute: afl-fuzz -i fuzz-testing/testcases -o fuzz-testing/out fuzz-testing/fuzz" # the fuzzer binary -fuzz: test/fuzz.cpp src/json.hpp +fuzz: test/src/fuzz.cpp src/json.hpp $(CXX) -std=c++11 $(CXXFLAGS) $(FLAGS) $(CPPFLAGS) -I src $< $(LDFLAGS) -o $@ @@ -75,7 +75,7 @@ pretty: --indent-col1-comments --pad-oper --pad-header --align-pointer=type \ --align-reference=type --add-brackets --convert-tabs --close-templates \ --lineend=linux --preserve-date --suffix=none --formatted \ - src/json.hpp src/json.hpp.re2c test/unit.cpp test/fuzz.cpp benchmarks/benchmarks.cpp doc/examples/*.cpp + src/json.hpp src/json.hpp.re2c test/src/unit.cpp test/src/fuzz.cpp benchmarks/benchmarks.cpp doc/examples/*.cpp ########################################################################## diff --git a/README.md b/README.md index c9f3a713a..46ede2495 100644 --- a/README.md +++ b/README.md @@ -17,7 +17,7 @@ There are myriads of [JSON](http://json.org) libraries out there, and each may e - **Trivial integration**. Our whole code consists of a single header file `json.hpp`. That's it. No library, no subproject, no dependencies, no complex build system. The class is written in vanilla C++11. All in all, everything should require no adjustment of your compiler flags or project settings. -- **Serious testing**. Our class is heavily [unit-tested](https://github.com/nlohmann/json/blob/master/test/unit.cpp) and covers [100%](https://coveralls.io/r/nlohmann/json) of the code, including all exceptional behavior. Furthermore, we checked with [Valgrind](http://valgrind.org) that there are no memory leaks. +- **Serious testing**. Our class is heavily [unit-tested](https://github.com/nlohmann/json/blob/master/test/src/unit.cpp) and covers [100%](https://coveralls.io/r/nlohmann/json) of the code, including all exceptional behavior. Furthermore, we checked with [Valgrind](http://valgrind.org) that there are no memory leaks. Other aspects were not so important to us: diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt new file mode 100644 index 000000000..0039fd84c --- /dev/null +++ b/test/CMakeLists.txt @@ -0,0 +1,15 @@ +# The unit test executable. +add_executable(json_unit + "src/catch.hpp" + "src/unit.cpp" +) + +set_target_properties(json_unit PROPERTIES + CXX_STANDARD 11 + CXX_STANDARD_REQUIRED ON + COMPILE_DEFINITIONS "$<$:_SCL_SECURE_NO_WARNINGS>" + COMPILE_OPTIONS "$<$:/EHsc;$<$:/Od>>" +) + +target_include_directories(json_unit PRIVATE "src") +target_link_libraries(json_unit ${JSON_TARGET_NAME}) diff --git a/test/json.org/1.json b/test/data/json.org/1.json similarity index 100% rename from test/json.org/1.json rename to test/data/json.org/1.json diff --git a/test/json.org/2.json b/test/data/json.org/2.json similarity index 100% rename from test/json.org/2.json rename to test/data/json.org/2.json diff --git a/test/json.org/3.json b/test/data/json.org/3.json similarity index 100% rename from test/json.org/3.json rename to test/data/json.org/3.json diff --git a/test/json.org/4.json b/test/data/json.org/4.json similarity index 100% rename from test/json.org/4.json rename to test/data/json.org/4.json diff --git a/test/json.org/5.json b/test/data/json.org/5.json similarity index 100% rename from test/json.org/5.json rename to test/data/json.org/5.json diff --git a/test/json_nlohmann_tests/all_unicode.json b/test/data/json_nlohmann_tests/all_unicode.json similarity index 100% rename from test/json_nlohmann_tests/all_unicode.json rename to test/data/json_nlohmann_tests/all_unicode.json diff --git a/test/json_nlohmann_tests/bom.json b/test/data/json_nlohmann_tests/bom.json similarity index 100% rename from test/json_nlohmann_tests/bom.json rename to test/data/json_nlohmann_tests/bom.json diff --git a/test/json_roundtrip/roundtrip01.json b/test/data/json_roundtrip/roundtrip01.json similarity index 100% rename from test/json_roundtrip/roundtrip01.json rename to test/data/json_roundtrip/roundtrip01.json diff --git a/test/json_roundtrip/roundtrip02.json b/test/data/json_roundtrip/roundtrip02.json similarity index 100% rename from test/json_roundtrip/roundtrip02.json rename to test/data/json_roundtrip/roundtrip02.json diff --git a/test/json_roundtrip/roundtrip03.json b/test/data/json_roundtrip/roundtrip03.json similarity index 100% rename from test/json_roundtrip/roundtrip03.json rename to test/data/json_roundtrip/roundtrip03.json diff --git a/test/json_roundtrip/roundtrip04.json b/test/data/json_roundtrip/roundtrip04.json similarity index 100% rename from test/json_roundtrip/roundtrip04.json rename to test/data/json_roundtrip/roundtrip04.json diff --git a/test/json_roundtrip/roundtrip05.json b/test/data/json_roundtrip/roundtrip05.json similarity index 100% rename from test/json_roundtrip/roundtrip05.json rename to test/data/json_roundtrip/roundtrip05.json diff --git a/test/json_roundtrip/roundtrip06.json b/test/data/json_roundtrip/roundtrip06.json similarity index 100% rename from test/json_roundtrip/roundtrip06.json rename to test/data/json_roundtrip/roundtrip06.json diff --git a/test/json_roundtrip/roundtrip07.json b/test/data/json_roundtrip/roundtrip07.json similarity index 100% rename from test/json_roundtrip/roundtrip07.json rename to test/data/json_roundtrip/roundtrip07.json diff --git a/test/json_roundtrip/roundtrip08.json b/test/data/json_roundtrip/roundtrip08.json similarity index 100% rename from test/json_roundtrip/roundtrip08.json rename to test/data/json_roundtrip/roundtrip08.json diff --git a/test/json_roundtrip/roundtrip09.json b/test/data/json_roundtrip/roundtrip09.json similarity index 100% rename from test/json_roundtrip/roundtrip09.json rename to test/data/json_roundtrip/roundtrip09.json diff --git a/test/json_roundtrip/roundtrip10.json b/test/data/json_roundtrip/roundtrip10.json similarity index 100% rename from test/json_roundtrip/roundtrip10.json rename to test/data/json_roundtrip/roundtrip10.json diff --git a/test/json_roundtrip/roundtrip11.json b/test/data/json_roundtrip/roundtrip11.json similarity index 100% rename from test/json_roundtrip/roundtrip11.json rename to test/data/json_roundtrip/roundtrip11.json diff --git a/test/json_roundtrip/roundtrip12.json b/test/data/json_roundtrip/roundtrip12.json similarity index 100% rename from test/json_roundtrip/roundtrip12.json rename to test/data/json_roundtrip/roundtrip12.json diff --git a/test/json_roundtrip/roundtrip13.json b/test/data/json_roundtrip/roundtrip13.json similarity index 100% rename from test/json_roundtrip/roundtrip13.json rename to test/data/json_roundtrip/roundtrip13.json diff --git a/test/json_roundtrip/roundtrip14.json b/test/data/json_roundtrip/roundtrip14.json similarity index 100% rename from test/json_roundtrip/roundtrip14.json rename to test/data/json_roundtrip/roundtrip14.json diff --git a/test/json_roundtrip/roundtrip15.json b/test/data/json_roundtrip/roundtrip15.json similarity index 100% rename from test/json_roundtrip/roundtrip15.json rename to test/data/json_roundtrip/roundtrip15.json diff --git a/test/json_roundtrip/roundtrip16.json b/test/data/json_roundtrip/roundtrip16.json similarity index 100% rename from test/json_roundtrip/roundtrip16.json rename to test/data/json_roundtrip/roundtrip16.json diff --git a/test/json_roundtrip/roundtrip17.json b/test/data/json_roundtrip/roundtrip17.json similarity index 100% rename from test/json_roundtrip/roundtrip17.json rename to test/data/json_roundtrip/roundtrip17.json diff --git a/test/json_roundtrip/roundtrip18.json b/test/data/json_roundtrip/roundtrip18.json similarity index 100% rename from test/json_roundtrip/roundtrip18.json rename to test/data/json_roundtrip/roundtrip18.json diff --git a/test/json_roundtrip/roundtrip19.json b/test/data/json_roundtrip/roundtrip19.json similarity index 100% rename from test/json_roundtrip/roundtrip19.json rename to test/data/json_roundtrip/roundtrip19.json diff --git a/test/json_roundtrip/roundtrip20.json b/test/data/json_roundtrip/roundtrip20.json similarity index 100% rename from test/json_roundtrip/roundtrip20.json rename to test/data/json_roundtrip/roundtrip20.json diff --git a/test/json_roundtrip/roundtrip21.json b/test/data/json_roundtrip/roundtrip21.json similarity index 100% rename from test/json_roundtrip/roundtrip21.json rename to test/data/json_roundtrip/roundtrip21.json diff --git a/test/json_roundtrip/roundtrip22.json b/test/data/json_roundtrip/roundtrip22.json similarity index 100% rename from test/json_roundtrip/roundtrip22.json rename to test/data/json_roundtrip/roundtrip22.json diff --git a/test/json_roundtrip/roundtrip23.json b/test/data/json_roundtrip/roundtrip23.json similarity index 100% rename from test/json_roundtrip/roundtrip23.json rename to test/data/json_roundtrip/roundtrip23.json diff --git a/test/json_roundtrip/roundtrip24.json b/test/data/json_roundtrip/roundtrip24.json similarity index 100% rename from test/json_roundtrip/roundtrip24.json rename to test/data/json_roundtrip/roundtrip24.json diff --git a/test/json_roundtrip/roundtrip25.json b/test/data/json_roundtrip/roundtrip25.json similarity index 100% rename from test/json_roundtrip/roundtrip25.json rename to test/data/json_roundtrip/roundtrip25.json diff --git a/test/json_roundtrip/roundtrip26.json b/test/data/json_roundtrip/roundtrip26.json similarity index 100% rename from test/json_roundtrip/roundtrip26.json rename to test/data/json_roundtrip/roundtrip26.json diff --git a/test/json_roundtrip/roundtrip27.json b/test/data/json_roundtrip/roundtrip27.json similarity index 100% rename from test/json_roundtrip/roundtrip27.json rename to test/data/json_roundtrip/roundtrip27.json diff --git a/test/json_roundtrip/roundtrip28.json b/test/data/json_roundtrip/roundtrip28.json similarity index 100% rename from test/json_roundtrip/roundtrip28.json rename to test/data/json_roundtrip/roundtrip28.json diff --git a/test/json_roundtrip/roundtrip29.json b/test/data/json_roundtrip/roundtrip29.json similarity index 100% rename from test/json_roundtrip/roundtrip29.json rename to test/data/json_roundtrip/roundtrip29.json diff --git a/test/json_roundtrip/roundtrip30.json b/test/data/json_roundtrip/roundtrip30.json similarity index 100% rename from test/json_roundtrip/roundtrip30.json rename to test/data/json_roundtrip/roundtrip30.json diff --git a/test/json_roundtrip/roundtrip31.json b/test/data/json_roundtrip/roundtrip31.json similarity index 100% rename from test/json_roundtrip/roundtrip31.json rename to test/data/json_roundtrip/roundtrip31.json diff --git a/test/json_roundtrip/roundtrip32.json b/test/data/json_roundtrip/roundtrip32.json similarity index 100% rename from test/json_roundtrip/roundtrip32.json rename to test/data/json_roundtrip/roundtrip32.json diff --git a/test/json_tests/fail1.json b/test/data/json_tests/fail1.json similarity index 100% rename from test/json_tests/fail1.json rename to test/data/json_tests/fail1.json diff --git a/test/json_tests/fail10.json b/test/data/json_tests/fail10.json similarity index 100% rename from test/json_tests/fail10.json rename to test/data/json_tests/fail10.json diff --git a/test/json_tests/fail11.json b/test/data/json_tests/fail11.json similarity index 100% rename from test/json_tests/fail11.json rename to test/data/json_tests/fail11.json diff --git a/test/json_tests/fail12.json b/test/data/json_tests/fail12.json similarity index 100% rename from test/json_tests/fail12.json rename to test/data/json_tests/fail12.json diff --git a/test/json_tests/fail13.json b/test/data/json_tests/fail13.json similarity index 100% rename from test/json_tests/fail13.json rename to test/data/json_tests/fail13.json diff --git a/test/json_tests/fail14.json b/test/data/json_tests/fail14.json similarity index 100% rename from test/json_tests/fail14.json rename to test/data/json_tests/fail14.json diff --git a/test/json_tests/fail15.json b/test/data/json_tests/fail15.json similarity index 100% rename from test/json_tests/fail15.json rename to test/data/json_tests/fail15.json diff --git a/test/json_tests/fail16.json b/test/data/json_tests/fail16.json similarity index 100% rename from test/json_tests/fail16.json rename to test/data/json_tests/fail16.json diff --git a/test/json_tests/fail17.json b/test/data/json_tests/fail17.json similarity index 100% rename from test/json_tests/fail17.json rename to test/data/json_tests/fail17.json diff --git a/test/json_tests/fail18.json b/test/data/json_tests/fail18.json similarity index 100% rename from test/json_tests/fail18.json rename to test/data/json_tests/fail18.json diff --git a/test/json_tests/fail19.json b/test/data/json_tests/fail19.json similarity index 100% rename from test/json_tests/fail19.json rename to test/data/json_tests/fail19.json diff --git a/test/json_tests/fail2.json b/test/data/json_tests/fail2.json similarity index 100% rename from test/json_tests/fail2.json rename to test/data/json_tests/fail2.json diff --git a/test/json_tests/fail20.json b/test/data/json_tests/fail20.json similarity index 100% rename from test/json_tests/fail20.json rename to test/data/json_tests/fail20.json diff --git a/test/json_tests/fail21.json b/test/data/json_tests/fail21.json similarity index 100% rename from test/json_tests/fail21.json rename to test/data/json_tests/fail21.json diff --git a/test/json_tests/fail22.json b/test/data/json_tests/fail22.json similarity index 100% rename from test/json_tests/fail22.json rename to test/data/json_tests/fail22.json diff --git a/test/json_tests/fail23.json b/test/data/json_tests/fail23.json similarity index 100% rename from test/json_tests/fail23.json rename to test/data/json_tests/fail23.json diff --git a/test/json_tests/fail24.json b/test/data/json_tests/fail24.json similarity index 100% rename from test/json_tests/fail24.json rename to test/data/json_tests/fail24.json diff --git a/test/json_tests/fail25.json b/test/data/json_tests/fail25.json similarity index 100% rename from test/json_tests/fail25.json rename to test/data/json_tests/fail25.json diff --git a/test/json_tests/fail26.json b/test/data/json_tests/fail26.json similarity index 100% rename from test/json_tests/fail26.json rename to test/data/json_tests/fail26.json diff --git a/test/json_tests/fail27.json b/test/data/json_tests/fail27.json similarity index 100% rename from test/json_tests/fail27.json rename to test/data/json_tests/fail27.json diff --git a/test/json_tests/fail28.json b/test/data/json_tests/fail28.json similarity index 100% rename from test/json_tests/fail28.json rename to test/data/json_tests/fail28.json diff --git a/test/json_tests/fail29.json b/test/data/json_tests/fail29.json similarity index 100% rename from test/json_tests/fail29.json rename to test/data/json_tests/fail29.json diff --git a/test/json_tests/fail3.json b/test/data/json_tests/fail3.json similarity index 100% rename from test/json_tests/fail3.json rename to test/data/json_tests/fail3.json diff --git a/test/json_tests/fail30.json b/test/data/json_tests/fail30.json similarity index 100% rename from test/json_tests/fail30.json rename to test/data/json_tests/fail30.json diff --git a/test/json_tests/fail31.json b/test/data/json_tests/fail31.json similarity index 100% rename from test/json_tests/fail31.json rename to test/data/json_tests/fail31.json diff --git a/test/json_tests/fail32.json b/test/data/json_tests/fail32.json similarity index 100% rename from test/json_tests/fail32.json rename to test/data/json_tests/fail32.json diff --git a/test/json_tests/fail33.json b/test/data/json_tests/fail33.json similarity index 100% rename from test/json_tests/fail33.json rename to test/data/json_tests/fail33.json diff --git a/test/json_tests/fail4.json b/test/data/json_tests/fail4.json similarity index 100% rename from test/json_tests/fail4.json rename to test/data/json_tests/fail4.json diff --git a/test/json_tests/fail5.json b/test/data/json_tests/fail5.json similarity index 100% rename from test/json_tests/fail5.json rename to test/data/json_tests/fail5.json diff --git a/test/json_tests/fail6.json b/test/data/json_tests/fail6.json similarity index 100% rename from test/json_tests/fail6.json rename to test/data/json_tests/fail6.json diff --git a/test/json_tests/fail7.json b/test/data/json_tests/fail7.json similarity index 100% rename from test/json_tests/fail7.json rename to test/data/json_tests/fail7.json diff --git a/test/json_tests/fail8.json b/test/data/json_tests/fail8.json similarity index 100% rename from test/json_tests/fail8.json rename to test/data/json_tests/fail8.json diff --git a/test/json_tests/fail9.json b/test/data/json_tests/fail9.json similarity index 100% rename from test/json_tests/fail9.json rename to test/data/json_tests/fail9.json diff --git a/test/json_tests/pass1.json b/test/data/json_tests/pass1.json similarity index 100% rename from test/json_tests/pass1.json rename to test/data/json_tests/pass1.json diff --git a/test/json_tests/pass2.json b/test/data/json_tests/pass2.json similarity index 100% rename from test/json_tests/pass2.json rename to test/data/json_tests/pass2.json diff --git a/test/json_tests/pass3.json b/test/data/json_tests/pass3.json similarity index 100% rename from test/json_tests/pass3.json rename to test/data/json_tests/pass3.json diff --git a/test/json_testsuite/README.md b/test/data/json_testsuite/README.md similarity index 100% rename from test/json_testsuite/README.md rename to test/data/json_testsuite/README.md diff --git a/test/json_testsuite/sample.json b/test/data/json_testsuite/sample.json similarity index 100% rename from test/json_testsuite/sample.json rename to test/data/json_testsuite/sample.json diff --git a/test/catch.hpp b/test/src/catch.hpp similarity index 100% rename from test/catch.hpp rename to test/src/catch.hpp diff --git a/test/fuzz.cpp b/test/src/fuzz.cpp similarity index 100% rename from test/fuzz.cpp rename to test/src/fuzz.cpp diff --git a/test/unit.cpp b/test/src/unit.cpp similarity index 99% rename from test/unit.cpp rename to test/src/unit.cpp index e42430c35..0a2bdd104 100644 --- a/test/unit.cpp +++ b/test/src/unit.cpp @@ -1314,7 +1314,7 @@ TEST_CASE("constructors") SECTION("std::ifstream") { - std::ifstream f("test/json_tests/pass1.json"); + std::ifstream f("test/data/json_tests/pass1.json"); json j(f); } } @@ -11652,39 +11652,39 @@ TEST_CASE("compliance tests from json.org") { for (auto filename : { - //"test/json_tests/fail1.json", - "test/json_tests/fail2.json", - "test/json_tests/fail3.json", - "test/json_tests/fail4.json", - "test/json_tests/fail5.json", - "test/json_tests/fail6.json", - "test/json_tests/fail7.json", - "test/json_tests/fail8.json", - "test/json_tests/fail9.json", - "test/json_tests/fail10.json", - "test/json_tests/fail11.json", - "test/json_tests/fail12.json", - "test/json_tests/fail13.json", - "test/json_tests/fail14.json", - "test/json_tests/fail15.json", - "test/json_tests/fail16.json", - "test/json_tests/fail17.json", - //"test/json_tests/fail18.json", - "test/json_tests/fail19.json", - "test/json_tests/fail20.json", - "test/json_tests/fail21.json", - "test/json_tests/fail22.json", - "test/json_tests/fail23.json", - "test/json_tests/fail24.json", - "test/json_tests/fail25.json", - "test/json_tests/fail26.json", - "test/json_tests/fail27.json", - "test/json_tests/fail28.json", - "test/json_tests/fail29.json", - "test/json_tests/fail30.json", - "test/json_tests/fail31.json", - "test/json_tests/fail32.json", - "test/json_tests/fail33.json" + //"test/data/json_tests/fail1.json", + "test/data/json_tests/fail2.json", + "test/data/json_tests/fail3.json", + "test/data/json_tests/fail4.json", + "test/data/json_tests/fail5.json", + "test/data/json_tests/fail6.json", + "test/data/json_tests/fail7.json", + "test/data/json_tests/fail8.json", + "test/data/json_tests/fail9.json", + "test/data/json_tests/fail10.json", + "test/data/json_tests/fail11.json", + "test/data/json_tests/fail12.json", + "test/data/json_tests/fail13.json", + "test/data/json_tests/fail14.json", + "test/data/json_tests/fail15.json", + "test/data/json_tests/fail16.json", + "test/data/json_tests/fail17.json", + //"test/data/json_tests/fail18.json", + "test/data/json_tests/fail19.json", + "test/data/json_tests/fail20.json", + "test/data/json_tests/fail21.json", + "test/data/json_tests/fail22.json", + "test/data/json_tests/fail23.json", + "test/data/json_tests/fail24.json", + "test/data/json_tests/fail25.json", + "test/data/json_tests/fail26.json", + "test/data/json_tests/fail27.json", + "test/data/json_tests/fail28.json", + "test/data/json_tests/fail29.json", + "test/data/json_tests/fail30.json", + "test/data/json_tests/fail31.json", + "test/data/json_tests/fail32.json", + "test/data/json_tests/fail33.json" }) { CAPTURE(filename); @@ -11698,9 +11698,9 @@ TEST_CASE("compliance tests from json.org") { for (auto filename : { - "test/json_tests/pass1.json", - "test/json_tests/pass2.json", - "test/json_tests/pass3.json" + "test/data/json_tests/pass1.json", + "test/data/json_tests/pass2.json", + "test/data/json_tests/pass3.json" }) { CAPTURE(filename); @@ -11873,42 +11873,42 @@ TEST_CASE("compliance tests from nativejson-benchmark") SECTION("roundtrip") { - // test cases are from https://github.com/miloyip/nativejson-benchmark/tree/master/data/roundtrip + // test cases are from https://github.com/miloyip/nativejson-benchmark/tree/master/test/data/roundtrip for (auto filename : { - "test/json_roundtrip/roundtrip01.json", - "test/json_roundtrip/roundtrip02.json", - "test/json_roundtrip/roundtrip03.json", - "test/json_roundtrip/roundtrip04.json", - "test/json_roundtrip/roundtrip05.json", - "test/json_roundtrip/roundtrip06.json", - "test/json_roundtrip/roundtrip07.json", - "test/json_roundtrip/roundtrip08.json", - "test/json_roundtrip/roundtrip09.json", - "test/json_roundtrip/roundtrip10.json", - "test/json_roundtrip/roundtrip11.json", - "test/json_roundtrip/roundtrip12.json", - "test/json_roundtrip/roundtrip13.json", - "test/json_roundtrip/roundtrip14.json", - "test/json_roundtrip/roundtrip15.json", - "test/json_roundtrip/roundtrip16.json", - "test/json_roundtrip/roundtrip17.json", - "test/json_roundtrip/roundtrip18.json", - "test/json_roundtrip/roundtrip19.json", - "test/json_roundtrip/roundtrip20.json", - "test/json_roundtrip/roundtrip21.json", - "test/json_roundtrip/roundtrip22.json", - "test/json_roundtrip/roundtrip23.json", - "test/json_roundtrip/roundtrip24.json", - "test/json_roundtrip/roundtrip25.json", - "test/json_roundtrip/roundtrip26.json", - "test/json_roundtrip/roundtrip27.json", - "test/json_roundtrip/roundtrip28.json", - "test/json_roundtrip/roundtrip29.json", - "test/json_roundtrip/roundtrip30.json", - "test/json_roundtrip/roundtrip31.json", - "test/json_roundtrip/roundtrip32.json" + "test/data/json_roundtrip/roundtrip01.json", + "test/data/json_roundtrip/roundtrip02.json", + "test/data/json_roundtrip/roundtrip03.json", + "test/data/json_roundtrip/roundtrip04.json", + "test/data/json_roundtrip/roundtrip05.json", + "test/data/json_roundtrip/roundtrip06.json", + "test/data/json_roundtrip/roundtrip07.json", + "test/data/json_roundtrip/roundtrip08.json", + "test/data/json_roundtrip/roundtrip09.json", + "test/data/json_roundtrip/roundtrip10.json", + "test/data/json_roundtrip/roundtrip11.json", + "test/data/json_roundtrip/roundtrip12.json", + "test/data/json_roundtrip/roundtrip13.json", + "test/data/json_roundtrip/roundtrip14.json", + "test/data/json_roundtrip/roundtrip15.json", + "test/data/json_roundtrip/roundtrip16.json", + "test/data/json_roundtrip/roundtrip17.json", + "test/data/json_roundtrip/roundtrip18.json", + "test/data/json_roundtrip/roundtrip19.json", + "test/data/json_roundtrip/roundtrip20.json", + "test/data/json_roundtrip/roundtrip21.json", + "test/data/json_roundtrip/roundtrip22.json", + "test/data/json_roundtrip/roundtrip23.json", + "test/data/json_roundtrip/roundtrip24.json", + "test/data/json_roundtrip/roundtrip25.json", + "test/data/json_roundtrip/roundtrip26.json", + "test/data/json_roundtrip/roundtrip27.json", + "test/data/json_roundtrip/roundtrip28.json", + "test/data/json_roundtrip/roundtrip29.json", + "test/data/json_roundtrip/roundtrip30.json", + "test/data/json_roundtrip/roundtrip31.json", + "test/data/json_roundtrip/roundtrip32.json" }) { CAPTURE(filename); @@ -11928,7 +11928,7 @@ TEST_CASE("test suite from json-test-suite") { // read a file with all unicode characters stored as single-character // strings in a JSON array - std::ifstream f("test/json_testsuite/sample.json"); + std::ifstream f("test/data/json_testsuite/sample.json"); json j; CHECK_NOTHROW(j << f); @@ -11943,35 +11943,35 @@ TEST_CASE("json.org examples") SECTION("1.json") { - std::ifstream f("test/json.org/1.json"); + std::ifstream f("test/data/json.org/1.json"); json j; CHECK_NOTHROW(j << f); } SECTION("2.json") { - std::ifstream f("test/json.org/2.json"); + std::ifstream f("test/data/json.org/2.json"); json j; CHECK_NOTHROW(j << f); } SECTION("3.json") { - std::ifstream f("test/json.org/3.json"); + std::ifstream f("test/data/json.org/3.json"); json j; CHECK_NOTHROW(j << f); } SECTION("4.json") { - std::ifstream f("test/json.org/4.json"); + std::ifstream f("test/data/json.org/4.json"); json j; CHECK_NOTHROW(j << f); } SECTION("5.json") { - std::ifstream f("test/json.org/5.json"); + std::ifstream f("test/data/json.org/5.json"); json j; CHECK_NOTHROW(j << f); } @@ -12105,7 +12105,7 @@ TEST_CASE("Unicode", "[hide]") { // read a file with all unicode characters stored as single-character // strings in a JSON array - std::ifstream f("test/json_nlohmann_tests/all_unicode.json"); + std::ifstream f("test/data/json_nlohmann_tests/all_unicode.json"); json j; CHECK_NOTHROW(j << f); @@ -12146,7 +12146,7 @@ TEST_CASE("Unicode", "[hide]") SECTION("ignore byte-order-mark") { // read a file with a UTF-8 BOM - std::ifstream f("test/json_nlohmann_tests/bom.json"); + std::ifstream f("test/data/json_nlohmann_tests/bom.json"); json j; CHECK_NOTHROW(j << f); } From 527a69bb64d2d03e385b02cfec72130e70f9b37f Mon Sep 17 00:00:00 2001 From: Chris Kitching Date: Wed, 11 May 2016 01:38:52 +0100 Subject: [PATCH 063/133] Install the test binary and test data. Fixes #241 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The resulting install tree, when tests are enabled, looks like this: ``` . ├── cmake │   ├── nlohmann_jsonConfig.cmake │   ├── nlohmann_jsonConfigVersion.cmake │   └── nlohmann_jsonTargets.cmake ├── include │   └── nlohmann │   └── json.hpp └── test ├── bin │   └── json_unit └── data ├── json_nlohmann_tests │   ├── all_unicode.json │   └── bom.json ├── json.org │   ├── 1.json │   ├── ... ├── json_roundtrip │   ├── roundtrip01.json │   ├── roundtrip02.json │   └── ... ├── json_tests │   ├── fail10.json │   └── ... └── json_testsuite └── sample.json ``` It has the property that you can invoke the test binary from the root of the install tree and the tests work correctly (you no longer depend on the test binary being run inside the source tree). If tests are disabled, the entire `test/` subtree is omitted. Notice how that yields exactly what you want for using this library in other projects. I do not believe I need to update travis due to this change, as the evil Makefile continues to do in-tree builds. I expect I'll find out soon enough. --- test/CMakeLists.txt | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index 0039fd84c..b63e5a394 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -11,5 +11,11 @@ set_target_properties(json_unit PROPERTIES COMPILE_OPTIONS "$<$:/EHsc;$<$:/Od>>" ) +# Install the test binary. +install(TARGETS json_unit RUNTIME DESTINATION test/bin) + +# Copy the test data to the install tree. +install(DIRECTORY data/ DESTINATION test/data) + target_include_directories(json_unit PRIVATE "src") target_link_libraries(json_unit ${JSON_TARGET_NAME}) From 0e2f0c4edce364ced6cd32d8fe72d5b4d9f0ef45 Mon Sep 17 00:00:00 2001 From: Chris Kitching Date: Wed, 11 May 2016 02:06:33 +0100 Subject: [PATCH 064/133] Repair appveyor... Horrifyingly It's sort of gnarly that it's still doing in-tree builds, but I really, _really_ don't want to get any more friendly with CMake's Visual Studio generator to work out how to make it stop doing it. In-tree builds still work, after all, and the goal of this work is to make out-of-tree builds work as well. Notional horrors like this will have to wait ;) --- appveyor.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/appveyor.yml b/appveyor.yml index aaf9c5f1a..63902ced4 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -7,5 +7,5 @@ build_script: - cmake . -G "Visual Studio 14 2015" - cmake --build . --config Release test_script: -- Release\json_unit.exe -- Release\json_unit.exe "*" +- test\Release\json_unit.exe +- test\Release\json_unit.exe "*" From f1e61896fb33391140fd7d5862fa08e2db852162 Mon Sep 17 00:00:00 2001 From: Niels Date: Wed, 11 May 2016 18:43:12 +0200 Subject: [PATCH 065/133] fixed a shadow error --- src/json.hpp | 6 +++--- src/json.hpp.re2c | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/json.hpp b/src/json.hpp index f62f3e783..4c47abc46 100644 --- a/src/json.hpp +++ b/src/json.hpp @@ -9659,7 +9659,7 @@ basic_json_parser_63: @since version 2.0.0 */ - basic_json patch(const basic_json& patch) const + basic_json patch(const basic_json& json_patch) const { // make a working copy to apply the patch to basic_json result = *this; @@ -9790,14 +9790,14 @@ basic_json_parser_63: }; // type check - if (not patch.is_array()) + if (not json_patch.is_array()) { // a JSON patch must be an array of objects throw std::invalid_argument("JSON patch must be an array of objects"); } // iterate and apply th eoperations - for (const auto& val : patch) + for (const auto& val : json_patch) { // wrapper to get a value for an operation const auto get_value = [&val](const std::string & op, diff --git a/src/json.hpp.re2c b/src/json.hpp.re2c index f3d3508cf..9703b4136 100644 --- a/src/json.hpp.re2c +++ b/src/json.hpp.re2c @@ -8969,7 +8969,7 @@ class basic_json @since version 2.0.0 */ - basic_json patch(const basic_json& patch) const + basic_json patch(const basic_json& json_patch) const { // make a working copy to apply the patch to basic_json result = *this; @@ -9100,14 +9100,14 @@ class basic_json }; // type check - if (not patch.is_array()) + if (not json_patch.is_array()) { // a JSON patch must be an array of objects throw std::invalid_argument("JSON patch must be an array of objects"); } // iterate and apply th eoperations - for (const auto& val : patch) + for (const auto& val : json_patch) { // wrapper to get a value for an operation const auto get_value = [&val](const std::string & op, From fb06356856daca9a912b17fd0aa0bf7bc736aaef Mon Sep 17 00:00:00 2001 From: Niels Date: Wed, 11 May 2016 20:58:11 +0200 Subject: [PATCH 066/133] thanks --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 46ede2495..0d2cbf45c 100644 --- a/README.md +++ b/README.md @@ -431,7 +431,8 @@ I deeply appreciate the help of the following people. - [Lv Zheng](https://github.com/lv-zheng) fixed a namespace issue with `int64_t` and `uint64_t`. - [abc100m](https://github.com/abc100m) analyzed the issues with GCC 4.8 and proposed a [partial solution](https://github.com/nlohmann/json/pull/212). - [zewt](https://github.com/zewt) added useful notes to the README file about Android. -- [Róbert Márki](https://github.com/robertmrk) added a fix to use move iterators and improved the integration via CMake . +- [Róbert Márki](https://github.com/robertmrk) added a fix to use move iterators and improved the integration via CMake. +- [Chris Kitching](https://github.com/ChrisKitching) cleaned up the CMake files. Thanks a lot for helping out! From 0e0ecb2c14ce6a997aed0c59f2967d161193296a Mon Sep 17 00:00:00 2001 From: Niels Date: Thu, 12 May 2016 00:32:18 +0200 Subject: [PATCH 067/133] fixed a warning and update ChangeLog --- ChangeLog.md | 4 ++++ src/json.hpp | 2 +- src/json.hpp.re2c | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/ChangeLog.md b/ChangeLog.md index 75827603f..f0654ea28 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -5,6 +5,7 @@ All notable changes to this project will be documented in this file. This projec [Full Changelog](https://github.com/nlohmann/json/compare/v1.1.0...HEAD) +- Unit test fails when doing a CMake out-of-tree build [\#241](https://github.com/nlohmann/json/issues/241) - Additional integration options [\#237](https://github.com/nlohmann/json/issues/237) - Can't use basic\_json::iterator as a base iterator for std::move\_iterator [\#233](https://github.com/nlohmann/json/issues/233) - Provide a FAQ [\#163](https://github.com/nlohmann/json/issues/163) @@ -13,6 +14,8 @@ All notable changes to this project will be documented in this file. This projec - Add support for afl-fuzz testing [\#207](https://github.com/nlohmann/json/pull/207) ([mykter](https://github.com/mykter)) - Issue \#178 - Extending support to full uint64\_t/int64\_t range and unsigned type \(updated\) [\#193](https://github.com/nlohmann/json/pull/193) ([twelsby](https://github.com/twelsby)) +- -Wconversion warnings [\#239](https://github.com/nlohmann/json/issues/239) +- ambiguous overload for 'push\_back' and 'operator+=' [\#235](https://github.com/nlohmann/json/issues/235) - double values are serialized with commas as decimal points [\#228](https://github.com/nlohmann/json/issues/228) - Move semantics with std::initializer\_list [\#225](https://github.com/nlohmann/json/issues/225) - abort during getline in yyfill [\#223](https://github.com/nlohmann/json/issues/223) @@ -28,6 +31,7 @@ All notable changes to this project will be documented in this file. This projec - Conflicting typedef of ssize\_t on Windows 32 bit when using Boost.Python [\#204](https://github.com/nlohmann/json/issues/204) - Integer conversion to unsigned [\#178](https://github.com/nlohmann/json/issues/178) +- Out of tree builds and a few other miscellaneous CMake cleanups. [\#242](https://github.com/nlohmann/json/pull/242) ([ChrisKitching](https://github.com/ChrisKitching)) - Implement additional integration options [\#238](https://github.com/nlohmann/json/pull/238) ([robertmrk](https://github.com/robertmrk)) - make serialization locale-independent [\#232](https://github.com/nlohmann/json/pull/232) ([nlohmann](https://github.com/nlohmann)) - fixes \#223 by updating README.md [\#227](https://github.com/nlohmann/json/pull/227) ([kevin--](https://github.com/kevin--)) diff --git a/src/json.hpp b/src/json.hpp index 4c47abc46..d06849ffc 100644 --- a/src/json.hpp +++ b/src/json.hpp @@ -9954,7 +9954,7 @@ basic_json_parser_63: */ static basic_json diff(const basic_json& source, const basic_json& target, - std::string path = "") noexcept + std::string path = "") { // the patch basic_json result(value_t::array); diff --git a/src/json.hpp.re2c b/src/json.hpp.re2c index 9703b4136..151e95aea 100644 --- a/src/json.hpp.re2c +++ b/src/json.hpp.re2c @@ -9264,7 +9264,7 @@ class basic_json */ static basic_json diff(const basic_json& source, const basic_json& target, - std::string path = "") noexcept + std::string path = "") { // the patch basic_json result(value_t::array); From 0a393b8374fa92ce17476d0bee2056fc6515805f Mon Sep 17 00:00:00 2001 From: Niels Date: Thu, 12 May 2016 07:34:36 +0200 Subject: [PATCH 068/133] indentation cleanup --- doc/examples/at_json_pointer.link | 2 +- doc/examples/at_json_pointer_const.link | 2 +- doc/examples/basic_json__istream.link | 2 +- doc/examples/flatten.link | 2 +- doc/examples/json_pointer.link | 2 +- doc/examples/operatorjson_pointer.link | 2 +- doc/examples/operatorjson_pointer_const.link | 2 +- doc/examples/unflatten.link | 2 +- src/json.hpp | 450 ++++++++++--------- src/json.hpp.re2c | 450 ++++++++++--------- 10 files changed, 464 insertions(+), 452 deletions(-) diff --git a/doc/examples/at_json_pointer.link b/doc/examples/at_json_pointer.link index 5356294e2..7a7efa268 100644 --- a/doc/examples/at_json_pointer.link +++ b/doc/examples/at_json_pointer.link @@ -1 +1 @@ -online \ No newline at end of file +online \ No newline at end of file diff --git a/doc/examples/at_json_pointer_const.link b/doc/examples/at_json_pointer_const.link index 905e60d34..9057e0b27 100644 --- a/doc/examples/at_json_pointer_const.link +++ b/doc/examples/at_json_pointer_const.link @@ -1 +1 @@ -online \ No newline at end of file +online \ No newline at end of file diff --git a/doc/examples/basic_json__istream.link b/doc/examples/basic_json__istream.link index e5475436d..20d1033c3 100644 --- a/doc/examples/basic_json__istream.link +++ b/doc/examples/basic_json__istream.link @@ -1 +1 @@ -online \ No newline at end of file +online \ No newline at end of file diff --git a/doc/examples/flatten.link b/doc/examples/flatten.link index 817d06277..50d3841f3 100644 --- a/doc/examples/flatten.link +++ b/doc/examples/flatten.link @@ -1 +1 @@ -online \ No newline at end of file +online \ No newline at end of file diff --git a/doc/examples/json_pointer.link b/doc/examples/json_pointer.link index c10c5fb9e..6602f0cf4 100644 --- a/doc/examples/json_pointer.link +++ b/doc/examples/json_pointer.link @@ -1 +1 @@ -online \ No newline at end of file +online \ No newline at end of file diff --git a/doc/examples/operatorjson_pointer.link b/doc/examples/operatorjson_pointer.link index 3cee69e78..3a60e8a65 100644 --- a/doc/examples/operatorjson_pointer.link +++ b/doc/examples/operatorjson_pointer.link @@ -1 +1 @@ -online \ No newline at end of file +online \ No newline at end of file diff --git a/doc/examples/operatorjson_pointer_const.link b/doc/examples/operatorjson_pointer_const.link index b13a9b19c..1bc14234d 100644 --- a/doc/examples/operatorjson_pointer_const.link +++ b/doc/examples/operatorjson_pointer_const.link @@ -1 +1 @@ -online \ No newline at end of file +online \ No newline at end of file diff --git a/doc/examples/unflatten.link b/doc/examples/unflatten.link index d564ab012..386f5e11f 100644 --- a/doc/examples/unflatten.link +++ b/doc/examples/unflatten.link @@ -1 +1 @@ -online \ No newline at end of file +online \ No newline at end of file diff --git a/src/json.hpp b/src/json.hpp index d06849ffc..436467632 100644 --- a/src/json.hpp +++ b/src/json.hpp @@ -271,8 +271,8 @@ class basic_json @tparam ObjectType the container to store objects (e.g., `std::map` or `std::unordered_map`) - @tparam StringType the type of the keys or names (e.g., `std::string`). The - comparison function `std::less` is used to order elements + @tparam StringType the type of the keys or names (e.g., `std::string`). + The comparison function `std::less` is used to order elements inside the container. @tparam AllocatorType the allocator to use for objects (e.g., `std::allocator`) @@ -280,8 +280,8 @@ class basic_json #### Default type With the default values for @a ObjectType (`std::map`), @a StringType - (`std::string`), and @a AllocatorType (`std::allocator`), the default value - for @a object_t is: + (`std::string`), and @a AllocatorType (`std::allocator`), the default + value for @a object_t is: @code {.cpp} std::map< @@ -298,16 +298,16 @@ class basic_json the default type, objects have the following behavior: - When all names are unique, objects will be interoperable in the sense - that all software implementations receiving that object will agree on the - name-value mappings. + that all software implementations receiving that object will agree on + the name-value mappings. - When the names within an object are not unique, later stored name/value pairs overwrite previously stored name/value pairs, leaving the used names unique. For instance, `{"key": 1}` and `{"key": 2, "key": 1}` will be treated as equal and both stored as `{"key": 1}`. - Internally, name/value pairs are stored in lexicographical order of the - names. Objects will also be serialized (see @ref dump) in this order. For - instance, `{"b": 1, "a": 2}` and `{"a": 2, "b": 1}` will be stored and - serialized as `{"a": 2, "b": 1}`. + names. Objects will also be serialized (see @ref dump) in this order. + For instance, `{"b": 1, "a": 2}` and `{"a": 2, "b": 1}` will be stored + and serialized as `{"a": 2, "b": 1}`. - When comparing objects, the order of the name/value pairs is irrelevant. This makes objects interoperable in the sense that they will not be affected by these differences. For instance, `{"b": 1, "a": 2}` and @@ -320,23 +320,24 @@ class basic_json In this class, the object's limit of nesting is not constraint explicitly. However, a maximum depth of nesting may be introduced by the compiler or - runtime environment. A theoretical limit can be queried by calling the @ref - max_size function of a JSON object. + runtime environment. A theoretical limit can be queried by calling the + @ref max_size function of a JSON object. #### Storage Objects are stored as pointers in a @ref basic_json type. That is, for any - access to object values, a pointer of type `object_t*` must be dereferenced. + access to object values, a pointer of type `object_t*` must be + dereferenced. @sa @ref array_t -- type for an array value @since version 1.0.0 - @note The order name/value pairs are added to the object is *not* preserved - by the library. Therefore, iterating an object may return name/value pairs - in a different order than they were originally stored. In fact, keys will - be traversed in alphabetical order as `std::map` with `std::less` is used - by default. Please note this behavior conforms to [RFC + @note The order name/value pairs are added to the object is *not* + preserved by the library. Therefore, iterating an object may return + name/value pairs in a different order than they were originally stored. In + fact, keys will be traversed in alphabetical order as `std::map` with + `std::less` is used by default. Please note this behavior conforms to [RFC 7159](http://rfc7159.net/rfc7159), because any order implements the specified "unordered" nature of JSON objects. */ @@ -378,8 +379,8 @@ class basic_json In this class, the array's limit of nesting is not constraint explicitly. However, a maximum depth of nesting may be introduced by the compiler or - runtime environment. A theoretical limit can be queried by calling the @ref - max_size function of a JSON array. + runtime environment. A theoretical limit can be queried by calling the + @ref max_size function of a JSON array. #### Storage @@ -399,8 +400,8 @@ class basic_json > A string is a sequence of zero or more Unicode characters. To store objects in C++, a type is defined by the template parameter - described below. Unicode values are split by the JSON class into byte-sized - characters during deserialization. + described below. Unicode values are split by the JSON class into + byte-sized characters during deserialization. @tparam StringType the container to store strings (e.g., `std::string`). Note this container is used for keys/names in objects, see @ref object_t. @@ -469,19 +470,19 @@ class basic_json @brief a type for a number (integer) [RFC 7159](http://rfc7159.net/rfc7159) describes numbers as follows: - > The representation of numbers is similar to that used in most programming - > languages. A number is represented in base 10 using decimal digits. It - > contains an integer component that may be prefixed with an optional minus - > sign, which may be followed by a fraction part and/or an exponent part. - > Leading zeros are not allowed. (...) Numeric values that cannot be - > represented in the grammar below (such as Infinity and NaN) are not - > permitted. + > The representation of numbers is similar to that used in most + > programming languages. A number is represented in base 10 using decimal + > digits. It contains an integer component that may be prefixed with an + > optional minus sign, which may be followed by a fraction part and/or an + > exponent part. Leading zeros are not allowed. (...) Numeric values that + > cannot be represented in the grammar below (such as Infinity and NaN) + > are not permitted. - This description includes both integer and floating-point numbers. However, - C++ allows more precise storage if it is known whether the number is a - signed integer, an unsigned integer or a floating-point number. Therefore, - three different types, @ref number_integer_t, @ref number_unsigned_t and - @ref number_float_t are used. + This description includes both integer and floating-point numbers. + However, C++ allows more precise storage if it is known whether the number + is a signed integer, an unsigned integer or a floating-point number. + Therefore, three different types, @ref number_integer_t, @ref + number_unsigned_t and @ref number_float_t are used. To store integer numbers in C++, a type is defined by the template parameter @a NumberIntegerType which chooses the type to use. @@ -500,8 +501,8 @@ class basic_json - The restrictions about leading zeros is not enforced in C++. Instead, leading zeros in integer literals lead to an interpretation as octal number. Internally, the value will be stored as decimal number. For - instance, the C++ integer literal `010` will be serialized to `8`. During - deserialization, leading zeros yield an error. + instance, the C++ integer literal `010` will be serialized to `8`. + During deserialization, leading zeros yield an error. - Not-a-number (NaN) values will be serialized to `null`. #### Limits @@ -512,9 +513,10 @@ class basic_json When the default type is used, the maximal integer number that can be stored is `9223372036854775807` (INT64_MAX) and the minimal integer number that can be stored is `-9223372036854775808` (INT64_MIN). Integer numbers - that are out of range will yield over/underflow when used in a constructor. - During deserialization, too large or small integer numbers will be - automatically be stored as @ref number_unsigned_t or @ref number_float_t. + that are out of range will yield over/underflow when used in a + constructor. During deserialization, too large or small integer numbers + will be automatically be stored as @ref number_unsigned_t or @ref + number_float_t. [RFC 7159](http://rfc7159.net/rfc7159) further states: > Note that when such software is used, numbers that are integers and are @@ -540,27 +542,27 @@ class basic_json @brief a type for a number (unsigned) [RFC 7159](http://rfc7159.net/rfc7159) describes numbers as follows: - > The representation of numbers is similar to that used in most programming - > languages. A number is represented in base 10 using decimal digits. It - > contains an integer component that may be prefixed with an optional minus - > sign, which may be followed by a fraction part and/or an exponent part. - > Leading zeros are not allowed. (...) Numeric values that cannot be - > represented in the grammar below (such as Infinity and NaN) are not - > permitted. + > The representation of numbers is similar to that used in most + > programming languages. A number is represented in base 10 using decimal + > digits. It contains an integer component that may be prefixed with an + > optional minus sign, which may be followed by a fraction part and/or an + > exponent part. Leading zeros are not allowed. (...) Numeric values that + > cannot be represented in the grammar below (such as Infinity and NaN) + > are not permitted. - This description includes both integer and floating-point numbers. However, - C++ allows more precise storage if it is known whether the number is a - signed integer, an unsigned integer or a floating-point number. Therefore, - three different types, @ref number_integer_t, @ref number_unsigned_t and - @ref number_float_t are used. + This description includes both integer and floating-point numbers. + However, C++ allows more precise storage if it is known whether the number + is a signed integer, an unsigned integer or a floating-point number. + Therefore, three different types, @ref number_integer_t, @ref + number_unsigned_t and @ref number_float_t are used. - To store unsigned integer numbers in C++, a type is defined by the template - parameter @a NumberUnsignedType which chooses the type to use. + To store unsigned integer numbers in C++, a type is defined by the + template parameter @a NumberUnsignedType which chooses the type to use. #### Default type - With the default values for @a NumberUnsignedType (`uint64_t`), the default - value for @a number_unsigned_t is: + With the default values for @a NumberUnsignedType (`uint64_t`), the + default value for @a number_unsigned_t is: @code {.cpp} uint64_t @@ -571,8 +573,8 @@ class basic_json - The restrictions about leading zeros is not enforced in C++. Instead, leading zeros in integer literals lead to an interpretation as octal number. Internally, the value will be stored as decimal number. For - instance, the C++ integer literal `010` will be serialized to `8`. During - deserialization, leading zeros yield an error. + instance, the C++ integer literal `010` will be serialized to `8`. + During deserialization, leading zeros yield an error. - Not-a-number (NaN) values will be serialized to `null`. #### Limits @@ -612,19 +614,19 @@ class basic_json @brief a type for a number (floating-point) [RFC 7159](http://rfc7159.net/rfc7159) describes numbers as follows: - > The representation of numbers is similar to that used in most programming - > languages. A number is represented in base 10 using decimal digits. It - > contains an integer component that may be prefixed with an optional minus - > sign, which may be followed by a fraction part and/or an exponent part. - > Leading zeros are not allowed. (...) Numeric values that cannot be - > represented in the grammar below (such as Infinity and NaN) are not - > permitted. + > The representation of numbers is similar to that used in most + > programming languages. A number is represented in base 10 using decimal + > digits. It contains an integer component that may be prefixed with an + > optional minus sign, which may be followed by a fraction part and/or an + > exponent part. Leading zeros are not allowed. (...) Numeric values that + > cannot be represented in the grammar below (such as Infinity and NaN) + > are not permitted. - This description includes both integer and floating-point numbers. However, - C++ allows more precise storage if it is known whether the number is a - signed integer, an unsigned integer or a floating-point number. Therefore, - three different types, @ref number_integer_t, @ref number_unsigned_t and - @ref number_float_t are used. + This description includes both integer and floating-point numbers. + However, C++ allows more precise storage if it is known whether the number + is a signed integer, an unsigned integer or a floating-point number. + Therefore, three different types, @ref number_integer_t, @ref + number_unsigned_t and @ref number_float_t are used. To store floating-point numbers in C++, a type is defined by the template parameter @a NumberFloatType which chooses the type to use. @@ -641,8 +643,8 @@ class basic_json #### Default behavior - The restrictions about leading zeros is not enforced in C++. Instead, - leading zeros in floating-point literals will be ignored. Internally, the - value will be stored as decimal number. For instance, the C++ + leading zeros in floating-point literals will be ignored. Internally, + the value will be stored as decimal number. For instance, the C++ floating-point literal `01.2` will be serialized to `1.2`. During deserialization, leading zeros yield an error. - Not-a-number (NaN) values will be serialized to `null`. @@ -653,9 +655,9 @@ class basic_json > This specification allows implementations to set limits on the range and > precision of numbers accepted. Since software that implements IEEE > 754-2008 binary64 (double precision) numbers is generally available and - > widely used, good interoperability can be achieved by implementations that - > expect no more precision or range than these provide, in the sense that - > implementations will approximate JSON numbers within the expected + > widely used, good interoperability can be achieved by implementations + > that expect no more precision or range than these provide, in the sense + > that implementations will approximate JSON numbers within the expected > precision. This implementation does exactly follow this approach, as it uses double @@ -938,9 +940,9 @@ class basic_json influenced. When passed to @ref parse(std::istream&, parser_callback_t) or @ref parse(const string_t&, parser_callback_t), it is called on certain events (passed as @ref parse_event_t via parameter @a event) with a set - recursion depth @a depth and context JSON value @a parsed. The return value - of the callback function is a boolean indicating whether the element that - emitted the callback shall be kept or not. + recursion depth @a depth and context JSON value @a parsed. The return + value of the callback function is a boolean indicating whether the element + that emitted the callback shall be kept or not. We distinguish six scenarios (determined by the event type) in which the callback function can be called. The following table describes the values @@ -960,8 +962,8 @@ class basic_json - Discarded values in structured types are skipped. That is, the parser will behave as if the discarded value was never read. - - In case a value outside a structured type is skipped, it is replaced with - `null`. This case happens if the top-level element is skipped. + - In case a value outside a structured type is skipped, it is replaced + with `null`. This case happens if the top-level element is skipped. @param[in] depth the depth of the recursion during parsing @@ -1065,8 +1067,8 @@ class basic_json Create a `null` JSON value. This is the explicitly version of the `null` value constructor as it takes a null pointer as parameter. It allows to create `null` values by explicitly assigning a `nullptr` to a JSON value. - The passed null pointer itself is not read -- it is only used to choose the - right constructor. + The passed null pointer itself is not read -- it is only used to choose + the right constructor. @complexity Constant. @@ -1096,8 +1098,8 @@ class basic_json @throw std::bad_alloc if allocation for object value fails - @liveexample{The following code shows the constructor with an @ref object_t - parameter.,basic_json__object_t} + @liveexample{The following code shows the constructor with an @ref + object_t parameter.,basic_json__object_t} @sa @ref basic_json(const CompatibleObjectType&) -- create an object value from a compatible STL container @@ -1177,11 +1179,11 @@ class basic_json any type @a CompatibleArrayType that can be used to construct values of type @ref array_t. - @tparam CompatibleArrayType An object type whose `value_type` is compatible - to @ref array_t. Examples include `std::vector`, `std::deque`, `std::list`, - `std::forward_list`, `std::array`, `std::set`, `std::unordered_set`, - `std::multiset`, and `unordered_multiset` with a `value_type` from which a - @ref basic_json value can be constructed. + @tparam CompatibleArrayType An object type whose `value_type` is + compatible to @ref array_t. Examples include `std::vector`, `std::deque`, + `std::list`, `std::forward_list`, `std::array`, `std::set`, + `std::unordered_set`, `std::multiset`, and `unordered_multiset` with a + `value_type` from which a @ref basic_json value can be constructed. @param[in] val a value for the array @@ -1225,8 +1227,8 @@ class basic_json @throw std::bad_alloc if allocation for string value fails - @liveexample{The following code shows the constructor with an @ref string_t - parameter.,basic_json__string_t} + @liveexample{The following code shows the constructor with an @ref + string_t parameter.,basic_json__string_t} @sa @ref basic_json(const typename string_t::value_type*) -- create a string value from a character pointer @@ -1318,9 +1320,9 @@ class basic_json Create an integer number JSON value with a given content. @tparam T A helper type to remove this function via SFINAE in case @ref - number_integer_t is the same as `int`. In this case, this constructor would - have the same signature as @ref basic_json(const int value). Note the - helper type @a T is not visible in this constructor's interface. + number_integer_t is the same as `int`. In this case, this constructor + would have the same signature as @ref basic_json(const int value). Note + the helper type @a T is not visible in this constructor's interface. @param[in] val an integer to create a JSON number from @@ -1355,8 +1357,8 @@ class basic_json @note This constructor allows to pass enums directly to a constructor. As C++ has no way of specifying the type of an anonymous enum explicitly, we can only rely on the fact that such values implicitly convert to int. As - int may already be the same type of number_integer_t, we may need to switch - off the constructor @ref basic_json(const number_integer_t). + int may already be the same type of number_integer_t, we may need to + switch off the constructor @ref basic_json(const number_integer_t). @complexity Constant. @@ -1383,8 +1385,8 @@ class basic_json construct values of type @ref number_integer_t. @tparam CompatibleNumberIntegerType An integer type which is compatible to - @ref number_integer_t. Examples include the types `int`, `int32_t`, `long`, - and `short`. + @ref number_integer_t. Examples include the types `int`, `int32_t`, + `long`, and `short`. @param[in] val an integer to create a JSON number from @@ -1442,12 +1444,12 @@ class basic_json /*! @brief create an unsigned number (implicit) - Create an unsigned number JSON value with a given content. This constructor - allows any type @a CompatibleNumberUnsignedType that can be used to - construct values of type @ref number_unsigned_t. + Create an unsigned number JSON value with a given content. This + constructor allows any type @a CompatibleNumberUnsignedType that can be + used to construct values of type @ref number_unsigned_t. - @tparam CompatibleNumberUnsignedType An integer type which is compatible to - @ref number_unsigned_t. Examples may include the types `unsigned int`, + @tparam CompatibleNumberUnsignedType An integer type which is compatible + to @ref number_unsigned_t. Examples may include the types `unsigned int`, `uint32_t`, or `unsigned short`. @param[in] val an unsigned integer to create a JSON number from @@ -1480,8 +1482,8 @@ class basic_json @note [RFC 7159](http://www.rfc-editor.org/rfc/rfc7159.txt), section 6 disallows NaN values: - > Numeric values that cannot be represented in the grammar below (such - > as Infinity and NaN) are not permitted. + > Numeric values that cannot be represented in the grammar below (such as + > Infinity and NaN) are not permitted. In case the parameter @a val is not a number, a JSON null value is created instead. @@ -1513,15 +1515,16 @@ class basic_json constructor allows any type @a CompatibleNumberFloatType that can be used to construct values of type @ref number_float_t. - @tparam CompatibleNumberFloatType A floating-point type which is compatible - to @ref number_float_t. Examples may include the types `float` or `double`. + @tparam CompatibleNumberFloatType A floating-point type which is + compatible to @ref number_float_t. Examples may include the types `float` + or `double`. @param[in] val a floating-point to create a JSON number from @note [RFC 7159](http://www.rfc-editor.org/rfc/rfc7159.txt), section 6 disallows NaN values: - > Numeric values that cannot be represented in the grammar below (such - > as Infinity and NaN) are not permitted. + > Numeric values that cannot be represented in the grammar below (such as + > Infinity and NaN) are not permitted. In case the parameter @a val is not a number, a JSON null value is created instead. @@ -1592,13 +1595,13 @@ class basic_json used by the functions @ref array(std::initializer_list) and @ref object(std::initializer_list). - @param[in] manual_type internal parameter; when @a type_deduction is set to - `false`, the created JSON value will use the provided type (only @ref + @param[in] manual_type internal parameter; when @a type_deduction is set + to `false`, the created JSON value will use the provided type (only @ref value_t::array and @ref value_t::object are valid); when @a type_deduction is set to `true`, this parameter has no effect - @throw std::domain_error if @a type_deduction is `false`, @a manual_type is - `value_t::object`, but @a init contains an element which is not a pair + @throw std::domain_error if @a type_deduction is `false`, @a manual_type + is `value_t::object`, but @a init contains an element which is not a pair whose first element is a string; example: `"cannot create object from initializer list"` @@ -1679,8 +1682,8 @@ class basic_json list of values `a, b, c`, creates the JSON value `[a, b, c]`. If the initializer list is empty, the empty array `[]` is created. - @note This function is only needed to express two edge cases that cannot be - realized with the initializer list constructor (@ref + @note This function is only needed to express two edge cases that cannot + be realized with the initializer list constructor (@ref basic_json(std::initializer_list, bool, value_t)). These cases are: 1. creating an array whose elements are all pairs whose first element is a @@ -1723,8 +1726,8 @@ class basic_json related function @ref array(std::initializer_list), there are no cases which can only be expressed by this function. That is, any initializer list @a init can also be passed to the initializer list - constructor - @ref basic_json(std::initializer_list, bool, value_t). + constructor @ref basic_json(std::initializer_list, bool, + value_t). @param[in] init initializer list to create an object from (optional) @@ -1755,8 +1758,8 @@ class basic_json /*! @brief construct an array with count copies of given value - Constructs a JSON array value by creating @a cnt copies of a passed - value. In case @a cnt is `0`, an empty array is created. As postcondition, + Constructs a JSON array value by creating @a cnt copies of a passed value. + In case @a cnt is `0`, an empty array is created. As postcondition, `std::distance(begin(),end()) == cnt` holds. @param[in] cnt the number of JSON copies of @a val to create @@ -1784,8 +1787,8 @@ class basic_json - In case of primitive types (number, boolean, or string), @a first must be `begin()` and @a last must be `end()`. In this case, the value is copied. Otherwise, std::out_of_range is thrown. - - In case of structured types (array, object), the constructor behaves - as similar versions for `std::vector`. + - In case of structured types (array, object), the constructor behaves as + similar versions for `std::vector`. - In case of a null type, std::domain_error is thrown. @tparam InputIT an input iterator type (@ref iterator or @ref @@ -1800,8 +1803,8 @@ class basic_json boolean, or string) where an out of range error can be detected easily; example: `"iterators out of range"` @throw std::bad_alloc if allocation for object, array, or string fails - @throw std::domain_error if called with a null value; example: `"cannot use - construct with iterators from null"` + @throw std::domain_error if called with a null value; example: `"cannot + use construct with iterators from null"` @complexity Linear in distance between @a first and @a last. @@ -2042,8 +2045,8 @@ class basic_json @brief copy assignment Copy assignment operator. Copies a JSON value via the "copy and swap" - strategy: It is expressed in terms of the copy constructor, destructor, and - the swap() member function. + strategy: It is expressed in terms of the copy constructor, destructor, + and the swap() member function. @param[in] other value to copy from @@ -2143,8 +2146,8 @@ class basic_json parameter. @param[in] indent if indent is nonnegative, then array elements and object - members will be pretty-printed with that indent level. An indent level of 0 - will only insert newlines. -1 (the default) selects the most compact + members will be pretty-printed with that indent level. An indent level of + 0 will only insert newlines. -1 (the default) selects the most compact representation @return string containing the serialization of the JSON value @@ -2976,8 +2979,8 @@ class basic_json /*! @brief get a reference value (implicit) - Implict reference access to the internally stored JSON value. No copies are - made. + Implict reference access to the internally stored JSON value. No copies + are made. @warning Writing data to the referee of the result yields an undefined state. @@ -3027,14 +3030,14 @@ class basic_json /*! @brief get a value (implicit) - Implicit type conversion between the JSON value and a compatible value. The - call is realized by calling @ref get() const. + Implicit type conversion between the JSON value and a compatible value. + The call is realized by calling @ref get() const. @tparam ValueType non-pointer type compatible to the JSON value, for instance `int` for JSON integer numbers, `bool` for JSON booleans, or - `std::vector` types for JSON arrays. The character type of @ref string_t as - well as an initializer list of this type is excluded to avoid ambiguities - as these types implicitly convert to `std::string`. + `std::vector` types for JSON arrays. The character type of @ref string_t + as well as an initializer list of this type is excluded to avoid + ambiguities as these types implicitly convert to `std::string`. @return copy of the JSON value, converted to type @a ValueType @@ -3123,8 +3126,8 @@ class basic_json /*! @brief access specified array element with bounds checking - Returns a const reference to the element at specified location @a idx, with - bounds checking. + Returns a const reference to the element at specified location @a idx, + with bounds checking. @param[in] idx index of the element to access @@ -3215,8 +3218,8 @@ class basic_json /*! @brief access specified object element with bounds checking - Returns a const reference to the element at with specified key @a key, with - bounds checking. + Returns a const reference to the element at with specified key @a key, + with bounds checking. @param[in] key key of the element to access @@ -3690,8 +3693,8 @@ class basic_json @complexity Constant. - @pre The JSON value must not be `null` (would throw `std::out_of_range`) or - an empty array or object (undefined behavior, guarded by assertions). + @pre The JSON value must not be `null` (would throw `std::out_of_range`) + or an empty array or object (undefined behavior, guarded by assertions). @post The JSON value remains unchanged. @throw std::out_of_range when called on `null` value @@ -3732,8 +3735,8 @@ class basic_json @complexity Constant. - @pre The JSON value must not be `null` (would throw `std::out_of_range`) or - an empty array or object (undefined behavior, guarded by assertions). + @pre The JSON value must not be `null` (would throw `std::out_of_range`) + or an empty array or object (undefined behavior, guarded by assertions). @post The JSON value remains unchanged. @throw std::out_of_range when called on `null` value. @@ -3772,16 +3775,16 @@ class basic_json will be `null`. @param[in] pos iterator to the element to remove - @return Iterator following the last removed element. If the iterator @a pos - refers to the last element, the `end()` iterator is returned. + @return Iterator following the last removed element. If the iterator @a + pos refers to the last element, the `end()` iterator is returned. @tparam InteratorType an @ref iterator or @ref const_iterator @post Invalidates iterators and references at or after the point of the erase, including the `end()` iterator. - @throw std::domain_error if called on a `null` value; example: `"cannot use - erase() with null"` + @throw std::domain_error if called on a `null` value; example: `"cannot + use erase() with null"` @throw std::domain_error if called on an iterator which does not belong to the current JSON value; example: `"iterator does not fit current value"` @throw std::out_of_range if called on a primitive type with invalid @@ -3797,12 +3800,12 @@ class basic_json @liveexample{The example shows the result of `erase()` for different JSON types.,erase__IteratorType} - @sa @ref erase(InteratorType, InteratorType) -- removes the elements in the - given range + @sa @ref erase(InteratorType, InteratorType) -- removes the elements in + the given range @sa @ref erase(const typename object_t::key_type&) -- removes the element from an object at the given key - @sa @ref erase(const size_type) -- removes the element from an array at the - given index + @sa @ref erase(const size_type) -- removes the element from an array at + the given index @since version 1.0.0 */ @@ -3871,9 +3874,9 @@ class basic_json /*! @brief remove elements given an iterator range - Removes the element specified by the range `[first; last)`. The iterator @a - first does not need to be dereferenceable if `first == last`: erasing an - empty range is a no-op. + Removes the element specified by the range `[first; last)`. The iterator + @a first does not need to be dereferenceable if `first == last`: erasing + an empty range is a no-op. If called on a primitive type other than `null`, the resulting JSON value will be `null`. @@ -3888,8 +3891,8 @@ class basic_json @post Invalidates iterators and references at or after the point of the erase, including the `end()` iterator. - @throw std::domain_error if called on a `null` value; example: `"cannot use - erase() with null"` + @throw std::domain_error if called on a `null` value; example: `"cannot + use erase() with null"` @throw std::domain_error if called on iterators which does not belong to the current JSON value; example: `"iterators do not fit current value"` @throw std::out_of_range if called on a primitive type with invalid @@ -3909,8 +3912,8 @@ class basic_json @sa @ref erase(InteratorType) -- removes the element at a given position @sa @ref erase(const typename object_t::key_type&) -- removes the element from an object at the given key - @sa @ref erase(const size_type) -- removes the element from an array at the - given index + @sa @ref erase(const size_type) -- removes the element from an array at + the given index @since version 1.0.0 */ @@ -3986,8 +3989,8 @@ class basic_json @param[in] key value of the elements to remove @return Number of elements removed. If @a ObjectType is the default - `std::map` type, the return value will always be `0` (@a key was not found) - or `1` (@a key was found). + `std::map` type, the return value will always be `0` (@a key was not + found) or `1` (@a key was found). @post References and iterators to the erased elements are invalidated. Other references and iterators are not affected. @@ -4000,10 +4003,10 @@ class basic_json @liveexample{The example shows the effect of `erase()`.,erase__key_type} @sa @ref erase(InteratorType) -- removes the element at a given position - @sa @ref erase(InteratorType, InteratorType) -- removes the elements in the - given range - @sa @ref erase(const size_type) -- removes the element from an array at the - given index + @sa @ref erase(InteratorType, InteratorType) -- removes the elements in + the given range + @sa @ref erase(const size_type) -- removes the element from an array at + the given index @since version 1.0.0 */ @@ -4038,8 +4041,8 @@ class basic_json @liveexample{The example shows the effect of `erase()`.,erase__size_type} @sa @ref erase(InteratorType) -- removes the element at a given position - @sa @ref erase(InteratorType, InteratorType) -- removes the elements in the - given range + @sa @ref erase(InteratorType, InteratorType) -- removes the elements in + the given range @sa @ref erase(const typename object_t::key_type&) -- removes the element from an object at the given key @@ -4078,7 +4081,8 @@ class basic_json @brief find an element in a JSON object Finds an element in a JSON object with key equivalent to @a key. If the - element is not found or the JSON value is not an object, end() is returned. + element is not found or the JSON value is not an object, end() is + returned. @param[in] key key value of the element to search for @@ -4438,9 +4442,9 @@ class basic_json @brief wrapper to access iterator member functions in range-based for This function allows to access @ref iterator::key() and @ref - iterator::value() during range-based for loops. In these loops, a reference - to the JSON values is returned, so there is no access to the underlying - iterator. + iterator::value() during range-based for loops. In these loops, a + reference to the JSON values is returned, so there is no access to the + underlying iterator. @note The name of this function is not yet final and may change in the future. @@ -4484,8 +4488,8 @@ class basic_json object | result of function `object_t::empty()` array | result of function `array_t::empty()` - @complexity Constant, as long as @ref array_t and @ref object_t satisfy the - Container concept; that is, their `empty()` functions have constant + @complexity Constant, as long as @ref array_t and @ref object_t satisfy + the Container concept; that is, their `empty()` functions have constant complexity. @requirement This function helps `basic_json` satisfying the @@ -4547,8 +4551,9 @@ class basic_json object | result of function object_t::size() array | result of function array_t::size() - @complexity Constant, as long as @ref array_t and @ref object_t satisfy the - Container concept; that is, their size() functions have constant complexity. + @complexity Constant, as long as @ref array_t and @ref object_t satisfy + the Container concept; that is, their size() functions have constant + complexity. @requirement This function helps `basic_json` satisfying the [Container](http://en.cppreference.com/w/cpp/concept/Container) @@ -4612,8 +4617,8 @@ class basic_json object | result of function `object_t::max_size()` array | result of function `array_t::max_size()` - @complexity Constant, as long as @ref array_t and @ref object_t satisfy the - Container concept; that is, their `max_size()` functions have constant + @complexity Constant, as long as @ref array_t and @ref object_t satisfy + the Container concept; that is, their `max_size()` functions have constant complexity. @requirement This function helps `basic_json` satisfying the @@ -4835,8 +4840,8 @@ class basic_json @brief add an object to an object Inserts the given element @a val to the JSON object. If the function is - called on a JSON null value, an empty object is created before inserting @a - val. + called on a JSON null value, an empty object is created before inserting + @a val. @param[in] val the value to add to the JSON object @@ -5111,8 +5116,8 @@ class basic_json @return iterator pointing to the first element inserted, or @a pos if `ilist` is empty - @complexity Linear in `ilist.size()` plus linear in the distance between @a - pos and end of the container. + @complexity Linear in `ilist.size()` plus linear in the distance between + @a pos and end of the container. @liveexample{The example shows how `insert()` is used.,insert__ilist} @@ -5757,8 +5762,8 @@ class basic_json @note A UTF-8 byte order mark is silently ignored. - @liveexample{The example below demonstrates the `parse()` function with and - without callback function.,parse__string__parser_callback_t} + @liveexample{The example below demonstrates the `parse()` function with + and without callback function.,parse__string__parser_callback_t} @sa @ref parse(std::istream&, parser_callback_t) for a version that reads from an input stream @@ -5786,11 +5791,11 @@ class basic_json @note A UTF-8 byte order mark is silently ignored. - @liveexample{The example below demonstrates the `parse()` function with and - without callback function.,parse__istream__parser_callback_t} + @liveexample{The example below demonstrates the `parse()` function with + and without callback function.,parse__istream__parser_callback_t} - @sa @ref parse(const string_t&, parser_callback_t) for a version that reads - from a string + @sa @ref parse(const string_t&, parser_callback_t) for a version that + reads from a string @since version 1.0.0 */ @@ -5923,8 +5928,8 @@ class basic_json /*! @brief escape a string - Escape a string by replacing certain special characters by a sequence of an - escape character (backslash) and another character and other control + Escape a string by replacing certain special characters by a sequence of + an escape character (backslash) and another character and other control characters by a sequence of "\u" followed by a four-digit hex representation. @@ -6046,8 +6051,8 @@ class basic_json This function is called by the public member function dump and organizes the serialization internally. The indentation level is propagated as - additional parameter. In case of arrays and objects, the function is called - recursively. Note that + additional parameter. In case of arrays and objects, the function is + called recursively. Note that - strings and object keys are escaped using `escape_string()` - integer numbers are converted implicitly via `operator<<` @@ -6241,8 +6246,8 @@ class basic_json { // Otherwise 6, 15 or 16 digits of precision allows // round-trip IEEE 754 string->float->string, - // string->double->string or string->long double->string; - // to be safe, we read this value from + // string->double->string or string->long + // double->string; to be safe, we read this value from // std::numeric_limits::digits10 std::stringstream ss; ss.imbue(std::locale(std::locale(), new DecimalSeparator)); // fix locale problems @@ -7262,8 +7267,8 @@ class basic_json @brief lexical analysis This class organizes the lexical analysis during JSON deserialization. The - core of it is a scanner generated by [re2c](http://re2c.org) that processes - a buffer and recognizes tokens according to RFC 7159. + core of it is a scanner generated by [re2c](http://re2c.org) that + processes a buffer and recognizes tokens according to RFC 7159. */ class lexer { @@ -8259,13 +8264,14 @@ basic_json_parser_63: 1. Escaped characters. In this case, a new character is constructed according to the nature of the escape. Some escapes create new - characters (e.g., `"\\n"` is replaced by `"\n"`), some are copied as - is (e.g., `"\\\\"`). Furthermore, Unicode escapes of the shape + characters (e.g., `"\\n"` is replaced by `"\n"`), some are copied + as is (e.g., `"\\\\"`). Furthermore, Unicode escapes of the shape `"\\uxxxx"` need special care. In this case, to_unicode takes care of the construction of the values. 2. Unescaped characters are copied as is. - @return string value of current token without opening and closing quotes + @return string value of current token without opening and closing + quotes @throw std::out_of_range if to_unicode fails */ string_t get_string() const @@ -8376,8 +8382,8 @@ basic_json_parser_63: This function (and its overloads) serves to select the most approprate standard floating point number parsing function based on the type - supplied via the first parameter. Set this to - @a static_cast(nullptr). + supplied via the first parameter. Set this to @a + static_cast(nullptr). @param[in] type the @ref number_float_t in use @@ -8401,8 +8407,8 @@ basic_json_parser_63: This function (and its overloads) serves to select the most approprate standard floating point number parsing function based on the type - supplied via the first parameter. Set this to - @a static_cast(nullptr). + supplied via the first parameter. Set this to @a + static_cast(nullptr). @param[in] type the @ref number_float_t in use @@ -8421,8 +8427,8 @@ basic_json_parser_63: This function (and its overloads) serves to select the most approprate standard floating point number parsing function based on the type - supplied via the first parameter. Set this to - @a static_cast(nullptr). + supplied via the first parameter. Set this to @a + static_cast(nullptr). @param[in] type the @ref number_float_t in use @@ -8446,13 +8452,13 @@ basic_json_parser_63: This function parses the integer component up to the radix point or exponent while collecting information about the 'floating point representation', which it stores in the result parameter. If there is - no radix point or exponent, and the number can fit into a - @ref number_integer_t or @ref number_unsigned_t then it sets the - result parameter accordingly. + no radix point or exponent, and the number can fit into a @ref + number_integer_t or @ref number_unsigned_t then it sets the result + parameter accordingly. The 'floating point representation' includes the number of significant - figures after the radix point, whether the number is in exponential - or decimal form, the capitalization of the exponent marker, and if the + figures after the radix point, whether the number is in exponential or + decimal form, the capitalization of the exponent marker, and if the optional '+' is present in the exponent. This information is necessary to perform accurate round trips of floating point numbers. @@ -9415,11 +9421,11 @@ basic_json_parser_63: throw std::domain_error("values in object must be primitive"); } - // assign value to reference pointed to by JSON pointer; - // Note that if the JSON pointer is "" (i.e., points to the - // whole value), function get_and_create returns a reference - // to result itself. An assignment will then create a - // primitive value. + // assign value to reference pointed to by JSON pointer; Note + // that if the JSON pointer is "" (i.e., points to the whole + // value), function get_and_create returns a reference to + // result itself. An assignment will then create a primitive + // value. json_pointer(element.first).get_and_create(result) = element.second; } @@ -9442,9 +9448,9 @@ basic_json_parser_63: @brief access specified element via JSON Pointer Uses a JSON pointer to retrieve a reference to the respective JSON value. - No bound checking is performed. Similar to - @ref operator[](const typename object_t::key_type&), `null` values - are created in arrays and objects if necessary. + No bound checking is performed. Similar to @ref operator[](const typename + object_t::key_type&), `null` values are created in arrays and objects if + necessary. In particular: - If the JSON pointer points to an object key that does not exist, it @@ -9531,8 +9537,8 @@ basic_json_parser_63: /*! @brief access specified element via JSON Pointer - Returns a const reference to the element at with specified JSON pointer - @a ptr, with bounds checking. + Returns a const reference to the element at with specified JSON pointer @a + ptr, with bounds checking. @param[in] ptr JSON pointer to the desired element @@ -9556,10 +9562,10 @@ basic_json_parser_63: /*! @brief return flattened JSON value - The function creates a JSON object whose keys are JSON pointers (see - [RFC 6901](https://tools.ietf.org/html/rfc6901)) and whose values are all - primitive. The original JSON value can be restored using the - @ref unflatten() function. + The function creates a JSON object whose keys are JSON pointers (see [RFC + 6901](https://tools.ietf.org/html/rfc6901)) and whose values are all + primitive. The original JSON value can be restored using the @ref + unflatten() function. @return an object that maps JSON pointers to primitve values @@ -9631,7 +9637,7 @@ basic_json_parser_63: this funcion, a JSON Patch is applied to the current JSON value by executing all operations from the patch. - @param[in] patch JSON patch document + @param[in] json_patch JSON patch document @return patched document @note The application of a patch is atomic: Either all operations succeed @@ -10092,8 +10098,8 @@ basic_json_parser_63: /*! @brief default JSON class -This type is the default specialization of the @ref basic_json class which uses -the standard template types. +This type is the default specialization of the @ref basic_json class which +uses the standard template types. @since version 1.0.0 */ diff --git a/src/json.hpp.re2c b/src/json.hpp.re2c index 151e95aea..ba4fc007b 100644 --- a/src/json.hpp.re2c +++ b/src/json.hpp.re2c @@ -271,8 +271,8 @@ class basic_json @tparam ObjectType the container to store objects (e.g., `std::map` or `std::unordered_map`) - @tparam StringType the type of the keys or names (e.g., `std::string`). The - comparison function `std::less` is used to order elements + @tparam StringType the type of the keys or names (e.g., `std::string`). + The comparison function `std::less` is used to order elements inside the container. @tparam AllocatorType the allocator to use for objects (e.g., `std::allocator`) @@ -280,8 +280,8 @@ class basic_json #### Default type With the default values for @a ObjectType (`std::map`), @a StringType - (`std::string`), and @a AllocatorType (`std::allocator`), the default value - for @a object_t is: + (`std::string`), and @a AllocatorType (`std::allocator`), the default + value for @a object_t is: @code {.cpp} std::map< @@ -298,16 +298,16 @@ class basic_json the default type, objects have the following behavior: - When all names are unique, objects will be interoperable in the sense - that all software implementations receiving that object will agree on the - name-value mappings. + that all software implementations receiving that object will agree on + the name-value mappings. - When the names within an object are not unique, later stored name/value pairs overwrite previously stored name/value pairs, leaving the used names unique. For instance, `{"key": 1}` and `{"key": 2, "key": 1}` will be treated as equal and both stored as `{"key": 1}`. - Internally, name/value pairs are stored in lexicographical order of the - names. Objects will also be serialized (see @ref dump) in this order. For - instance, `{"b": 1, "a": 2}` and `{"a": 2, "b": 1}` will be stored and - serialized as `{"a": 2, "b": 1}`. + names. Objects will also be serialized (see @ref dump) in this order. + For instance, `{"b": 1, "a": 2}` and `{"a": 2, "b": 1}` will be stored + and serialized as `{"a": 2, "b": 1}`. - When comparing objects, the order of the name/value pairs is irrelevant. This makes objects interoperable in the sense that they will not be affected by these differences. For instance, `{"b": 1, "a": 2}` and @@ -320,23 +320,24 @@ class basic_json In this class, the object's limit of nesting is not constraint explicitly. However, a maximum depth of nesting may be introduced by the compiler or - runtime environment. A theoretical limit can be queried by calling the @ref - max_size function of a JSON object. + runtime environment. A theoretical limit can be queried by calling the + @ref max_size function of a JSON object. #### Storage Objects are stored as pointers in a @ref basic_json type. That is, for any - access to object values, a pointer of type `object_t*` must be dereferenced. + access to object values, a pointer of type `object_t*` must be + dereferenced. @sa @ref array_t -- type for an array value @since version 1.0.0 - @note The order name/value pairs are added to the object is *not* preserved - by the library. Therefore, iterating an object may return name/value pairs - in a different order than they were originally stored. In fact, keys will - be traversed in alphabetical order as `std::map` with `std::less` is used - by default. Please note this behavior conforms to [RFC + @note The order name/value pairs are added to the object is *not* + preserved by the library. Therefore, iterating an object may return + name/value pairs in a different order than they were originally stored. In + fact, keys will be traversed in alphabetical order as `std::map` with + `std::less` is used by default. Please note this behavior conforms to [RFC 7159](http://rfc7159.net/rfc7159), because any order implements the specified "unordered" nature of JSON objects. */ @@ -378,8 +379,8 @@ class basic_json In this class, the array's limit of nesting is not constraint explicitly. However, a maximum depth of nesting may be introduced by the compiler or - runtime environment. A theoretical limit can be queried by calling the @ref - max_size function of a JSON array. + runtime environment. A theoretical limit can be queried by calling the + @ref max_size function of a JSON array. #### Storage @@ -399,8 +400,8 @@ class basic_json > A string is a sequence of zero or more Unicode characters. To store objects in C++, a type is defined by the template parameter - described below. Unicode values are split by the JSON class into byte-sized - characters during deserialization. + described below. Unicode values are split by the JSON class into + byte-sized characters during deserialization. @tparam StringType the container to store strings (e.g., `std::string`). Note this container is used for keys/names in objects, see @ref object_t. @@ -469,19 +470,19 @@ class basic_json @brief a type for a number (integer) [RFC 7159](http://rfc7159.net/rfc7159) describes numbers as follows: - > The representation of numbers is similar to that used in most programming - > languages. A number is represented in base 10 using decimal digits. It - > contains an integer component that may be prefixed with an optional minus - > sign, which may be followed by a fraction part and/or an exponent part. - > Leading zeros are not allowed. (...) Numeric values that cannot be - > represented in the grammar below (such as Infinity and NaN) are not - > permitted. + > The representation of numbers is similar to that used in most + > programming languages. A number is represented in base 10 using decimal + > digits. It contains an integer component that may be prefixed with an + > optional minus sign, which may be followed by a fraction part and/or an + > exponent part. Leading zeros are not allowed. (...) Numeric values that + > cannot be represented in the grammar below (such as Infinity and NaN) + > are not permitted. - This description includes both integer and floating-point numbers. However, - C++ allows more precise storage if it is known whether the number is a - signed integer, an unsigned integer or a floating-point number. Therefore, - three different types, @ref number_integer_t, @ref number_unsigned_t and - @ref number_float_t are used. + This description includes both integer and floating-point numbers. + However, C++ allows more precise storage if it is known whether the number + is a signed integer, an unsigned integer or a floating-point number. + Therefore, three different types, @ref number_integer_t, @ref + number_unsigned_t and @ref number_float_t are used. To store integer numbers in C++, a type is defined by the template parameter @a NumberIntegerType which chooses the type to use. @@ -500,8 +501,8 @@ class basic_json - The restrictions about leading zeros is not enforced in C++. Instead, leading zeros in integer literals lead to an interpretation as octal number. Internally, the value will be stored as decimal number. For - instance, the C++ integer literal `010` will be serialized to `8`. During - deserialization, leading zeros yield an error. + instance, the C++ integer literal `010` will be serialized to `8`. + During deserialization, leading zeros yield an error. - Not-a-number (NaN) values will be serialized to `null`. #### Limits @@ -512,9 +513,10 @@ class basic_json When the default type is used, the maximal integer number that can be stored is `9223372036854775807` (INT64_MAX) and the minimal integer number that can be stored is `-9223372036854775808` (INT64_MIN). Integer numbers - that are out of range will yield over/underflow when used in a constructor. - During deserialization, too large or small integer numbers will be - automatically be stored as @ref number_unsigned_t or @ref number_float_t. + that are out of range will yield over/underflow when used in a + constructor. During deserialization, too large or small integer numbers + will be automatically be stored as @ref number_unsigned_t or @ref + number_float_t. [RFC 7159](http://rfc7159.net/rfc7159) further states: > Note that when such software is used, numbers that are integers and are @@ -540,27 +542,27 @@ class basic_json @brief a type for a number (unsigned) [RFC 7159](http://rfc7159.net/rfc7159) describes numbers as follows: - > The representation of numbers is similar to that used in most programming - > languages. A number is represented in base 10 using decimal digits. It - > contains an integer component that may be prefixed with an optional minus - > sign, which may be followed by a fraction part and/or an exponent part. - > Leading zeros are not allowed. (...) Numeric values that cannot be - > represented in the grammar below (such as Infinity and NaN) are not - > permitted. + > The representation of numbers is similar to that used in most + > programming languages. A number is represented in base 10 using decimal + > digits. It contains an integer component that may be prefixed with an + > optional minus sign, which may be followed by a fraction part and/or an + > exponent part. Leading zeros are not allowed. (...) Numeric values that + > cannot be represented in the grammar below (such as Infinity and NaN) + > are not permitted. - This description includes both integer and floating-point numbers. However, - C++ allows more precise storage if it is known whether the number is a - signed integer, an unsigned integer or a floating-point number. Therefore, - three different types, @ref number_integer_t, @ref number_unsigned_t and - @ref number_float_t are used. + This description includes both integer and floating-point numbers. + However, C++ allows more precise storage if it is known whether the number + is a signed integer, an unsigned integer or a floating-point number. + Therefore, three different types, @ref number_integer_t, @ref + number_unsigned_t and @ref number_float_t are used. - To store unsigned integer numbers in C++, a type is defined by the template - parameter @a NumberUnsignedType which chooses the type to use. + To store unsigned integer numbers in C++, a type is defined by the + template parameter @a NumberUnsignedType which chooses the type to use. #### Default type - With the default values for @a NumberUnsignedType (`uint64_t`), the default - value for @a number_unsigned_t is: + With the default values for @a NumberUnsignedType (`uint64_t`), the + default value for @a number_unsigned_t is: @code {.cpp} uint64_t @@ -571,8 +573,8 @@ class basic_json - The restrictions about leading zeros is not enforced in C++. Instead, leading zeros in integer literals lead to an interpretation as octal number. Internally, the value will be stored as decimal number. For - instance, the C++ integer literal `010` will be serialized to `8`. During - deserialization, leading zeros yield an error. + instance, the C++ integer literal `010` will be serialized to `8`. + During deserialization, leading zeros yield an error. - Not-a-number (NaN) values will be serialized to `null`. #### Limits @@ -612,19 +614,19 @@ class basic_json @brief a type for a number (floating-point) [RFC 7159](http://rfc7159.net/rfc7159) describes numbers as follows: - > The representation of numbers is similar to that used in most programming - > languages. A number is represented in base 10 using decimal digits. It - > contains an integer component that may be prefixed with an optional minus - > sign, which may be followed by a fraction part and/or an exponent part. - > Leading zeros are not allowed. (...) Numeric values that cannot be - > represented in the grammar below (such as Infinity and NaN) are not - > permitted. + > The representation of numbers is similar to that used in most + > programming languages. A number is represented in base 10 using decimal + > digits. It contains an integer component that may be prefixed with an + > optional minus sign, which may be followed by a fraction part and/or an + > exponent part. Leading zeros are not allowed. (...) Numeric values that + > cannot be represented in the grammar below (such as Infinity and NaN) + > are not permitted. - This description includes both integer and floating-point numbers. However, - C++ allows more precise storage if it is known whether the number is a - signed integer, an unsigned integer or a floating-point number. Therefore, - three different types, @ref number_integer_t, @ref number_unsigned_t and - @ref number_float_t are used. + This description includes both integer and floating-point numbers. + However, C++ allows more precise storage if it is known whether the number + is a signed integer, an unsigned integer or a floating-point number. + Therefore, three different types, @ref number_integer_t, @ref + number_unsigned_t and @ref number_float_t are used. To store floating-point numbers in C++, a type is defined by the template parameter @a NumberFloatType which chooses the type to use. @@ -641,8 +643,8 @@ class basic_json #### Default behavior - The restrictions about leading zeros is not enforced in C++. Instead, - leading zeros in floating-point literals will be ignored. Internally, the - value will be stored as decimal number. For instance, the C++ + leading zeros in floating-point literals will be ignored. Internally, + the value will be stored as decimal number. For instance, the C++ floating-point literal `01.2` will be serialized to `1.2`. During deserialization, leading zeros yield an error. - Not-a-number (NaN) values will be serialized to `null`. @@ -653,9 +655,9 @@ class basic_json > This specification allows implementations to set limits on the range and > precision of numbers accepted. Since software that implements IEEE > 754-2008 binary64 (double precision) numbers is generally available and - > widely used, good interoperability can be achieved by implementations that - > expect no more precision or range than these provide, in the sense that - > implementations will approximate JSON numbers within the expected + > widely used, good interoperability can be achieved by implementations + > that expect no more precision or range than these provide, in the sense + > that implementations will approximate JSON numbers within the expected > precision. This implementation does exactly follow this approach, as it uses double @@ -938,9 +940,9 @@ class basic_json influenced. When passed to @ref parse(std::istream&, parser_callback_t) or @ref parse(const string_t&, parser_callback_t), it is called on certain events (passed as @ref parse_event_t via parameter @a event) with a set - recursion depth @a depth and context JSON value @a parsed. The return value - of the callback function is a boolean indicating whether the element that - emitted the callback shall be kept or not. + recursion depth @a depth and context JSON value @a parsed. The return + value of the callback function is a boolean indicating whether the element + that emitted the callback shall be kept or not. We distinguish six scenarios (determined by the event type) in which the callback function can be called. The following table describes the values @@ -960,8 +962,8 @@ class basic_json - Discarded values in structured types are skipped. That is, the parser will behave as if the discarded value was never read. - - In case a value outside a structured type is skipped, it is replaced with - `null`. This case happens if the top-level element is skipped. + - In case a value outside a structured type is skipped, it is replaced + with `null`. This case happens if the top-level element is skipped. @param[in] depth the depth of the recursion during parsing @@ -1065,8 +1067,8 @@ class basic_json Create a `null` JSON value. This is the explicitly version of the `null` value constructor as it takes a null pointer as parameter. It allows to create `null` values by explicitly assigning a `nullptr` to a JSON value. - The passed null pointer itself is not read -- it is only used to choose the - right constructor. + The passed null pointer itself is not read -- it is only used to choose + the right constructor. @complexity Constant. @@ -1096,8 +1098,8 @@ class basic_json @throw std::bad_alloc if allocation for object value fails - @liveexample{The following code shows the constructor with an @ref object_t - parameter.,basic_json__object_t} + @liveexample{The following code shows the constructor with an @ref + object_t parameter.,basic_json__object_t} @sa @ref basic_json(const CompatibleObjectType&) -- create an object value from a compatible STL container @@ -1177,11 +1179,11 @@ class basic_json any type @a CompatibleArrayType that can be used to construct values of type @ref array_t. - @tparam CompatibleArrayType An object type whose `value_type` is compatible - to @ref array_t. Examples include `std::vector`, `std::deque`, `std::list`, - `std::forward_list`, `std::array`, `std::set`, `std::unordered_set`, - `std::multiset`, and `unordered_multiset` with a `value_type` from which a - @ref basic_json value can be constructed. + @tparam CompatibleArrayType An object type whose `value_type` is + compatible to @ref array_t. Examples include `std::vector`, `std::deque`, + `std::list`, `std::forward_list`, `std::array`, `std::set`, + `std::unordered_set`, `std::multiset`, and `unordered_multiset` with a + `value_type` from which a @ref basic_json value can be constructed. @param[in] val a value for the array @@ -1225,8 +1227,8 @@ class basic_json @throw std::bad_alloc if allocation for string value fails - @liveexample{The following code shows the constructor with an @ref string_t - parameter.,basic_json__string_t} + @liveexample{The following code shows the constructor with an @ref + string_t parameter.,basic_json__string_t} @sa @ref basic_json(const typename string_t::value_type*) -- create a string value from a character pointer @@ -1318,9 +1320,9 @@ class basic_json Create an integer number JSON value with a given content. @tparam T A helper type to remove this function via SFINAE in case @ref - number_integer_t is the same as `int`. In this case, this constructor would - have the same signature as @ref basic_json(const int value). Note the - helper type @a T is not visible in this constructor's interface. + number_integer_t is the same as `int`. In this case, this constructor + would have the same signature as @ref basic_json(const int value). Note + the helper type @a T is not visible in this constructor's interface. @param[in] val an integer to create a JSON number from @@ -1355,8 +1357,8 @@ class basic_json @note This constructor allows to pass enums directly to a constructor. As C++ has no way of specifying the type of an anonymous enum explicitly, we can only rely on the fact that such values implicitly convert to int. As - int may already be the same type of number_integer_t, we may need to switch - off the constructor @ref basic_json(const number_integer_t). + int may already be the same type of number_integer_t, we may need to + switch off the constructor @ref basic_json(const number_integer_t). @complexity Constant. @@ -1383,8 +1385,8 @@ class basic_json construct values of type @ref number_integer_t. @tparam CompatibleNumberIntegerType An integer type which is compatible to - @ref number_integer_t. Examples include the types `int`, `int32_t`, `long`, - and `short`. + @ref number_integer_t. Examples include the types `int`, `int32_t`, + `long`, and `short`. @param[in] val an integer to create a JSON number from @@ -1442,12 +1444,12 @@ class basic_json /*! @brief create an unsigned number (implicit) - Create an unsigned number JSON value with a given content. This constructor - allows any type @a CompatibleNumberUnsignedType that can be used to - construct values of type @ref number_unsigned_t. + Create an unsigned number JSON value with a given content. This + constructor allows any type @a CompatibleNumberUnsignedType that can be + used to construct values of type @ref number_unsigned_t. - @tparam CompatibleNumberUnsignedType An integer type which is compatible to - @ref number_unsigned_t. Examples may include the types `unsigned int`, + @tparam CompatibleNumberUnsignedType An integer type which is compatible + to @ref number_unsigned_t. Examples may include the types `unsigned int`, `uint32_t`, or `unsigned short`. @param[in] val an unsigned integer to create a JSON number from @@ -1480,8 +1482,8 @@ class basic_json @note [RFC 7159](http://www.rfc-editor.org/rfc/rfc7159.txt), section 6 disallows NaN values: - > Numeric values that cannot be represented in the grammar below (such - > as Infinity and NaN) are not permitted. + > Numeric values that cannot be represented in the grammar below (such as + > Infinity and NaN) are not permitted. In case the parameter @a val is not a number, a JSON null value is created instead. @@ -1513,15 +1515,16 @@ class basic_json constructor allows any type @a CompatibleNumberFloatType that can be used to construct values of type @ref number_float_t. - @tparam CompatibleNumberFloatType A floating-point type which is compatible - to @ref number_float_t. Examples may include the types `float` or `double`. + @tparam CompatibleNumberFloatType A floating-point type which is + compatible to @ref number_float_t. Examples may include the types `float` + or `double`. @param[in] val a floating-point to create a JSON number from @note [RFC 7159](http://www.rfc-editor.org/rfc/rfc7159.txt), section 6 disallows NaN values: - > Numeric values that cannot be represented in the grammar below (such - > as Infinity and NaN) are not permitted. + > Numeric values that cannot be represented in the grammar below (such as + > Infinity and NaN) are not permitted. In case the parameter @a val is not a number, a JSON null value is created instead. @@ -1592,13 +1595,13 @@ class basic_json used by the functions @ref array(std::initializer_list) and @ref object(std::initializer_list). - @param[in] manual_type internal parameter; when @a type_deduction is set to - `false`, the created JSON value will use the provided type (only @ref + @param[in] manual_type internal parameter; when @a type_deduction is set + to `false`, the created JSON value will use the provided type (only @ref value_t::array and @ref value_t::object are valid); when @a type_deduction is set to `true`, this parameter has no effect - @throw std::domain_error if @a type_deduction is `false`, @a manual_type is - `value_t::object`, but @a init contains an element which is not a pair + @throw std::domain_error if @a type_deduction is `false`, @a manual_type + is `value_t::object`, but @a init contains an element which is not a pair whose first element is a string; example: `"cannot create object from initializer list"` @@ -1679,8 +1682,8 @@ class basic_json list of values `a, b, c`, creates the JSON value `[a, b, c]`. If the initializer list is empty, the empty array `[]` is created. - @note This function is only needed to express two edge cases that cannot be - realized with the initializer list constructor (@ref + @note This function is only needed to express two edge cases that cannot + be realized with the initializer list constructor (@ref basic_json(std::initializer_list, bool, value_t)). These cases are: 1. creating an array whose elements are all pairs whose first element is a @@ -1723,8 +1726,8 @@ class basic_json related function @ref array(std::initializer_list), there are no cases which can only be expressed by this function. That is, any initializer list @a init can also be passed to the initializer list - constructor - @ref basic_json(std::initializer_list, bool, value_t). + constructor @ref basic_json(std::initializer_list, bool, + value_t). @param[in] init initializer list to create an object from (optional) @@ -1755,8 +1758,8 @@ class basic_json /*! @brief construct an array with count copies of given value - Constructs a JSON array value by creating @a cnt copies of a passed - value. In case @a cnt is `0`, an empty array is created. As postcondition, + Constructs a JSON array value by creating @a cnt copies of a passed value. + In case @a cnt is `0`, an empty array is created. As postcondition, `std::distance(begin(),end()) == cnt` holds. @param[in] cnt the number of JSON copies of @a val to create @@ -1784,8 +1787,8 @@ class basic_json - In case of primitive types (number, boolean, or string), @a first must be `begin()` and @a last must be `end()`. In this case, the value is copied. Otherwise, std::out_of_range is thrown. - - In case of structured types (array, object), the constructor behaves - as similar versions for `std::vector`. + - In case of structured types (array, object), the constructor behaves as + similar versions for `std::vector`. - In case of a null type, std::domain_error is thrown. @tparam InputIT an input iterator type (@ref iterator or @ref @@ -1800,8 +1803,8 @@ class basic_json boolean, or string) where an out of range error can be detected easily; example: `"iterators out of range"` @throw std::bad_alloc if allocation for object, array, or string fails - @throw std::domain_error if called with a null value; example: `"cannot use - construct with iterators from null"` + @throw std::domain_error if called with a null value; example: `"cannot + use construct with iterators from null"` @complexity Linear in distance between @a first and @a last. @@ -2042,8 +2045,8 @@ class basic_json @brief copy assignment Copy assignment operator. Copies a JSON value via the "copy and swap" - strategy: It is expressed in terms of the copy constructor, destructor, and - the swap() member function. + strategy: It is expressed in terms of the copy constructor, destructor, + and the swap() member function. @param[in] other value to copy from @@ -2143,8 +2146,8 @@ class basic_json parameter. @param[in] indent if indent is nonnegative, then array elements and object - members will be pretty-printed with that indent level. An indent level of 0 - will only insert newlines. -1 (the default) selects the most compact + members will be pretty-printed with that indent level. An indent level of + 0 will only insert newlines. -1 (the default) selects the most compact representation @return string containing the serialization of the JSON value @@ -2976,8 +2979,8 @@ class basic_json /*! @brief get a reference value (implicit) - Implict reference access to the internally stored JSON value. No copies are - made. + Implict reference access to the internally stored JSON value. No copies + are made. @warning Writing data to the referee of the result yields an undefined state. @@ -3027,14 +3030,14 @@ class basic_json /*! @brief get a value (implicit) - Implicit type conversion between the JSON value and a compatible value. The - call is realized by calling @ref get() const. + Implicit type conversion between the JSON value and a compatible value. + The call is realized by calling @ref get() const. @tparam ValueType non-pointer type compatible to the JSON value, for instance `int` for JSON integer numbers, `bool` for JSON booleans, or - `std::vector` types for JSON arrays. The character type of @ref string_t as - well as an initializer list of this type is excluded to avoid ambiguities - as these types implicitly convert to `std::string`. + `std::vector` types for JSON arrays. The character type of @ref string_t + as well as an initializer list of this type is excluded to avoid + ambiguities as these types implicitly convert to `std::string`. @return copy of the JSON value, converted to type @a ValueType @@ -3123,8 +3126,8 @@ class basic_json /*! @brief access specified array element with bounds checking - Returns a const reference to the element at specified location @a idx, with - bounds checking. + Returns a const reference to the element at specified location @a idx, + with bounds checking. @param[in] idx index of the element to access @@ -3215,8 +3218,8 @@ class basic_json /*! @brief access specified object element with bounds checking - Returns a const reference to the element at with specified key @a key, with - bounds checking. + Returns a const reference to the element at with specified key @a key, + with bounds checking. @param[in] key key of the element to access @@ -3690,8 +3693,8 @@ class basic_json @complexity Constant. - @pre The JSON value must not be `null` (would throw `std::out_of_range`) or - an empty array or object (undefined behavior, guarded by assertions). + @pre The JSON value must not be `null` (would throw `std::out_of_range`) + or an empty array or object (undefined behavior, guarded by assertions). @post The JSON value remains unchanged. @throw std::out_of_range when called on `null` value @@ -3732,8 +3735,8 @@ class basic_json @complexity Constant. - @pre The JSON value must not be `null` (would throw `std::out_of_range`) or - an empty array or object (undefined behavior, guarded by assertions). + @pre The JSON value must not be `null` (would throw `std::out_of_range`) + or an empty array or object (undefined behavior, guarded by assertions). @post The JSON value remains unchanged. @throw std::out_of_range when called on `null` value. @@ -3772,16 +3775,16 @@ class basic_json will be `null`. @param[in] pos iterator to the element to remove - @return Iterator following the last removed element. If the iterator @a pos - refers to the last element, the `end()` iterator is returned. + @return Iterator following the last removed element. If the iterator @a + pos refers to the last element, the `end()` iterator is returned. @tparam InteratorType an @ref iterator or @ref const_iterator @post Invalidates iterators and references at or after the point of the erase, including the `end()` iterator. - @throw std::domain_error if called on a `null` value; example: `"cannot use - erase() with null"` + @throw std::domain_error if called on a `null` value; example: `"cannot + use erase() with null"` @throw std::domain_error if called on an iterator which does not belong to the current JSON value; example: `"iterator does not fit current value"` @throw std::out_of_range if called on a primitive type with invalid @@ -3797,12 +3800,12 @@ class basic_json @liveexample{The example shows the result of `erase()` for different JSON types.,erase__IteratorType} - @sa @ref erase(InteratorType, InteratorType) -- removes the elements in the - given range + @sa @ref erase(InteratorType, InteratorType) -- removes the elements in + the given range @sa @ref erase(const typename object_t::key_type&) -- removes the element from an object at the given key - @sa @ref erase(const size_type) -- removes the element from an array at the - given index + @sa @ref erase(const size_type) -- removes the element from an array at + the given index @since version 1.0.0 */ @@ -3871,9 +3874,9 @@ class basic_json /*! @brief remove elements given an iterator range - Removes the element specified by the range `[first; last)`. The iterator @a - first does not need to be dereferenceable if `first == last`: erasing an - empty range is a no-op. + Removes the element specified by the range `[first; last)`. The iterator + @a first does not need to be dereferenceable if `first == last`: erasing + an empty range is a no-op. If called on a primitive type other than `null`, the resulting JSON value will be `null`. @@ -3888,8 +3891,8 @@ class basic_json @post Invalidates iterators and references at or after the point of the erase, including the `end()` iterator. - @throw std::domain_error if called on a `null` value; example: `"cannot use - erase() with null"` + @throw std::domain_error if called on a `null` value; example: `"cannot + use erase() with null"` @throw std::domain_error if called on iterators which does not belong to the current JSON value; example: `"iterators do not fit current value"` @throw std::out_of_range if called on a primitive type with invalid @@ -3909,8 +3912,8 @@ class basic_json @sa @ref erase(InteratorType) -- removes the element at a given position @sa @ref erase(const typename object_t::key_type&) -- removes the element from an object at the given key - @sa @ref erase(const size_type) -- removes the element from an array at the - given index + @sa @ref erase(const size_type) -- removes the element from an array at + the given index @since version 1.0.0 */ @@ -3986,8 +3989,8 @@ class basic_json @param[in] key value of the elements to remove @return Number of elements removed. If @a ObjectType is the default - `std::map` type, the return value will always be `0` (@a key was not found) - or `1` (@a key was found). + `std::map` type, the return value will always be `0` (@a key was not + found) or `1` (@a key was found). @post References and iterators to the erased elements are invalidated. Other references and iterators are not affected. @@ -4000,10 +4003,10 @@ class basic_json @liveexample{The example shows the effect of `erase()`.,erase__key_type} @sa @ref erase(InteratorType) -- removes the element at a given position - @sa @ref erase(InteratorType, InteratorType) -- removes the elements in the - given range - @sa @ref erase(const size_type) -- removes the element from an array at the - given index + @sa @ref erase(InteratorType, InteratorType) -- removes the elements in + the given range + @sa @ref erase(const size_type) -- removes the element from an array at + the given index @since version 1.0.0 */ @@ -4038,8 +4041,8 @@ class basic_json @liveexample{The example shows the effect of `erase()`.,erase__size_type} @sa @ref erase(InteratorType) -- removes the element at a given position - @sa @ref erase(InteratorType, InteratorType) -- removes the elements in the - given range + @sa @ref erase(InteratorType, InteratorType) -- removes the elements in + the given range @sa @ref erase(const typename object_t::key_type&) -- removes the element from an object at the given key @@ -4078,7 +4081,8 @@ class basic_json @brief find an element in a JSON object Finds an element in a JSON object with key equivalent to @a key. If the - element is not found or the JSON value is not an object, end() is returned. + element is not found or the JSON value is not an object, end() is + returned. @param[in] key key value of the element to search for @@ -4438,9 +4442,9 @@ class basic_json @brief wrapper to access iterator member functions in range-based for This function allows to access @ref iterator::key() and @ref - iterator::value() during range-based for loops. In these loops, a reference - to the JSON values is returned, so there is no access to the underlying - iterator. + iterator::value() during range-based for loops. In these loops, a + reference to the JSON values is returned, so there is no access to the + underlying iterator. @note The name of this function is not yet final and may change in the future. @@ -4484,8 +4488,8 @@ class basic_json object | result of function `object_t::empty()` array | result of function `array_t::empty()` - @complexity Constant, as long as @ref array_t and @ref object_t satisfy the - Container concept; that is, their `empty()` functions have constant + @complexity Constant, as long as @ref array_t and @ref object_t satisfy + the Container concept; that is, their `empty()` functions have constant complexity. @requirement This function helps `basic_json` satisfying the @@ -4547,8 +4551,9 @@ class basic_json object | result of function object_t::size() array | result of function array_t::size() - @complexity Constant, as long as @ref array_t and @ref object_t satisfy the - Container concept; that is, their size() functions have constant complexity. + @complexity Constant, as long as @ref array_t and @ref object_t satisfy + the Container concept; that is, their size() functions have constant + complexity. @requirement This function helps `basic_json` satisfying the [Container](http://en.cppreference.com/w/cpp/concept/Container) @@ -4612,8 +4617,8 @@ class basic_json object | result of function `object_t::max_size()` array | result of function `array_t::max_size()` - @complexity Constant, as long as @ref array_t and @ref object_t satisfy the - Container concept; that is, their `max_size()` functions have constant + @complexity Constant, as long as @ref array_t and @ref object_t satisfy + the Container concept; that is, their `max_size()` functions have constant complexity. @requirement This function helps `basic_json` satisfying the @@ -4835,8 +4840,8 @@ class basic_json @brief add an object to an object Inserts the given element @a val to the JSON object. If the function is - called on a JSON null value, an empty object is created before inserting @a - val. + called on a JSON null value, an empty object is created before inserting + @a val. @param[in] val the value to add to the JSON object @@ -5111,8 +5116,8 @@ class basic_json @return iterator pointing to the first element inserted, or @a pos if `ilist` is empty - @complexity Linear in `ilist.size()` plus linear in the distance between @a - pos and end of the container. + @complexity Linear in `ilist.size()` plus linear in the distance between + @a pos and end of the container. @liveexample{The example shows how `insert()` is used.,insert__ilist} @@ -5757,8 +5762,8 @@ class basic_json @note A UTF-8 byte order mark is silently ignored. - @liveexample{The example below demonstrates the `parse()` function with and - without callback function.,parse__string__parser_callback_t} + @liveexample{The example below demonstrates the `parse()` function with + and without callback function.,parse__string__parser_callback_t} @sa @ref parse(std::istream&, parser_callback_t) for a version that reads from an input stream @@ -5786,11 +5791,11 @@ class basic_json @note A UTF-8 byte order mark is silently ignored. - @liveexample{The example below demonstrates the `parse()` function with and - without callback function.,parse__istream__parser_callback_t} + @liveexample{The example below demonstrates the `parse()` function with + and without callback function.,parse__istream__parser_callback_t} - @sa @ref parse(const string_t&, parser_callback_t) for a version that reads - from a string + @sa @ref parse(const string_t&, parser_callback_t) for a version that + reads from a string @since version 1.0.0 */ @@ -5923,8 +5928,8 @@ class basic_json /*! @brief escape a string - Escape a string by replacing certain special characters by a sequence of an - escape character (backslash) and another character and other control + Escape a string by replacing certain special characters by a sequence of + an escape character (backslash) and another character and other control characters by a sequence of "\u" followed by a four-digit hex representation. @@ -6046,8 +6051,8 @@ class basic_json This function is called by the public member function dump and organizes the serialization internally. The indentation level is propagated as - additional parameter. In case of arrays and objects, the function is called - recursively. Note that + additional parameter. In case of arrays and objects, the function is + called recursively. Note that - strings and object keys are escaped using `escape_string()` - integer numbers are converted implicitly via `operator<<` @@ -6241,8 +6246,8 @@ class basic_json { // Otherwise 6, 15 or 16 digits of precision allows // round-trip IEEE 754 string->float->string, - // string->double->string or string->long double->string; - // to be safe, we read this value from + // string->double->string or string->long + // double->string; to be safe, we read this value from // std::numeric_limits::digits10 std::stringstream ss; ss.imbue(std::locale(std::locale(), new DecimalSeparator)); // fix locale problems @@ -7262,8 +7267,8 @@ class basic_json @brief lexical analysis This class organizes the lexical analysis during JSON deserialization. The - core of it is a scanner generated by [re2c](http://re2c.org) that processes - a buffer and recognizes tokens according to RFC 7159. + core of it is a scanner generated by [re2c](http://re2c.org) that + processes a buffer and recognizes tokens according to RFC 7159. */ class lexer { @@ -7569,13 +7574,14 @@ class basic_json 1. Escaped characters. In this case, a new character is constructed according to the nature of the escape. Some escapes create new - characters (e.g., `"\\n"` is replaced by `"\n"`), some are copied as - is (e.g., `"\\\\"`). Furthermore, Unicode escapes of the shape + characters (e.g., `"\\n"` is replaced by `"\n"`), some are copied + as is (e.g., `"\\\\"`). Furthermore, Unicode escapes of the shape `"\\uxxxx"` need special care. In this case, to_unicode takes care of the construction of the values. 2. Unescaped characters are copied as is. - @return string value of current token without opening and closing quotes + @return string value of current token without opening and closing + quotes @throw std::out_of_range if to_unicode fails */ string_t get_string() const @@ -7686,8 +7692,8 @@ class basic_json This function (and its overloads) serves to select the most approprate standard floating point number parsing function based on the type - supplied via the first parameter. Set this to - @a static_cast(nullptr). + supplied via the first parameter. Set this to @a + static_cast(nullptr). @param[in] type the @ref number_float_t in use @@ -7711,8 +7717,8 @@ class basic_json This function (and its overloads) serves to select the most approprate standard floating point number parsing function based on the type - supplied via the first parameter. Set this to - @a static_cast(nullptr). + supplied via the first parameter. Set this to @a + static_cast(nullptr). @param[in] type the @ref number_float_t in use @@ -7731,8 +7737,8 @@ class basic_json This function (and its overloads) serves to select the most approprate standard floating point number parsing function based on the type - supplied via the first parameter. Set this to - @a static_cast(nullptr). + supplied via the first parameter. Set this to @a + static_cast(nullptr). @param[in] type the @ref number_float_t in use @@ -7756,13 +7762,13 @@ class basic_json This function parses the integer component up to the radix point or exponent while collecting information about the 'floating point representation', which it stores in the result parameter. If there is - no radix point or exponent, and the number can fit into a - @ref number_integer_t or @ref number_unsigned_t then it sets the - result parameter accordingly. + no radix point or exponent, and the number can fit into a @ref + number_integer_t or @ref number_unsigned_t then it sets the result + parameter accordingly. The 'floating point representation' includes the number of significant - figures after the radix point, whether the number is in exponential - or decimal form, the capitalization of the exponent marker, and if the + figures after the radix point, whether the number is in exponential or + decimal form, the capitalization of the exponent marker, and if the optional '+' is present in the exponent. This information is necessary to perform accurate round trips of floating point numbers. @@ -8725,11 +8731,11 @@ class basic_json throw std::domain_error("values in object must be primitive"); } - // assign value to reference pointed to by JSON pointer; - // Note that if the JSON pointer is "" (i.e., points to the - // whole value), function get_and_create returns a reference - // to result itself. An assignment will then create a - // primitive value. + // assign value to reference pointed to by JSON pointer; Note + // that if the JSON pointer is "" (i.e., points to the whole + // value), function get_and_create returns a reference to + // result itself. An assignment will then create a primitive + // value. json_pointer(element.first).get_and_create(result) = element.second; } @@ -8752,9 +8758,9 @@ class basic_json @brief access specified element via JSON Pointer Uses a JSON pointer to retrieve a reference to the respective JSON value. - No bound checking is performed. Similar to - @ref operator[](const typename object_t::key_type&), `null` values - are created in arrays and objects if necessary. + No bound checking is performed. Similar to @ref operator[](const typename + object_t::key_type&), `null` values are created in arrays and objects if + necessary. In particular: - If the JSON pointer points to an object key that does not exist, it @@ -8841,8 +8847,8 @@ class basic_json /*! @brief access specified element via JSON Pointer - Returns a const reference to the element at with specified JSON pointer - @a ptr, with bounds checking. + Returns a const reference to the element at with specified JSON pointer @a + ptr, with bounds checking. @param[in] ptr JSON pointer to the desired element @@ -8866,10 +8872,10 @@ class basic_json /*! @brief return flattened JSON value - The function creates a JSON object whose keys are JSON pointers (see - [RFC 6901](https://tools.ietf.org/html/rfc6901)) and whose values are all - primitive. The original JSON value can be restored using the - @ref unflatten() function. + The function creates a JSON object whose keys are JSON pointers (see [RFC + 6901](https://tools.ietf.org/html/rfc6901)) and whose values are all + primitive. The original JSON value can be restored using the @ref + unflatten() function. @return an object that maps JSON pointers to primitve values @@ -8941,7 +8947,7 @@ class basic_json this funcion, a JSON Patch is applied to the current JSON value by executing all operations from the patch. - @param[in] patch JSON patch document + @param[in] json_patch JSON patch document @return patched document @note The application of a patch is atomic: Either all operations succeed @@ -9402,8 +9408,8 @@ class basic_json /*! @brief default JSON class -This type is the default specialization of the @ref basic_json class which uses -the standard template types. +This type is the default specialization of the @ref basic_json class which +uses the standard template types. @since version 1.0.0 */ From 639d63217e8d1e1d1b2ced521fd9971466f0091e Mon Sep 17 00:00:00 2001 From: Robert Marki Date: Wed, 18 May 2016 11:25:36 +0200 Subject: [PATCH 069/133] Define CMake/CTest tests Instead of copying the test executable and the JSON files used by the tests at install time, define CMake/CTest tests for running the json_unit executable from any build directory with the project's source directory as its working directory. - call enable_testing in the main lists file to allow the definition of tests - remove install commands from the test directory's lists file - define two tests - json_unit_default for running the default tests by executing json_unit without any arguments - json_unit_all for running all the tests by executing json_unit with the "*" argument - update the AppVeyor configuration file to use the new testing method --- CMakeLists.txt | 2 ++ appveyor.yml | 3 +-- test/CMakeLists.txt | 22 +++++++++++++--------- 3 files changed, 16 insertions(+), 11 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 18e9c651f..c0488b3b3 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -3,6 +3,8 @@ cmake_minimum_required(VERSION 3.0) # define the project project(nlohmann_json VERSION 2.0.0 LANGUAGES CXX) +enable_testing() + option(BuildTests "Build the unit tests" ON) # define project variables diff --git a/appveyor.yml b/appveyor.yml index 63902ced4..a527ef766 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -7,5 +7,4 @@ build_script: - cmake . -G "Visual Studio 14 2015" - cmake --build . --config Release test_script: -- test\Release\json_unit.exe -- test\Release\json_unit.exe "*" +- ctest -C Release -V diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index b63e5a394..c66b19c83 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -1,21 +1,25 @@ # The unit test executable. -add_executable(json_unit +set(JSON_UNITTEST_TARGET_NAME "json_unit") +add_executable(${JSON_UNITTEST_TARGET_NAME} "src/catch.hpp" "src/unit.cpp" ) -set_target_properties(json_unit PROPERTIES +set_target_properties(${JSON_UNITTEST_TARGET_NAME} PROPERTIES CXX_STANDARD 11 CXX_STANDARD_REQUIRED ON COMPILE_DEFINITIONS "$<$:_SCL_SECURE_NO_WARNINGS>" COMPILE_OPTIONS "$<$:/EHsc;$<$:/Od>>" ) -# Install the test binary. -install(TARGETS json_unit RUNTIME DESTINATION test/bin) +target_include_directories(${JSON_UNITTEST_TARGET_NAME} PRIVATE "src") +target_link_libraries(${JSON_UNITTEST_TARGET_NAME} ${JSON_TARGET_NAME}) -# Copy the test data to the install tree. -install(DIRECTORY data/ DESTINATION test/data) - -target_include_directories(json_unit PRIVATE "src") -target_link_libraries(json_unit ${JSON_TARGET_NAME}) +add_test(NAME "${JSON_UNITTEST_TARGET_NAME}_default" + COMMAND ${JSON_UNITTEST_TARGET_NAME} + WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} +) +add_test(NAME "${JSON_UNITTEST_TARGET_NAME}_all" + COMMAND ${JSON_UNITTEST_TARGET_NAME} "*" + WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} +) From 837617122adce96d994c8dbd009a6fc54c94ec3f Mon Sep 17 00:00:00 2001 From: Niels Date: Wed, 18 May 2016 22:17:08 +0200 Subject: [PATCH 070/133] fixed #246 --- .github/CONTRIBUTING.md | 4 +--- README.md | 18 +++++++++--------- 2 files changed, 10 insertions(+), 12 deletions(-) diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md index eba242872..37876be9c 100644 --- a/.github/CONTRIBUTING.md +++ b/.github/CONTRIBUTING.md @@ -70,9 +70,7 @@ Please understand that I cannot accept pull requests changing only file `src/jso The following areas really need contribution: -- Getting the code to compile without errors with the latest **Microsoft Visual Studio** version. I am not using Windows, so I cannot debug code with MSVC myself. There is a job on [AppVeyor](https://ci.appveyor.com/project/nlohmann/json) though. -- Extending the **continuous integration** beyond Linux running some versions of GCC and Clang on [Travis](https://travis-ci.org/nlohmann/json) and Microsoft Visual Studio on [AppVeyor](https://ci.appveyor.com/project/nlohmann/json). We have found a lot of bugs just because several compilers behave in a slightly different manner. +- Extending the **continuous integration** toward more exotic compilers such as Android NDK, Intel's Compiler, or the bleeding-edge versions of GCC or Clang. - Improving the efficiency of the **JSON parser**. The current parser is implemented as a naive recursive descent parser with hand coded string handling. More sophisticated approaches like LALR parsers would be really appreciated. That said, parser generators like Bison or ANTLR do not play nice with single-header files -- I really would like to keep the parser inside the `json.hpp` header, and I am not aware of approaches similar to [`re2c`](http://re2c.org) for parsing. - Extending and updating existing **benchmarks** to include (the most recent version of) this library. Though efficiency is not everything, speed and memory consumption are very important characteristics for C++ developers, so having proper comparisons would be interesting. - Check the code with [**Coverity**](https://scan.coverity.com). -- Make the code **locale-independent**. The library currently only works for a locale where `.` is the decimal point character. diff --git a/README.md b/README.md index 0d2cbf45c..a2a22826b 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ [![Build Status](https://ci.appveyor.com/api/projects/status/1acb366xfyg3qybk?svg=true)](https://ci.appveyor.com/project/nlohmann/json) [![Coverage Status](https://img.shields.io/coveralls/nlohmann/json.svg)](https://coveralls.io/r/nlohmann/json) [![Try online](https://img.shields.io/badge/try-online-blue.svg)](http://melpon.org/wandbox/permlink/wuiuqYiYqRTdI3rG) -[![Documentation Status](https://img.shields.io/badge/docs-doxygen-blue.svg)](http://nlohmann.github.io/json) +[![Documentation](https://img.shields.io/badge/docs-doxygen-blue.svg)](http://nlohmann.github.io/json) [![GitHub license](https://img.shields.io/badge/license-MIT-blue.svg)](https://raw.githubusercontent.com/nlohmann/json/master/LICENSE.MIT) [![Github Releases](https://img.shields.io/github/release/nlohmann/json.svg)](https://github.com/nlohmann/json/releases) [![Github Issues](https://img.shields.io/github/issues/nlohmann/json.svg)](http://github.com/nlohmann/json/issues) @@ -46,7 +46,7 @@ Though it's 2016 already, the support for C++11 is still a bit sparse. Currently - GCC 4.9 - 6.0 (and possibly later) - Clang 3.4 - 3.9 (and possibly later) -- Microsoft Visual C++ 14.0 RC (and possibly later) +- Microsoft Visual C++ 2015 / 14.0 (and possibly later) The code is currently checked with Travis for GCC 4.9, GCC @@ -75,13 +75,13 @@ The following compilers are currently used in [continuous integration](https://t | Clang 3.7.1 | Ubuntu 14.04.3 LTS | Ubuntu clang version 3.7.1-svn253571-1~exp1 (branches/release_37) (based on LLVM 3.7.1) | | Clang 3.8.1 | Ubuntu 14.04.3 LTS | clang version 3.8.1-svn265380-1~exp1 (branches/release_38) | | Clang 3.9.0 | Ubuntu 14.04.3 LTS | clang version 3.9.0-svn267478-1~exp1 (trunk) | -| Clang Xcode 6.1 | Darwin Kernel Version 13.4.0 | Apple LLVM version 6.0 (clang-600.0.54) (based on LLVM 3.5svn) | -| Clang Xcode 6.2 | Darwin Kernel Version 13.4.0 | Apple LLVM version 6.0 (clang-600.0.57) (based on LLVM 3.5svn) | -| Clang Xcode 6.3 | Darwin Kernel Version 14.3.0 | Apple LLVM version 6.1.0 (clang-602.0.49) (based on LLVM 3.6.0svn) | -| Clang Xcode 6.4 | Darwin Kernel Version 14.3.0 | Apple LLVM version 6.1.0 (clang-602.0.53) (based on LLVM 3.6.0svn) | -| Clang Xcode 7.1 | Darwin Kernel Version 14.5.0 | Apple LLVM version 7.0.0 (clang-700.1.76) | -| Clang Xcode 7.2 | Darwin Kernel Version 15.0.0 | Apple LLVM version 7.0.2 (clang-700.1.81) | -| Clang Xcode 7.3 | Darwin Kernel Version 14.5.0 | Apple LLVM version 7.3.0 (clang-703.0.29) | +| Clang Xcode 6.1 | Darwin Kernel Version 13.4.0 (OSX 10.9.5) | Apple LLVM version 6.0 (clang-600.0.54) (based on LLVM 3.5svn) | +| Clang Xcode 6.2 | Darwin Kernel Version 13.4.0 (OSX 10.9.5) | Apple LLVM version 6.0 (clang-600.0.57) (based on LLVM 3.5svn) | +| Clang Xcode 6.3 | Darwin Kernel Version 14.3.0 (OSX 10.10.3) | Apple LLVM version 6.1.0 (clang-602.0.49) (based on LLVM 3.6.0svn) | +| Clang Xcode 6.4 | Darwin Kernel Version 14.3.0 (OSX 10.10.3) | Apple LLVM version 6.1.0 (clang-602.0.53) (based on LLVM 3.6.0svn) | +| Clang Xcode 7.1 | Darwin Kernel Version 14.5.0 (OSX 10.10.5) | Apple LLVM version 7.0.0 (clang-700.1.76) | +| Clang Xcode 7.2 | Darwin Kernel Version 15.0.0 (OSX 10.10.5) | Apple LLVM version 7.0.2 (clang-700.1.81) | +| Clang Xcode 7.3 | Darwin Kernel Version 14.5.0 (OSX 10.11.1) | Apple LLVM version 7.3.0 (clang-703.0.29) | | Visual Studio 14 2015 | Windows Server 2012 R2 (x64) | Microsoft (R) Build Engine version 14.0.25123.0 | ## Examples From a3f432b3dde1d71c8940961947db5938ed11ee91 Mon Sep 17 00:00:00 2001 From: Niels Date: Wed, 18 May 2016 22:23:35 +0200 Subject: [PATCH 071/133] added hint to Homebrew --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index a2a22826b..97d0aa635 100644 --- a/README.md +++ b/README.md @@ -40,6 +40,8 @@ using json = nlohmann::json; to the files you want to use JSON objects. That's it. Do not forget to set the necessary switches to enable C++11 (e.g., `-std=c++11` for GCC and Clang). +:beer: If you are using OS X and [Homebrew](http://brew.sh), just type `brew tap nlohmann/json` and `brew install nlohmann_json` and you're set. + ## Supported compilers Though it's 2016 already, the support for C++11 is still a bit sparse. Currently, the following compilers are known to work: From 71a7746ccb09e2b5796bd40192747aba64c43e5a Mon Sep 17 00:00:00 2001 From: Niels Date: Wed, 25 May 2016 21:55:03 +0200 Subject: [PATCH 072/133] removed a line --- .gitignore | 2 ++ README.md | 2 -- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.gitignore b/.gitignore index e1011fc2a..c610519ef 100644 --- a/.gitignore +++ b/.gitignore @@ -9,3 +9,5 @@ working html me.nlohmann.json.docset + +android \ No newline at end of file diff --git a/README.md b/README.md index 97d0aa635..5bbef3c8a 100644 --- a/README.md +++ b/README.md @@ -50,8 +50,6 @@ Though it's 2016 already, the support for C++11 is still a bit sparse. Currently - Clang 3.4 - 3.9 (and possibly later) - Microsoft Visual C++ 2015 / 14.0 (and possibly later) -The code is currently checked with Travis for GCC 4.9, GCC - I would be happy to learn about other compilers/versions. Please note: From 7bdfde4493ce4e4dac3baa500ac0bf82a96e8826 Mon Sep 17 00:00:00 2001 From: Niels Date: Sat, 28 May 2016 16:06:41 +0200 Subject: [PATCH 073/133] added a note about different NDKs (see #219) --- README.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 5bbef3c8a..ba11b70e0 100644 --- a/README.md +++ b/README.md @@ -63,7 +63,9 @@ Please note: APP_CPPFLAGS += -frtti -fexceptions ``` -- For GCC running on MinGW or Android SDK, the error `'to_string' is not a member of 'std'` (or similarly, for `strtod`) may occur. Note this is not an issue with the code, but rather with the compiler itself. On Android, see above to build with a newer environment. For MinGW, please refer to [this site](http://tehsausage.com/mingw-to-string) and [this discussion](https://github.com/nlohmann/json/issues/136) for information on how to fix this bug. + The code compiles successfully with [Android NDK](https://developer.android.com/ndk/index.html?hl=ml), Revision 9 - 11 (and possibly later) and [CrystaX's Android NDK](https://www.crystax.net/en/android/ndk) version 10. + +- For GCC running on MinGW or Android SDK, the error `'to_string' is not a member of 'std'` (or similarly, for `strtod`) may occur. Note this is not an issue with the code, but rather with the compiler itself. On Android, see above to build with a newer environment. For MinGW, please refer to [this site](http://tehsausage.com/mingw-to-string) and [this discussion](https://github.com/nlohmann/json/issues/136) for information on how to fix this bug. For Android NDK using `APP_STL := gnustl_static`, please refer to [this discussion](https://github.com/nlohmann/json/issues/219). The following compilers are currently used in [continuous integration](https://travis-ci.org/nlohmann/json): From 91dfc723be178f692b9a2679596119a8c1c857e5 Mon Sep 17 00:00:00 2001 From: Niels Date: Sun, 29 May 2016 12:07:20 +0200 Subject: [PATCH 074/133] added coverity_scan --- .travis.yml | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/.travis.yml b/.travis.yml index 1ada0084c..e7ae4444c 100644 --- a/.travis.yml +++ b/.travis.yml @@ -3,6 +3,12 @@ language: cpp dist: trusty sudo: required +env: + global: + # The next declaration is the encrypted COVERITY_SCAN_TOKEN, created + # via the "travis encrypt" command using the project repo's public key + - secure: "m89SSgE+ASLO38rSKx7MTXK3n5NkP9bIx95jwY71YEiuFzib30PDJ/DifKnXxBjvy/AkCGztErQRk/8ZCvq+4HXozU2knEGnL/RUitvlwbhzfh2D4lmS3BvWBGS3N3NewoPBrRmdcvnT0xjOGXxtZaJ3P74TkB9GBnlz/HmKORA=" + # from http://stackoverflow.com/a/32127147/266378 matrix: include: @@ -21,6 +27,15 @@ matrix: - ./json_unit "*" - coveralls --exclude test/src/catch.hpp --exclude test/src/unit.cpp --include src/json.hpp --gcov-options '\-lp' --gcov 'gcov-4.9' env: COMPILER=g++-4.9 + addons: + coverity_scan: + project: + name: "nlohmann/json" + description: "Build submitted via Travis CI" + notification_email: niels.lohmann@gmail.com + build_command_prepend: "make clean" + build_command: "make doctest" + branch_pattern: coverity_scan - os: linux compiler: gcc From 1cc77a5fe531b81e3bc03614fa8f6d73b6c6230a Mon Sep 17 00:00:00 2001 From: Niels Date: Sun, 29 May 2016 12:15:13 +0200 Subject: [PATCH 075/133] another try for coverity-scan --- .travis.yml | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/.travis.yml b/.travis.yml index e7ae4444c..9ff83b5a2 100644 --- a/.travis.yml +++ b/.travis.yml @@ -27,15 +27,6 @@ matrix: - ./json_unit "*" - coveralls --exclude test/src/catch.hpp --exclude test/src/unit.cpp --include src/json.hpp --gcov-options '\-lp' --gcov 'gcov-4.9' env: COMPILER=g++-4.9 - addons: - coverity_scan: - project: - name: "nlohmann/json" - description: "Build submitted via Travis CI" - notification_email: niels.lohmann@gmail.com - build_command_prepend: "make clean" - build_command: "make doctest" - branch_pattern: coverity_scan - os: linux compiler: gcc @@ -131,3 +122,13 @@ script: - if [ `which valgrind` ]; then valgrind --error-exitcode=1 --leak-check=full ./json_unit ; fi + +addons: + coverity_scan: + project: + name: "nlohmann/json" + description: "Build submitted via Travis CI" + notification_email: niels.lohmann@gmail.com + build_command_prepend: "make clean" + build_command: "make doctest" + branch_pattern: coverity_scan From b26582c0e90c2f896a10c65afd5e167f5a4195a4 Mon Sep 17 00:00:00 2001 From: Niels Date: Sun, 29 May 2016 12:29:46 +0200 Subject: [PATCH 076/133] another try for coverity-scan --- .travis.yml | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/.travis.yml b/.travis.yml index 9ff83b5a2..6d8290bde 100644 --- a/.travis.yml +++ b/.travis.yml @@ -34,6 +34,14 @@ matrix: apt: sources: ['ubuntu-toolchain-r-test'] packages: ['g++-5', 'valgrind'] + coverity_scan: + project: + name: "nlohmann/json" + description: "Build submitted via Travis CI" + notification_email: niels.lohmann@gmail.com + build_command_prepend: "make clean" + build_command: "make doctest" + branch_pattern: coverity_scan env: COMPILER=g++-5 # - os: linux @@ -122,13 +130,3 @@ script: - if [ `which valgrind` ]; then valgrind --error-exitcode=1 --leak-check=full ./json_unit ; fi - -addons: - coverity_scan: - project: - name: "nlohmann/json" - description: "Build submitted via Travis CI" - notification_email: niels.lohmann@gmail.com - build_command_prepend: "make clean" - build_command: "make doctest" - branch_pattern: coverity_scan From 6fed4161252edaf49cb18339ee8584c2f8477663 Mon Sep 17 00:00:00 2001 From: Niels Date: Sun, 29 May 2016 12:57:09 +0200 Subject: [PATCH 077/133] fixed used compiler --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 6d8290bde..ad0afd71b 100644 --- a/.travis.yml +++ b/.travis.yml @@ -39,7 +39,7 @@ matrix: name: "nlohmann/json" description: "Build submitted via Travis CI" notification_email: niels.lohmann@gmail.com - build_command_prepend: "make clean" + build_command_prepend: "make clean ; sudo cp $(which g++-5) $(which g++)" build_command: "make doctest" branch_pattern: coverity_scan env: COMPILER=g++-5 From c0b2c6ea5d2e72b8b1f4a336b9c7994c5384621d Mon Sep 17 00:00:00 2001 From: Niels Date: Sun, 29 May 2016 13:06:27 +0200 Subject: [PATCH 078/133] removing beta-xcode6.3 for now --- .travis.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.travis.yml b/.travis.yml index ad0afd71b..766e6c237 100644 --- a/.travis.yml +++ b/.travis.yml @@ -97,10 +97,10 @@ matrix: compiler: clang env: COMPILER=clang - - os: osx - osx_image: beta-xcode6.3 - compiler: clang - env: COMPILER=clang + # - os: osx + # osx_image: beta-xcode6.3 + # compiler: clang + # env: COMPILER=clang - os: osx osx_image: xcode6.4 From 6bdb883b5c5cc41331ff6807aa6ef4dc62bbb4ec Mon Sep 17 00:00:00 2001 From: Niels Date: Sun, 29 May 2016 13:32:36 +0200 Subject: [PATCH 079/133] ignore build errors for coverity-scan --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 766e6c237..6d23a0dd8 100644 --- a/.travis.yml +++ b/.travis.yml @@ -40,7 +40,7 @@ matrix: description: "Build submitted via Travis CI" notification_email: niels.lohmann@gmail.com build_command_prepend: "make clean ; sudo cp $(which g++-5) $(which g++)" - build_command: "make doctest" + build_command: "make doctest || true" branch_pattern: coverity_scan env: COMPILER=g++-5 From aa8aa3ba9fbb02b5aa6e8d02831fe128d49043be Mon Sep 17 00:00:00 2001 From: Niels Date: Sun, 29 May 2016 14:06:43 +0200 Subject: [PATCH 080/133] overworked coverity stuffy --- .travis.yml | 16 ++++++++-------- Makefile | 8 +++++++- doc/Makefile | 10 +++++++--- 3 files changed, 22 insertions(+), 12 deletions(-) diff --git a/.travis.yml b/.travis.yml index 6d23a0dd8..49d9efd4b 100644 --- a/.travis.yml +++ b/.travis.yml @@ -40,7 +40,7 @@ matrix: description: "Build submitted via Travis CI" notification_email: niels.lohmann@gmail.com build_command_prepend: "make clean ; sudo cp $(which g++-5) $(which g++)" - build_command: "make doctest || true" + build_command: "make coverity" branch_pattern: coverity_scan env: COMPILER=g++-5 @@ -79,13 +79,13 @@ matrix: packages: ['clang-3.8', 'valgrind'] env: COMPILER=clang++-3.8 - - os: linux - compiler: clang - addons: - apt: - sources: ['ubuntu-toolchain-r-test', 'llvm-toolchain-precise'] - packages: ['clang-3.9', 'valgrind'] - env: COMPILER=clang++-3.9 + # - os: linux + # compiler: clang + # addons: + # apt: + # sources: ['ubuntu-toolchain-r-test', 'llvm-toolchain-precise'] + # packages: ['clang-3.9', 'valgrind'] + # env: COMPILER=clang++-3.9 - os: osx osx_image: beta-xcode6.1 diff --git a/Makefile b/Makefile index 6fdc06b9d..0a52b22da 100644 --- a/Makefile +++ b/Makefile @@ -10,6 +10,7 @@ all: json_unit # clean up clean: rm -fr json_unit json_benchmarks fuzz fuzz-testing *.dSYM + $(MAKE) clean -Cdoc ########################################################################## @@ -30,7 +31,12 @@ json_unit: test/src/unit.cpp src/json.hpp test/src/catch.hpp # compile example files and check output doctest: - make check_output -C doc + $(MAKE) check_output -C doc + + +# copmpile example files and do not check output (for coverity-scan) +coverity: + $(MAKE) compile_only -Cdoc CXXFLAGS="-std=c++11" CPPFLAGS="-I../src" ########################################################################## diff --git a/doc/Makefile b/doc/Makefile index dc10f1dd1..a34a0798d 100644 --- a/doc/Makefile +++ b/doc/Makefile @@ -2,9 +2,6 @@ SRCDIR = ../src all: doxygen -clean: - rm -fr me.nlohmann.json.docset html - ########################################################################## # example files @@ -40,10 +37,17 @@ create_output: $(EXAMPLES:.cpp=.output) create_links: $(EXAMPLES:.cpp=.link) +# only compile files +compile_only: $(EXAMPLES:.cpp=) + # check output of all stand-alone example files check_output: $(EXAMPLES:.cpp=.test) +clean: + rm -fr me.nlohmann.json.docset html $(EXAMPLES:.cpp=) + + ########################################################################## # Doxygen HTML documentation ########################################################################## From 04e1e7b5865562c086c9fc02023de0a780c5e669 Mon Sep 17 00:00:00 2001 From: Niels Date: Sun, 29 May 2016 14:56:08 +0200 Subject: [PATCH 081/133] cleanup --- .github/CONTRIBUTING.md | 1 - .travis.yml | 2 +- Makefile | 5 ----- README.md | 1 + doc/Makefile | 3 --- 5 files changed, 2 insertions(+), 10 deletions(-) diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md index 37876be9c..66420e9ac 100644 --- a/.github/CONTRIBUTING.md +++ b/.github/CONTRIBUTING.md @@ -73,4 +73,3 @@ The following areas really need contribution: - Extending the **continuous integration** toward more exotic compilers such as Android NDK, Intel's Compiler, or the bleeding-edge versions of GCC or Clang. - Improving the efficiency of the **JSON parser**. The current parser is implemented as a naive recursive descent parser with hand coded string handling. More sophisticated approaches like LALR parsers would be really appreciated. That said, parser generators like Bison or ANTLR do not play nice with single-header files -- I really would like to keep the parser inside the `json.hpp` header, and I am not aware of approaches similar to [`re2c`](http://re2c.org) for parsing. - Extending and updating existing **benchmarks** to include (the most recent version of) this library. Though efficiency is not everything, speed and memory consumption are very important characteristics for C++ developers, so having proper comparisons would be interesting. -- Check the code with [**Coverity**](https://scan.coverity.com). diff --git a/.travis.yml b/.travis.yml index 49d9efd4b..249a87574 100644 --- a/.travis.yml +++ b/.travis.yml @@ -40,7 +40,7 @@ matrix: description: "Build submitted via Travis CI" notification_email: niels.lohmann@gmail.com build_command_prepend: "make clean ; sudo cp $(which g++-5) $(which g++)" - build_command: "make coverity" + build_command: "make" branch_pattern: coverity_scan env: COMPILER=g++-5 diff --git a/Makefile b/Makefile index 0a52b22da..6ea1d85d9 100644 --- a/Makefile +++ b/Makefile @@ -34,11 +34,6 @@ doctest: $(MAKE) check_output -C doc -# copmpile example files and do not check output (for coverity-scan) -coverity: - $(MAKE) compile_only -Cdoc CXXFLAGS="-std=c++11" CPPFLAGS="-I../src" - - ########################################################################## # fuzzing ########################################################################## diff --git a/README.md b/README.md index ba11b70e0..768943878 100644 --- a/README.md +++ b/README.md @@ -3,6 +3,7 @@ [![Build Status](https://travis-ci.org/nlohmann/json.svg?branch=master)](https://travis-ci.org/nlohmann/json) [![Build Status](https://ci.appveyor.com/api/projects/status/1acb366xfyg3qybk?svg=true)](https://ci.appveyor.com/project/nlohmann/json) [![Coverage Status](https://img.shields.io/coveralls/nlohmann/json.svg)](https://coveralls.io/r/nlohmann/json) +[![Coverity Scan Build Status](https://scan.coverity.com/projects/5550/badge.svg)](https://scan.coverity.com/projects/nlohmann-json) [![Try online](https://img.shields.io/badge/try-online-blue.svg)](http://melpon.org/wandbox/permlink/wuiuqYiYqRTdI3rG) [![Documentation](https://img.shields.io/badge/docs-doxygen-blue.svg)](http://nlohmann.github.io/json) [![GitHub license](https://img.shields.io/badge/license-MIT-blue.svg)](https://raw.githubusercontent.com/nlohmann/json/master/LICENSE.MIT) diff --git a/doc/Makefile b/doc/Makefile index a34a0798d..5e5459a00 100644 --- a/doc/Makefile +++ b/doc/Makefile @@ -37,9 +37,6 @@ create_output: $(EXAMPLES:.cpp=.output) create_links: $(EXAMPLES:.cpp=.link) -# only compile files -compile_only: $(EXAMPLES:.cpp=) - # check output of all stand-alone example files check_output: $(EXAMPLES:.cpp=.test) From b508d1f1c4b1b282cf56d7880a31519fce82268b Mon Sep 17 00:00:00 2001 From: Niels Date: Mon, 6 Jun 2016 18:50:39 +0200 Subject: [PATCH 082/133] fix proposal for #260 --- src/json.hpp | 4 ++-- src/json.hpp.re2c | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/json.hpp b/src/json.hpp index 436467632..a8902bdb0 100644 --- a/src/json.hpp +++ b/src/json.hpp @@ -8497,13 +8497,13 @@ basic_json_parser_63: if (*curptr == '-') { type = value_t::number_integer; - max = static_cast(std::numeric_limits::max()) + 1; + max = static_cast((std::numeric_limits::max)()) + 1; curptr++; } else { type = value_t::number_unsigned; - max = static_cast(std::numeric_limits::max()); + max = static_cast((std::numeric_limits::max())); } // count the significant figures diff --git a/src/json.hpp.re2c b/src/json.hpp.re2c index ba4fc007b..9fe8ca683 100644 --- a/src/json.hpp.re2c +++ b/src/json.hpp.re2c @@ -7807,13 +7807,13 @@ class basic_json if (*curptr == '-') { type = value_t::number_integer; - max = static_cast(std::numeric_limits::max()) + 1; + max = static_cast((std::numeric_limits::max)()) + 1; curptr++; } else { type = value_t::number_unsigned; - max = static_cast(std::numeric_limits::max()); + max = static_cast((std::numeric_limits::max())); } // count the significant figures From 9e2dfd19e8429356b9941d61afc03d7d4ab2cb28 Mon Sep 17 00:00:00 2001 From: Niels Date: Tue, 7 Jun 2016 00:20:53 +0200 Subject: [PATCH 083/133] minor cleanup --- src/json.hpp | 17 +++++++++-------- src/json.hpp.re2c | 17 +++++++++-------- 2 files changed, 18 insertions(+), 16 deletions(-) diff --git a/src/json.hpp b/src/json.hpp index 436467632..9312c4f42 100644 --- a/src/json.hpp +++ b/src/json.hpp @@ -1461,13 +1461,13 @@ class basic_json @since version 2.0.0 */ - template < typename CompatibleNumberUnsignedType, typename - std::enable_if < - std::is_constructible::value and - std::numeric_limits::is_integer and - !std::numeric_limits::is_signed, - CompatibleNumberUnsignedType >::type - = 0 > + template ::value and + std::numeric_limits::is_integer and + not std::numeric_limits::is_signed, + CompatibleNumberUnsignedType>::type + = 0> basic_json(const CompatibleNumberUnsignedType val) noexcept : m_type(value_t::number_unsigned), m_value(static_cast(val)) @@ -5079,6 +5079,7 @@ class basic_json throw std::domain_error("iterator does not fit current value"); } + // check if range iterators belong to the same JSON object if (first.m_object != last.m_object) { throw std::domain_error("iterators do not fit"); @@ -7332,7 +7333,7 @@ class basic_json @return string representation of the code point - @throw std::out_of_range if code point is >0x10ffff; example: `"code + @throw std::out_of_range if code point is > 0x10ffff; example: `"code points above 0x10FFFF are invalid"` @throw std::invalid_argument if the low surrogate is invalid; example: `""missing or wrong low surrogate""` diff --git a/src/json.hpp.re2c b/src/json.hpp.re2c index ba4fc007b..2ab300ecc 100644 --- a/src/json.hpp.re2c +++ b/src/json.hpp.re2c @@ -1461,13 +1461,13 @@ class basic_json @since version 2.0.0 */ - template < typename CompatibleNumberUnsignedType, typename - std::enable_if < - std::is_constructible::value and - std::numeric_limits::is_integer and - !std::numeric_limits::is_signed, - CompatibleNumberUnsignedType >::type - = 0 > + template ::value and + std::numeric_limits::is_integer and + not std::numeric_limits::is_signed, + CompatibleNumberUnsignedType>::type + = 0> basic_json(const CompatibleNumberUnsignedType val) noexcept : m_type(value_t::number_unsigned), m_value(static_cast(val)) @@ -5079,6 +5079,7 @@ class basic_json throw std::domain_error("iterator does not fit current value"); } + // check if range iterators belong to the same JSON object if (first.m_object != last.m_object) { throw std::domain_error("iterators do not fit"); @@ -7332,7 +7333,7 @@ class basic_json @return string representation of the code point - @throw std::out_of_range if code point is >0x10ffff; example: `"code + @throw std::out_of_range if code point is > 0x10ffff; example: `"code points above 0x10FFFF are invalid"` @throw std::invalid_argument if the low surrogate is invalid; example: `""missing or wrong low surrogate""` From 744bae7fc4eac70d01f83bdcd055880234b8ad37 Mon Sep 17 00:00:00 2001 From: Niels Date: Tue, 7 Jun 2016 07:00:31 +0200 Subject: [PATCH 084/133] trying to fix Travis --- .travis.yml | 65 +++++++++++++++++++++++++++++++---------------------- 1 file changed, 38 insertions(+), 27 deletions(-) diff --git a/.travis.yml b/.travis.yml index 249a87574..ccba5fd14 100644 --- a/.travis.yml +++ b/.travis.yml @@ -44,6 +44,17 @@ matrix: branch_pattern: coverity_scan env: COMPILER=g++-5 + # from https://github.com/travis-ci/travis-ci/issues/6120 + - os: linux + before_install: + - LLVM_VERSION=3.7.0 + - LLVM_ARCHIVE_PATH=$HOME/clang+llvm.tar.xz + - wget http://llvm.org/releases/$LLVM_VERSION/clang+llvm-$LLVM_VERSION-x86_64-linux-gnu-ubuntu-14.04.tar.xz -O $LLVM_ARCHIVE_PATH + - mkdir $HOME/clang+llvm + - tar xf $LLVM_ARCHIVE_PATH -C $HOME/clang+llvm --strip-components 1 + - export PATH=$HOME/clang+llvm/bin:$PATH + env: COMPILER=clang++ + # - os: linux # compiler: gcc # addons: @@ -55,29 +66,29 @@ matrix: # Clang 3.5 is not able to compile the code, # see https://travis-ci.org/nlohmann/json/jobs/126720186 - - os: linux - compiler: clang - addons: - apt: - sources: ['ubuntu-toolchain-r-test', 'llvm-toolchain-precise-3.6'] - packages: ['clang-3.6', 'valgrind'] - env: COMPILER=clang++-3.6 - - - os: linux - compiler: clang - addons: - apt: - sources: ['ubuntu-toolchain-r-test', 'llvm-toolchain-precise-3.7'] - packages: ['clang-3.7', 'valgrind'] - env: COMPILER=clang++-3.7 - - - os: linux - compiler: clang - addons: - apt: - sources: ['ubuntu-toolchain-r-test', 'llvm-toolchain-precise-3.8'] - packages: ['clang-3.8', 'valgrind'] - env: COMPILER=clang++-3.8 +# - os: linux +# compiler: clang +# addons: +# apt: +# sources: ['ubuntu-toolchain-r-test', 'llvm-toolchain-precise-3.6'] +# packages: ['clang-3.6', 'valgrind'] +# env: COMPILER=clang++-3.6 +# +# - os: linux +# compiler: clang +# addons: +# apt: +# sources: ['ubuntu-toolchain-r-test', 'llvm-toolchain-precise-3.7'] +# packages: ['clang-3.7', 'valgrind'] +# env: COMPILER=clang++-3.7 +# +# - os: linux +# compiler: clang +# addons: +# apt: +# sources: ['ubuntu-toolchain-r-test', 'llvm-toolchain-precise-3.8'] +# packages: ['clang-3.8', 'valgrind'] +# env: COMPILER=clang++-3.8 # - os: linux # compiler: clang @@ -97,10 +108,10 @@ matrix: compiler: clang env: COMPILER=clang - # - os: osx - # osx_image: beta-xcode6.3 - # compiler: clang - # env: COMPILER=clang + - os: osx + osx_image: beta-xcode6.3 + compiler: clang + env: COMPILER=clang - os: osx osx_image: xcode6.4 From 5173c1622282abef3c0aaccf6d52b72a3398e5b5 Mon Sep 17 00:00:00 2001 From: Niels Date: Tue, 7 Jun 2016 07:07:42 +0200 Subject: [PATCH 085/133] another try --- .travis.yml | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/.travis.yml b/.travis.yml index ccba5fd14..007d6bb04 100644 --- a/.travis.yml +++ b/.travis.yml @@ -50,10 +50,18 @@ matrix: - LLVM_VERSION=3.7.0 - LLVM_ARCHIVE_PATH=$HOME/clang+llvm.tar.xz - wget http://llvm.org/releases/$LLVM_VERSION/clang+llvm-$LLVM_VERSION-x86_64-linux-gnu-ubuntu-14.04.tar.xz -O $LLVM_ARCHIVE_PATH - - mkdir $HOME/clang+llvm - - tar xf $LLVM_ARCHIVE_PATH -C $HOME/clang+llvm --strip-components 1 - - export PATH=$HOME/clang+llvm/bin:$PATH - env: COMPILER=clang++ + - mkdir $HOME/clang-$LLVM_VERSION + - tar xf $LLVM_ARCHIVE_PATH -C $HOME/clang-$LLVM_VERSION --strip-components 1 + env: COMPILER=$HOME/clang-$LLVM_VERSION/bin/clang++ + + - os: linux + before_install: + - LLVM_VERSION=3.8.0 + - LLVM_ARCHIVE_PATH=$HOME/clang+llvm.tar.xz + - wget http://llvm.org/releases/$LLVM_VERSION/clang+llvm-$LLVM_VERSION-x86_64-linux-gnu-ubuntu-14.04.tar.xz -O $LLVM_ARCHIVE_PATH + - mkdir $HOME/clang-$LLVM_VERSION + - tar xf $LLVM_ARCHIVE_PATH -C $HOME/clang-$LLVM_VERSION --strip-components 1 + env: COMPILER=$HOME/clang-$LLVM_VERSION/bin/clang++ # - os: linux # compiler: gcc From e772f06f0d391782f8c1dbf27f1f2e839fa99220 Mon Sep 17 00:00:00 2001 From: Niels Date: Tue, 7 Jun 2016 07:14:54 +0200 Subject: [PATCH 086/133] another try --- .travis.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.travis.yml b/.travis.yml index 007d6bb04..f577ce8c2 100644 --- a/.travis.yml +++ b/.travis.yml @@ -47,8 +47,8 @@ matrix: # from https://github.com/travis-ci/travis-ci/issues/6120 - os: linux before_install: - - LLVM_VERSION=3.7.0 - - LLVM_ARCHIVE_PATH=$HOME/clang+llvm.tar.xz + - export LLVM_VERSION=3.7.0 + - export LLVM_ARCHIVE_PATH=$HOME/clang+llvm.tar.xz - wget http://llvm.org/releases/$LLVM_VERSION/clang+llvm-$LLVM_VERSION-x86_64-linux-gnu-ubuntu-14.04.tar.xz -O $LLVM_ARCHIVE_PATH - mkdir $HOME/clang-$LLVM_VERSION - tar xf $LLVM_ARCHIVE_PATH -C $HOME/clang-$LLVM_VERSION --strip-components 1 @@ -56,8 +56,8 @@ matrix: - os: linux before_install: - - LLVM_VERSION=3.8.0 - - LLVM_ARCHIVE_PATH=$HOME/clang+llvm.tar.xz + - export LLVM_VERSION=3.8.0 + - export LLVM_ARCHIVE_PATH=$HOME/clang+llvm.tar.xz - wget http://llvm.org/releases/$LLVM_VERSION/clang+llvm-$LLVM_VERSION-x86_64-linux-gnu-ubuntu-14.04.tar.xz -O $LLVM_ARCHIVE_PATH - mkdir $HOME/clang-$LLVM_VERSION - tar xf $LLVM_ARCHIVE_PATH -C $HOME/clang-$LLVM_VERSION --strip-components 1 From f4ae8f8e2e9ceeab02b8be6549f1bca51b28eb87 Mon Sep 17 00:00:00 2001 From: Niels Date: Tue, 7 Jun 2016 07:21:17 +0200 Subject: [PATCH 087/133] another try --- .travis.yml | 16 ++++------------ 1 file changed, 4 insertions(+), 12 deletions(-) diff --git a/.travis.yml b/.travis.yml index f577ce8c2..29fc44592 100644 --- a/.travis.yml +++ b/.travis.yml @@ -46,22 +46,14 @@ matrix: # from https://github.com/travis-ci/travis-ci/issues/6120 - os: linux + env: + - LLVM_VERSION=3.7.0 + - LLVM_ARCHIVE_PATH=$HOME/clang+llvm.tar.xz + - COMPILER=$HOME/clang-$LLVM_VERSION/bin/clang++ before_install: - - export LLVM_VERSION=3.7.0 - - export LLVM_ARCHIVE_PATH=$HOME/clang+llvm.tar.xz - wget http://llvm.org/releases/$LLVM_VERSION/clang+llvm-$LLVM_VERSION-x86_64-linux-gnu-ubuntu-14.04.tar.xz -O $LLVM_ARCHIVE_PATH - mkdir $HOME/clang-$LLVM_VERSION - tar xf $LLVM_ARCHIVE_PATH -C $HOME/clang-$LLVM_VERSION --strip-components 1 - env: COMPILER=$HOME/clang-$LLVM_VERSION/bin/clang++ - - - os: linux - before_install: - - export LLVM_VERSION=3.8.0 - - export LLVM_ARCHIVE_PATH=$HOME/clang+llvm.tar.xz - - wget http://llvm.org/releases/$LLVM_VERSION/clang+llvm-$LLVM_VERSION-x86_64-linux-gnu-ubuntu-14.04.tar.xz -O $LLVM_ARCHIVE_PATH - - mkdir $HOME/clang-$LLVM_VERSION - - tar xf $LLVM_ARCHIVE_PATH -C $HOME/clang-$LLVM_VERSION --strip-components 1 - env: COMPILER=$HOME/clang-$LLVM_VERSION/bin/clang++ # - os: linux # compiler: gcc From 32f6682177e31fa7b25d21615c44cde219ae3ba3 Mon Sep 17 00:00:00 2001 From: Niels Date: Tue, 7 Jun 2016 07:25:11 +0200 Subject: [PATCH 088/133] another try --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 29fc44592..8fe3cf6d2 100644 --- a/.travis.yml +++ b/.travis.yml @@ -47,7 +47,7 @@ matrix: # from https://github.com/travis-ci/travis-ci/issues/6120 - os: linux env: - - LLVM_VERSION=3.7.0 + - LLVM_VERSION=3.8.0 - LLVM_ARCHIVE_PATH=$HOME/clang+llvm.tar.xz - COMPILER=$HOME/clang-$LLVM_VERSION/bin/clang++ before_install: From dfc39b95ab9becac9385c1569ce1c05bd6a2d723 Mon Sep 17 00:00:00 2001 From: Niels Date: Tue, 7 Jun 2016 07:54:00 +0200 Subject: [PATCH 089/133] clang does not work with travis right now --- .travis.yml | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/.travis.yml b/.travis.yml index 8fe3cf6d2..7f2dd9b65 100644 --- a/.travis.yml +++ b/.travis.yml @@ -44,16 +44,16 @@ matrix: branch_pattern: coverity_scan env: COMPILER=g++-5 - # from https://github.com/travis-ci/travis-ci/issues/6120 - - os: linux - env: - - LLVM_VERSION=3.8.0 - - LLVM_ARCHIVE_PATH=$HOME/clang+llvm.tar.xz - - COMPILER=$HOME/clang-$LLVM_VERSION/bin/clang++ - before_install: - - wget http://llvm.org/releases/$LLVM_VERSION/clang+llvm-$LLVM_VERSION-x86_64-linux-gnu-ubuntu-14.04.tar.xz -O $LLVM_ARCHIVE_PATH - - mkdir $HOME/clang-$LLVM_VERSION - - tar xf $LLVM_ARCHIVE_PATH -C $HOME/clang-$LLVM_VERSION --strip-components 1 +# # from https://github.com/travis-ci/travis-ci/issues/6120 +# - os: linux +# env: +# - LLVM_VERSION=3.8.0 +# - LLVM_ARCHIVE_PATH=$HOME/clang+llvm.tar.xz +# - COMPILER=$HOME/clang-$LLVM_VERSION/bin/clang++ +# before_install: +# - wget http://llvm.org/releases/$LLVM_VERSION/clang+llvm-$LLVM_VERSION-x86_64-linux-gnu-ubuntu-14.04.tar.xz -O $LLVM_ARCHIVE_PATH +# - mkdir $HOME/clang-$LLVM_VERSION +# - tar xf $LLVM_ARCHIVE_PATH -C $HOME/clang-$LLVM_VERSION --strip-components 1 # - os: linux # compiler: gcc From 1826d12a22e14f6ce00c1218685011eea982c83e Mon Sep 17 00:00:00 2001 From: Niels Date: Tue, 7 Jun 2016 08:28:50 +0200 Subject: [PATCH 090/133] added CPATH --- .travis.yml | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/.travis.yml b/.travis.yml index 7f2dd9b65..3bfe5eaaa 100644 --- a/.travis.yml +++ b/.travis.yml @@ -44,16 +44,17 @@ matrix: branch_pattern: coverity_scan env: COMPILER=g++-5 -# # from https://github.com/travis-ci/travis-ci/issues/6120 -# - os: linux -# env: -# - LLVM_VERSION=3.8.0 -# - LLVM_ARCHIVE_PATH=$HOME/clang+llvm.tar.xz -# - COMPILER=$HOME/clang-$LLVM_VERSION/bin/clang++ -# before_install: -# - wget http://llvm.org/releases/$LLVM_VERSION/clang+llvm-$LLVM_VERSION-x86_64-linux-gnu-ubuntu-14.04.tar.xz -O $LLVM_ARCHIVE_PATH -# - mkdir $HOME/clang-$LLVM_VERSION -# - tar xf $LLVM_ARCHIVE_PATH -C $HOME/clang-$LLVM_VERSION --strip-components 1 + # from https://github.com/travis-ci/travis-ci/issues/6120 + - os: linux + env: + - LLVM_VERSION=3.8.0 + - LLVM_ARCHIVE_PATH=$HOME/clang+llvm.tar.xz + - COMPILER=$HOME/clang-$LLVM_VERSION/bin/clang++ + - CPATH=$HOME/clang-$LLVM_VERSION/include + before_install: + - wget http://llvm.org/releases/$LLVM_VERSION/clang+llvm-$LLVM_VERSION-x86_64-linux-gnu-ubuntu-14.04.tar.xz -O $LLVM_ARCHIVE_PATH + - mkdir $HOME/clang-$LLVM_VERSION + - tar xf $LLVM_ARCHIVE_PATH -C $HOME/clang-$LLVM_VERSION --strip-components 1 # - os: linux # compiler: gcc From 761880f5b746f3d7040dd8b0da3e9121d573fc14 Mon Sep 17 00:00:00 2001 From: Niels Date: Tue, 7 Jun 2016 08:32:56 +0200 Subject: [PATCH 091/133] CPATH does not work... --- .travis.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index 3bfe5eaaa..26517d5c8 100644 --- a/.travis.yml +++ b/.travis.yml @@ -49,8 +49,7 @@ matrix: env: - LLVM_VERSION=3.8.0 - LLVM_ARCHIVE_PATH=$HOME/clang+llvm.tar.xz - - COMPILER=$HOME/clang-$LLVM_VERSION/bin/clang++ - - CPATH=$HOME/clang-$LLVM_VERSION/include + - COMPILER="$HOME/clang-$LLVM_VERSION/bin/clang++ -I$HOME/clang-$LLVM_VERSION/include" before_install: - wget http://llvm.org/releases/$LLVM_VERSION/clang+llvm-$LLVM_VERSION-x86_64-linux-gnu-ubuntu-14.04.tar.xz -O $LLVM_ARCHIVE_PATH - mkdir $HOME/clang-$LLVM_VERSION From dd542aae7d1e157a49de0748d8347756890e3b88 Mon Sep 17 00:00:00 2001 From: Niels Date: Tue, 7 Jun 2016 08:40:25 +0200 Subject: [PATCH 092/133] another try --- .travis.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 26517d5c8..76eeafbaf 100644 --- a/.travis.yml +++ b/.travis.yml @@ -49,7 +49,8 @@ matrix: env: - LLVM_VERSION=3.8.0 - LLVM_ARCHIVE_PATH=$HOME/clang+llvm.tar.xz - - COMPILER="$HOME/clang-$LLVM_VERSION/bin/clang++ -I$HOME/clang-$LLVM_VERSION/include" + - COMPILER=$HOME/clang-$LLVM_VERSION/bin/clang++ + - CPPFLAGS="-I $HOME/clang-$LLVM_VERSION/include" before_install: - wget http://llvm.org/releases/$LLVM_VERSION/clang+llvm-$LLVM_VERSION-x86_64-linux-gnu-ubuntu-14.04.tar.xz -O $LLVM_ARCHIVE_PATH - mkdir $HOME/clang-$LLVM_VERSION From dd10c89a3e8e0de8e995dc923e764ee5a6f6d2f4 Mon Sep 17 00:00:00 2001 From: Niels Date: Tue, 7 Jun 2016 08:53:36 +0200 Subject: [PATCH 093/133] another try --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 76eeafbaf..ce29a41bd 100644 --- a/.travis.yml +++ b/.travis.yml @@ -50,7 +50,7 @@ matrix: - LLVM_VERSION=3.8.0 - LLVM_ARCHIVE_PATH=$HOME/clang+llvm.tar.xz - COMPILER=$HOME/clang-$LLVM_VERSION/bin/clang++ - - CPPFLAGS="-I $HOME/clang-$LLVM_VERSION/include" + - CPPFLAGS="-I $HOME/clang-$LLVM_VERSION/include/c++/v1" before_install: - wget http://llvm.org/releases/$LLVM_VERSION/clang+llvm-$LLVM_VERSION-x86_64-linux-gnu-ubuntu-14.04.tar.xz -O $LLVM_ARCHIVE_PATH - mkdir $HOME/clang-$LLVM_VERSION From fbbdcb19bce6eadd0a675b560fdcb7dc4080eafc Mon Sep 17 00:00:00 2001 From: Niels Date: Tue, 7 Jun 2016 09:01:49 +0200 Subject: [PATCH 094/133] another try --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index ce29a41bd..9871b7d49 100644 --- a/.travis.yml +++ b/.travis.yml @@ -137,7 +137,7 @@ matrix: script: - uname -a - $COMPILER --version - - make CXX=$COMPILER CXXFLAGS="-lstdc++" + - make CXX=$COMPILER - ./json_unit "*" - if [ `which valgrind` ]; then valgrind --error-exitcode=1 --leak-check=full ./json_unit ; From 32cc6fefcc1c377d3a215f0c595f1f621e100070 Mon Sep 17 00:00:00 2001 From: Niels Date: Tue, 7 Jun 2016 09:12:53 +0200 Subject: [PATCH 095/133] another try --- .travis.yml | 29 ++++++++++++++++++++++------- 1 file changed, 22 insertions(+), 7 deletions(-) diff --git a/.travis.yml b/.travis.yml index 9871b7d49..76054da85 100644 --- a/.travis.yml +++ b/.travis.yml @@ -51,6 +51,7 @@ matrix: - LLVM_ARCHIVE_PATH=$HOME/clang+llvm.tar.xz - COMPILER=$HOME/clang-$LLVM_VERSION/bin/clang++ - CPPFLAGS="-I $HOME/clang-$LLVM_VERSION/include/c++/v1" + - CXXFLAGS=-lc++ before_install: - wget http://llvm.org/releases/$LLVM_VERSION/clang+llvm-$LLVM_VERSION-x86_64-linux-gnu-ubuntu-14.04.tar.xz -O $LLVM_ARCHIVE_PATH - mkdir $HOME/clang-$LLVM_VERSION @@ -102,37 +103,51 @@ matrix: - os: osx osx_image: beta-xcode6.1 compiler: clang - env: COMPILER=clang + env: + - COMPILER=clang + - CXXFLAGS=-lstdc++ - os: osx osx_image: beta-xcode6.2 compiler: clang - env: COMPILER=clang + env: + - COMPILER=clang + - CXXFLAGS=-lstdc++ - os: osx osx_image: beta-xcode6.3 compiler: clang - env: COMPILER=clang + env: + - COMPILER=clang + - CXXFLAGS=-lstdc++ - os: osx osx_image: xcode6.4 compiler: clang - env: COMPILER=clang + env: + - COMPILER=clang + - CXXFLAGS=-lstdc++ - os: osx osx_image: xcode7.1 compiler: clang - env: COMPILER=clang + env: + - COMPILER=clang + - CXXFLAGS=-lstdc++ - os: osx osx_image: xcode7.2 compiler: clang - env: COMPILER=clang + env: + - COMPILER=clang + - CXXFLAGS=-lstdc++ - os: osx osx_image: xcode7.3 compiler: clang - env: COMPILER=clang + env: + - COMPILER=clang + - CXXFLAGS=-lstdc++ script: - uname -a From f63317dce34ae34a9a26809ae277f867ac6b4348 Mon Sep 17 00:00:00 2001 From: Niels Date: Tue, 7 Jun 2016 09:34:46 +0200 Subject: [PATCH 096/133] another try --- .travis.yml | 27 +++++++++++++-------------- 1 file changed, 13 insertions(+), 14 deletions(-) diff --git a/.travis.yml b/.travis.yml index 76054da85..205606bef 100644 --- a/.travis.yml +++ b/.travis.yml @@ -23,10 +23,10 @@ matrix: after_success: - make clean - touch src/json.hpp - - make json_unit CXXFLAGS="-fprofile-arcs -ftest-coverage -std=c++11 -lstdc++" CXX=$COMPILER + - make json_unit CXXFLAGS="-fprofile-arcs -ftest-coverage -std=c++11 -lstdc++" - ./json_unit "*" - coveralls --exclude test/src/catch.hpp --exclude test/src/unit.cpp --include src/json.hpp --gcov-options '\-lp' --gcov 'gcov-4.9' - env: COMPILER=g++-4.9 + env: CXX=g++-4.9 - os: linux compiler: gcc @@ -42,16 +42,15 @@ matrix: build_command_prepend: "make clean ; sudo cp $(which g++-5) $(which g++)" build_command: "make" branch_pattern: coverity_scan - env: COMPILER=g++-5 + env: CXX=g++-5 # from https://github.com/travis-ci/travis-ci/issues/6120 - os: linux env: - LLVM_VERSION=3.8.0 - LLVM_ARCHIVE_PATH=$HOME/clang+llvm.tar.xz - - COMPILER=$HOME/clang-$LLVM_VERSION/bin/clang++ + - CXX=$HOME/clang-$LLVM_VERSION/bin/clang++ - CPPFLAGS="-I $HOME/clang-$LLVM_VERSION/include/c++/v1" - - CXXFLAGS=-lc++ before_install: - wget http://llvm.org/releases/$LLVM_VERSION/clang+llvm-$LLVM_VERSION-x86_64-linux-gnu-ubuntu-14.04.tar.xz -O $LLVM_ARCHIVE_PATH - mkdir $HOME/clang-$LLVM_VERSION @@ -104,55 +103,55 @@ matrix: osx_image: beta-xcode6.1 compiler: clang env: - - COMPILER=clang + - CXX=clang - CXXFLAGS=-lstdc++ - os: osx osx_image: beta-xcode6.2 compiler: clang env: - - COMPILER=clang + - CXX=clang - CXXFLAGS=-lstdc++ - os: osx osx_image: beta-xcode6.3 compiler: clang env: - - COMPILER=clang + - CXX=clang - CXXFLAGS=-lstdc++ - os: osx osx_image: xcode6.4 compiler: clang env: - - COMPILER=clang + - CXX=clang - CXXFLAGS=-lstdc++ - os: osx osx_image: xcode7.1 compiler: clang env: - - COMPILER=clang + - CXX=clang - CXXFLAGS=-lstdc++ - os: osx osx_image: xcode7.2 compiler: clang env: - - COMPILER=clang + - CXX=clang - CXXFLAGS=-lstdc++ - os: osx osx_image: xcode7.3 compiler: clang env: - - COMPILER=clang + - CXX=clang - CXXFLAGS=-lstdc++ script: - uname -a - - $COMPILER --version - - make CXX=$COMPILER + - $CXX --version + - make - ./json_unit "*" - if [ `which valgrind` ]; then valgrind --error-exitcode=1 --leak-check=full ./json_unit ; From 6d19bd1108551b1b4c41cb9e83e6b7f025cc5c7f Mon Sep 17 00:00:00 2001 From: Niels Date: Tue, 7 Jun 2016 09:49:11 +0200 Subject: [PATCH 097/133] Revert "another try" This reverts commit f63317dce34ae34a9a26809ae277f867ac6b4348. --- .travis.yml | 27 ++++++++++++++------------- 1 file changed, 14 insertions(+), 13 deletions(-) diff --git a/.travis.yml b/.travis.yml index 205606bef..76054da85 100644 --- a/.travis.yml +++ b/.travis.yml @@ -23,10 +23,10 @@ matrix: after_success: - make clean - touch src/json.hpp - - make json_unit CXXFLAGS="-fprofile-arcs -ftest-coverage -std=c++11 -lstdc++" + - make json_unit CXXFLAGS="-fprofile-arcs -ftest-coverage -std=c++11 -lstdc++" CXX=$COMPILER - ./json_unit "*" - coveralls --exclude test/src/catch.hpp --exclude test/src/unit.cpp --include src/json.hpp --gcov-options '\-lp' --gcov 'gcov-4.9' - env: CXX=g++-4.9 + env: COMPILER=g++-4.9 - os: linux compiler: gcc @@ -42,15 +42,16 @@ matrix: build_command_prepend: "make clean ; sudo cp $(which g++-5) $(which g++)" build_command: "make" branch_pattern: coverity_scan - env: CXX=g++-5 + env: COMPILER=g++-5 # from https://github.com/travis-ci/travis-ci/issues/6120 - os: linux env: - LLVM_VERSION=3.8.0 - LLVM_ARCHIVE_PATH=$HOME/clang+llvm.tar.xz - - CXX=$HOME/clang-$LLVM_VERSION/bin/clang++ + - COMPILER=$HOME/clang-$LLVM_VERSION/bin/clang++ - CPPFLAGS="-I $HOME/clang-$LLVM_VERSION/include/c++/v1" + - CXXFLAGS=-lc++ before_install: - wget http://llvm.org/releases/$LLVM_VERSION/clang+llvm-$LLVM_VERSION-x86_64-linux-gnu-ubuntu-14.04.tar.xz -O $LLVM_ARCHIVE_PATH - mkdir $HOME/clang-$LLVM_VERSION @@ -103,55 +104,55 @@ matrix: osx_image: beta-xcode6.1 compiler: clang env: - - CXX=clang + - COMPILER=clang - CXXFLAGS=-lstdc++ - os: osx osx_image: beta-xcode6.2 compiler: clang env: - - CXX=clang + - COMPILER=clang - CXXFLAGS=-lstdc++ - os: osx osx_image: beta-xcode6.3 compiler: clang env: - - CXX=clang + - COMPILER=clang - CXXFLAGS=-lstdc++ - os: osx osx_image: xcode6.4 compiler: clang env: - - CXX=clang + - COMPILER=clang - CXXFLAGS=-lstdc++ - os: osx osx_image: xcode7.1 compiler: clang env: - - CXX=clang + - COMPILER=clang - CXXFLAGS=-lstdc++ - os: osx osx_image: xcode7.2 compiler: clang env: - - CXX=clang + - COMPILER=clang - CXXFLAGS=-lstdc++ - os: osx osx_image: xcode7.3 compiler: clang env: - - CXX=clang + - COMPILER=clang - CXXFLAGS=-lstdc++ script: - uname -a - - $CXX --version - - make + - $COMPILER --version + - make CXX=$COMPILER - ./json_unit "*" - if [ `which valgrind` ]; then valgrind --error-exitcode=1 --leak-check=full ./json_unit ; From a97c998791fe9242763ad242585cc5050410f775 Mon Sep 17 00:00:00 2001 From: Niels Date: Tue, 7 Jun 2016 09:50:43 +0200 Subject: [PATCH 098/133] removed -lc++ --- .travis.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 76054da85..ed5b51976 100644 --- a/.travis.yml +++ b/.travis.yml @@ -51,7 +51,6 @@ matrix: - LLVM_ARCHIVE_PATH=$HOME/clang+llvm.tar.xz - COMPILER=$HOME/clang-$LLVM_VERSION/bin/clang++ - CPPFLAGS="-I $HOME/clang-$LLVM_VERSION/include/c++/v1" - - CXXFLAGS=-lc++ before_install: - wget http://llvm.org/releases/$LLVM_VERSION/clang+llvm-$LLVM_VERSION-x86_64-linux-gnu-ubuntu-14.04.tar.xz -O $LLVM_ARCHIVE_PATH - mkdir $HOME/clang-$LLVM_VERSION From 1f04c0349a85198c931c5279c9c313d2a62c2da0 Mon Sep 17 00:00:00 2001 From: Niels Date: Tue, 7 Jun 2016 10:03:18 +0200 Subject: [PATCH 099/133] readded -lc++ --- .travis.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.travis.yml b/.travis.yml index ed5b51976..76054da85 100644 --- a/.travis.yml +++ b/.travis.yml @@ -51,6 +51,7 @@ matrix: - LLVM_ARCHIVE_PATH=$HOME/clang+llvm.tar.xz - COMPILER=$HOME/clang-$LLVM_VERSION/bin/clang++ - CPPFLAGS="-I $HOME/clang-$LLVM_VERSION/include/c++/v1" + - CXXFLAGS=-lc++ before_install: - wget http://llvm.org/releases/$LLVM_VERSION/clang+llvm-$LLVM_VERSION-x86_64-linux-gnu-ubuntu-14.04.tar.xz -O $LLVM_ARCHIVE_PATH - mkdir $HOME/clang-$LLVM_VERSION From cc5cad5b0beabde812ec30ad99132f63b7002d5b Mon Sep 17 00:00:00 2001 From: Niels Date: Tue, 7 Jun 2016 10:53:18 +0200 Subject: [PATCH 100/133] another try --- .travis.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.travis.yml b/.travis.yml index 76054da85..b9fc27669 100644 --- a/.travis.yml +++ b/.travis.yml @@ -52,6 +52,7 @@ matrix: - COMPILER=$HOME/clang-$LLVM_VERSION/bin/clang++ - CPPFLAGS="-I $HOME/clang-$LLVM_VERSION/include/c++/v1" - CXXFLAGS=-lc++ + - LD_LIBRARY_PATH=$HOME/clang-$LLVM_VERSION/lib:$LD_LIBRARY_PATH before_install: - wget http://llvm.org/releases/$LLVM_VERSION/clang+llvm-$LLVM_VERSION-x86_64-linux-gnu-ubuntu-14.04.tar.xz -O $LLVM_ARCHIVE_PATH - mkdir $HOME/clang-$LLVM_VERSION From 31b24dd5c1f8dad25456218add4db080dc904142 Mon Sep 17 00:00:00 2001 From: Niels Date: Tue, 7 Jun 2016 11:02:45 +0200 Subject: [PATCH 101/133] adding more Clang versions --- .travis.yml | 104 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 104 insertions(+) diff --git a/.travis.yml b/.travis.yml index b9fc27669..828142907 100644 --- a/.travis.yml +++ b/.travis.yml @@ -58,6 +58,110 @@ matrix: - mkdir $HOME/clang-$LLVM_VERSION - tar xf $LLVM_ARCHIVE_PATH -C $HOME/clang-$LLVM_VERSION --strip-components 1 + - os: linux + env: + - LLVM_VERSION=3.7.1 + - LLVM_ARCHIVE_PATH=$HOME/clang+llvm.tar.xz + - COMPILER=$HOME/clang-$LLVM_VERSION/bin/clang++ + - CPPFLAGS="-I $HOME/clang-$LLVM_VERSION/include/c++/v1" + - CXXFLAGS=-lc++ + - LD_LIBRARY_PATH=$HOME/clang-$LLVM_VERSION/lib:$LD_LIBRARY_PATH + before_install: + - wget http://llvm.org/releases/$LLVM_VERSION/clang+llvm-$LLVM_VERSION-x86_64-linux-gnu-ubuntu-14.04.tar.xz -O $LLVM_ARCHIVE_PATH + - mkdir $HOME/clang-$LLVM_VERSION + - tar xf $LLVM_ARCHIVE_PATH -C $HOME/clang-$LLVM_VERSION --strip-components 1 + + - os: linux + env: + - LLVM_VERSION=3.7.0 + - LLVM_ARCHIVE_PATH=$HOME/clang+llvm.tar.xz + - COMPILER=$HOME/clang-$LLVM_VERSION/bin/clang++ + - CPPFLAGS="-I $HOME/clang-$LLVM_VERSION/include/c++/v1" + - CXXFLAGS=-lc++ + - LD_LIBRARY_PATH=$HOME/clang-$LLVM_VERSION/lib:$LD_LIBRARY_PATH + before_install: + - wget http://llvm.org/releases/$LLVM_VERSION/clang+llvm-$LLVM_VERSION-x86_64-linux-gnu-ubuntu-14.04.tar.xz -O $LLVM_ARCHIVE_PATH + - mkdir $HOME/clang-$LLVM_VERSION + - tar xf $LLVM_ARCHIVE_PATH -C $HOME/clang-$LLVM_VERSION --strip-components 1 + + - os: linux + env: + - LLVM_VERSION=3.6.2 + - LLVM_ARCHIVE_PATH=$HOME/clang+llvm.tar.xz + - COMPILER=$HOME/clang-$LLVM_VERSION/bin/clang++ + - CPPFLAGS="-I $HOME/clang-$LLVM_VERSION/include/c++/v1" + - CXXFLAGS=-lc++ + - LD_LIBRARY_PATH=$HOME/clang-$LLVM_VERSION/lib:$LD_LIBRARY_PATH + before_install: + - wget http://llvm.org/releases/$LLVM_VERSION/clang+llvm-$LLVM_VERSION-x86_64-linux-gnu-ubuntu-14.04.tar.xz -O $LLVM_ARCHIVE_PATH + - mkdir $HOME/clang-$LLVM_VERSION + - tar xf $LLVM_ARCHIVE_PATH -C $HOME/clang-$LLVM_VERSION --strip-components 1 + + - os: linux + env: + - LLVM_VERSION=3.6.1 + - LLVM_ARCHIVE_PATH=$HOME/clang+llvm.tar.xz + - COMPILER=$HOME/clang-$LLVM_VERSION/bin/clang++ + - CPPFLAGS="-I $HOME/clang-$LLVM_VERSION/include/c++/v1" + - CXXFLAGS=-lc++ + - LD_LIBRARY_PATH=$HOME/clang-$LLVM_VERSION/lib:$LD_LIBRARY_PATH + before_install: + - wget http://llvm.org/releases/$LLVM_VERSION/clang+llvm-$LLVM_VERSION-x86_64-linux-gnu-ubuntu-14.04.tar.xz -O $LLVM_ARCHIVE_PATH + - mkdir $HOME/clang-$LLVM_VERSION + - tar xf $LLVM_ARCHIVE_PATH -C $HOME/clang-$LLVM_VERSION --strip-components 1 + + - os: linux + env: + - LLVM_VERSION=3.6.0 + - LLVM_ARCHIVE_PATH=$HOME/clang+llvm.tar.xz + - COMPILER=$HOME/clang-$LLVM_VERSION/bin/clang++ + - CPPFLAGS="-I $HOME/clang-$LLVM_VERSION/include/c++/v1" + - CXXFLAGS=-lc++ + - LD_LIBRARY_PATH=$HOME/clang-$LLVM_VERSION/lib:$LD_LIBRARY_PATH + before_install: + - wget http://llvm.org/releases/$LLVM_VERSION/clang+llvm-$LLVM_VERSION-x86_64-linux-gnu-ubuntu-14.04.tar.xz -O $LLVM_ARCHIVE_PATH + - mkdir $HOME/clang-$LLVM_VERSION + - tar xf $LLVM_ARCHIVE_PATH -C $HOME/clang-$LLVM_VERSION --strip-components 1 + + - os: linux + env: + - LLVM_VERSION=3.5.2 + - LLVM_ARCHIVE_PATH=$HOME/clang+llvm.tar.xz + - COMPILER=$HOME/clang-$LLVM_VERSION/bin/clang++ + - CPPFLAGS="-I $HOME/clang-$LLVM_VERSION/include/c++/v1" + - CXXFLAGS=-lc++ + - LD_LIBRARY_PATH=$HOME/clang-$LLVM_VERSION/lib:$LD_LIBRARY_PATH + before_install: + - wget http://llvm.org/releases/$LLVM_VERSION/clang+llvm-$LLVM_VERSION-x86_64-linux-gnu-ubuntu-14.04.tar.xz -O $LLVM_ARCHIVE_PATH + - mkdir $HOME/clang-$LLVM_VERSION + - tar xf $LLVM_ARCHIVE_PATH -C $HOME/clang-$LLVM_VERSION --strip-components 1 + + - os: linux + env: + - LLVM_VERSION=3.5.1 + - LLVM_ARCHIVE_PATH=$HOME/clang+llvm.tar.xz + - COMPILER=$HOME/clang-$LLVM_VERSION/bin/clang++ + - CPPFLAGS="-I $HOME/clang-$LLVM_VERSION/include/c++/v1" + - CXXFLAGS=-lc++ + - LD_LIBRARY_PATH=$HOME/clang-$LLVM_VERSION/lib:$LD_LIBRARY_PATH + before_install: + - wget http://llvm.org/releases/$LLVM_VERSION/clang+llvm-$LLVM_VERSION-x86_64-linux-gnu-ubuntu-14.04.tar.xz -O $LLVM_ARCHIVE_PATH + - mkdir $HOME/clang-$LLVM_VERSION + - tar xf $LLVM_ARCHIVE_PATH -C $HOME/clang-$LLVM_VERSION --strip-components 1 + + - os: linux + env: + - LLVM_VERSION=3.5.0 + - LLVM_ARCHIVE_PATH=$HOME/clang+llvm.tar.xz + - COMPILER=$HOME/clang-$LLVM_VERSION/bin/clang++ + - CPPFLAGS="-I $HOME/clang-$LLVM_VERSION/include/c++/v1" + - CXXFLAGS=-lc++ + - LD_LIBRARY_PATH=$HOME/clang-$LLVM_VERSION/lib:$LD_LIBRARY_PATH + before_install: + - wget http://llvm.org/releases/$LLVM_VERSION/clang+llvm-$LLVM_VERSION-x86_64-linux-gnu-ubuntu-14.04.tar.xz -O $LLVM_ARCHIVE_PATH + - mkdir $HOME/clang-$LLVM_VERSION + - tar xf $LLVM_ARCHIVE_PATH -C $HOME/clang-$LLVM_VERSION --strip-components 1 + # - os: linux # compiler: gcc # addons: From ff8f196ca323e4624a27ec61bbd1a01fecec719c Mon Sep 17 00:00:00 2001 From: Niels Date: Tue, 7 Jun 2016 11:13:15 +0200 Subject: [PATCH 102/133] a test --- .travis.yml | 2 -- 1 file changed, 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index 828142907..7d2837f47 100644 --- a/.travis.yml +++ b/.travis.yml @@ -155,8 +155,6 @@ matrix: - LLVM_ARCHIVE_PATH=$HOME/clang+llvm.tar.xz - COMPILER=$HOME/clang-$LLVM_VERSION/bin/clang++ - CPPFLAGS="-I $HOME/clang-$LLVM_VERSION/include/c++/v1" - - CXXFLAGS=-lc++ - - LD_LIBRARY_PATH=$HOME/clang-$LLVM_VERSION/lib:$LD_LIBRARY_PATH before_install: - wget http://llvm.org/releases/$LLVM_VERSION/clang+llvm-$LLVM_VERSION-x86_64-linux-gnu-ubuntu-14.04.tar.xz -O $LLVM_ARCHIVE_PATH - mkdir $HOME/clang-$LLVM_VERSION From a4058b88ecc9d6a8aaff4374031514d40673364a Mon Sep 17 00:00:00 2001 From: Niels Date: Tue, 7 Jun 2016 11:14:02 +0200 Subject: [PATCH 103/133] another test --- .travis.yml | 13 ------------- 1 file changed, 13 deletions(-) diff --git a/.travis.yml b/.travis.yml index 7d2837f47..7f0f6ed71 100644 --- a/.travis.yml +++ b/.travis.yml @@ -136,19 +136,6 @@ matrix: - mkdir $HOME/clang-$LLVM_VERSION - tar xf $LLVM_ARCHIVE_PATH -C $HOME/clang-$LLVM_VERSION --strip-components 1 - - os: linux - env: - - LLVM_VERSION=3.5.1 - - LLVM_ARCHIVE_PATH=$HOME/clang+llvm.tar.xz - - COMPILER=$HOME/clang-$LLVM_VERSION/bin/clang++ - - CPPFLAGS="-I $HOME/clang-$LLVM_VERSION/include/c++/v1" - - CXXFLAGS=-lc++ - - LD_LIBRARY_PATH=$HOME/clang-$LLVM_VERSION/lib:$LD_LIBRARY_PATH - before_install: - - wget http://llvm.org/releases/$LLVM_VERSION/clang+llvm-$LLVM_VERSION-x86_64-linux-gnu-ubuntu-14.04.tar.xz -O $LLVM_ARCHIVE_PATH - - mkdir $HOME/clang-$LLVM_VERSION - - tar xf $LLVM_ARCHIVE_PATH -C $HOME/clang-$LLVM_VERSION --strip-components 1 - - os: linux env: - LLVM_VERSION=3.5.0 From c425dc9e04f9a0ad08eb5c2e38abf537ff026bcc Mon Sep 17 00:00:00 2001 From: Niels Date: Tue, 7 Jun 2016 11:25:00 +0200 Subject: [PATCH 104/133] trying to install clang --- .travis.yml | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/.travis.yml b/.travis.yml index 7f0f6ed71..71d69037d 100644 --- a/.travis.yml +++ b/.travis.yml @@ -45,6 +45,18 @@ matrix: env: COMPILER=g++-5 # from https://github.com/travis-ci/travis-ci/issues/6120 + - os: linux + env: + - LLVM_VERSION=3.8.0 + - LLVM_ARCHIVE_PATH=$HOME/clang+llvm.tar.xz + - COMPILER=clang++ + - CXXFLAGS=-lc++ + before_install: + - wget http://llvm.org/releases/$LLVM_VERSION/clang+llvm-$LLVM_VERSION-x86_64-linux-gnu-ubuntu-14.04.tar.xz -O $LLVM_ARCHIVE_PATH + - mkdir $HOME/clang-$LLVM_VERSION + - tar xf $LLVM_ARCHIVE_PATH -C $HOME/clang-$LLVM_VERSION --strip-components 1 + - cd $HOME/clang-$LLVM_VERSION ; sudo cp -R * /usr/local/ + - os: linux env: - LLVM_VERSION=3.8.0 From 62f39c41ecaf5e90e891a772d3e4b40b1cda8fe5 Mon Sep 17 00:00:00 2001 From: Niels Date: Tue, 7 Jun 2016 11:29:37 +0200 Subject: [PATCH 105/133] another try --- .travis.yml | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/.travis.yml b/.travis.yml index 71d69037d..f3a074bef 100644 --- a/.travis.yml +++ b/.travis.yml @@ -48,14 +48,11 @@ matrix: - os: linux env: - LLVM_VERSION=3.8.0 - - LLVM_ARCHIVE_PATH=$HOME/clang+llvm.tar.xz - COMPILER=clang++ - CXXFLAGS=-lc++ before_install: - - wget http://llvm.org/releases/$LLVM_VERSION/clang+llvm-$LLVM_VERSION-x86_64-linux-gnu-ubuntu-14.04.tar.xz -O $LLVM_ARCHIVE_PATH - - mkdir $HOME/clang-$LLVM_VERSION - - tar xf $LLVM_ARCHIVE_PATH -C $HOME/clang-$LLVM_VERSION --strip-components 1 - - cd $HOME/clang-$LLVM_VERSION ; sudo cp -R * /usr/local/ + - wget http://llvm.org/releases/$LLVM_VERSION/clang+llvm-$LLVM_VERSION-x86_64-linux-gnu-ubuntu-14.04.tar.xz + - sudo tar xf clang+llvm-$LLVM_VERSION-x86_64-linux-gnu-ubuntu-14.04.tar.xz -C /usr/local --strip-components 1 - os: linux env: From 3f23e7059883198afbe00d6d3fc777227f2e63e3 Mon Sep 17 00:00:00 2001 From: Niels Date: Tue, 7 Jun 2016 11:36:03 +0200 Subject: [PATCH 106/133] another try --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index f3a074bef..446981c9e 100644 --- a/.travis.yml +++ b/.travis.yml @@ -52,7 +52,7 @@ matrix: - CXXFLAGS=-lc++ before_install: - wget http://llvm.org/releases/$LLVM_VERSION/clang+llvm-$LLVM_VERSION-x86_64-linux-gnu-ubuntu-14.04.tar.xz - - sudo tar xf clang+llvm-$LLVM_VERSION-x86_64-linux-gnu-ubuntu-14.04.tar.xz -C /usr/local --strip-components 1 + - sudo tar xf clang+llvm-$LLVM_VERSION-x86_64-linux-gnu-ubuntu-14.04.tar.xz -C /usr --strip-components 1 - os: linux env: From 19be324f8780dbbf15e97fdc1eee0927fa451df5 Mon Sep 17 00:00:00 2001 From: Niels Date: Tue, 7 Jun 2016 11:38:56 +0200 Subject: [PATCH 107/133] ? --- .travis.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.travis.yml b/.travis.yml index 446981c9e..df9e9007b 100644 --- a/.travis.yml +++ b/.travis.yml @@ -53,6 +53,8 @@ matrix: before_install: - wget http://llvm.org/releases/$LLVM_VERSION/clang+llvm-$LLVM_VERSION-x86_64-linux-gnu-ubuntu-14.04.tar.xz - sudo tar xf clang+llvm-$LLVM_VERSION-x86_64-linux-gnu-ubuntu-14.04.tar.xz -C /usr --strip-components 1 + - echo $PATH + - which $COMPILER - os: linux env: From 439563eb04aae069079fda361fe1f306fade293e Mon Sep 17 00:00:00 2001 From: Niels Date: Tue, 7 Jun 2016 11:42:34 +0200 Subject: [PATCH 108/133] export --- .travis.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index df9e9007b..c105dd67a 100644 --- a/.travis.yml +++ b/.travis.yml @@ -53,8 +53,7 @@ matrix: before_install: - wget http://llvm.org/releases/$LLVM_VERSION/clang+llvm-$LLVM_VERSION-x86_64-linux-gnu-ubuntu-14.04.tar.xz - sudo tar xf clang+llvm-$LLVM_VERSION-x86_64-linux-gnu-ubuntu-14.04.tar.xz -C /usr --strip-components 1 - - echo $PATH - - which $COMPILER + - export - os: linux env: From 97648314a493c474802571d5e2e5584c9937e80b Mon Sep 17 00:00:00 2001 From: Niels Date: Tue, 7 Jun 2016 11:52:12 +0200 Subject: [PATCH 109/133] setting explicit path to compiler --- .travis.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index c105dd67a..5746514b6 100644 --- a/.travis.yml +++ b/.travis.yml @@ -48,12 +48,11 @@ matrix: - os: linux env: - LLVM_VERSION=3.8.0 - - COMPILER=clang++ + - COMPILER=/usr/bin/clang++ - CXXFLAGS=-lc++ before_install: - wget http://llvm.org/releases/$LLVM_VERSION/clang+llvm-$LLVM_VERSION-x86_64-linux-gnu-ubuntu-14.04.tar.xz - sudo tar xf clang+llvm-$LLVM_VERSION-x86_64-linux-gnu-ubuntu-14.04.tar.xz -C /usr --strip-components 1 - - export - os: linux env: From 48f69f40e75bbe9384151b556315e53f910ea977 Mon Sep 17 00:00:00 2001 From: Niels Date: Tue, 7 Jun 2016 12:04:57 +0200 Subject: [PATCH 110/133] enough for today... --- .travis.yml | 101 ++-------------------------------------------------- 1 file changed, 2 insertions(+), 99 deletions(-) diff --git a/.travis.yml b/.travis.yml index 5746514b6..eb00f6fc2 100644 --- a/.travis.yml +++ b/.travis.yml @@ -45,117 +45,20 @@ matrix: env: COMPILER=g++-5 # from https://github.com/travis-ci/travis-ci/issues/6120 - - os: linux - env: - - LLVM_VERSION=3.8.0 - - COMPILER=/usr/bin/clang++ - - CXXFLAGS=-lc++ - before_install: - - wget http://llvm.org/releases/$LLVM_VERSION/clang+llvm-$LLVM_VERSION-x86_64-linux-gnu-ubuntu-14.04.tar.xz - - sudo tar xf clang+llvm-$LLVM_VERSION-x86_64-linux-gnu-ubuntu-14.04.tar.xz -C /usr --strip-components 1 - - os: linux env: - LLVM_VERSION=3.8.0 - LLVM_ARCHIVE_PATH=$HOME/clang+llvm.tar.xz - - COMPILER=$HOME/clang-$LLVM_VERSION/bin/clang++ + - COMPILER=clang++ - CPPFLAGS="-I $HOME/clang-$LLVM_VERSION/include/c++/v1" - CXXFLAGS=-lc++ + - PATH=$HOME/clang-$LLVM_VERSION/bin:$PATH - LD_LIBRARY_PATH=$HOME/clang-$LLVM_VERSION/lib:$LD_LIBRARY_PATH before_install: - wget http://llvm.org/releases/$LLVM_VERSION/clang+llvm-$LLVM_VERSION-x86_64-linux-gnu-ubuntu-14.04.tar.xz -O $LLVM_ARCHIVE_PATH - mkdir $HOME/clang-$LLVM_VERSION - tar xf $LLVM_ARCHIVE_PATH -C $HOME/clang-$LLVM_VERSION --strip-components 1 - - os: linux - env: - - LLVM_VERSION=3.7.1 - - LLVM_ARCHIVE_PATH=$HOME/clang+llvm.tar.xz - - COMPILER=$HOME/clang-$LLVM_VERSION/bin/clang++ - - CPPFLAGS="-I $HOME/clang-$LLVM_VERSION/include/c++/v1" - - CXXFLAGS=-lc++ - - LD_LIBRARY_PATH=$HOME/clang-$LLVM_VERSION/lib:$LD_LIBRARY_PATH - before_install: - - wget http://llvm.org/releases/$LLVM_VERSION/clang+llvm-$LLVM_VERSION-x86_64-linux-gnu-ubuntu-14.04.tar.xz -O $LLVM_ARCHIVE_PATH - - mkdir $HOME/clang-$LLVM_VERSION - - tar xf $LLVM_ARCHIVE_PATH -C $HOME/clang-$LLVM_VERSION --strip-components 1 - - - os: linux - env: - - LLVM_VERSION=3.7.0 - - LLVM_ARCHIVE_PATH=$HOME/clang+llvm.tar.xz - - COMPILER=$HOME/clang-$LLVM_VERSION/bin/clang++ - - CPPFLAGS="-I $HOME/clang-$LLVM_VERSION/include/c++/v1" - - CXXFLAGS=-lc++ - - LD_LIBRARY_PATH=$HOME/clang-$LLVM_VERSION/lib:$LD_LIBRARY_PATH - before_install: - - wget http://llvm.org/releases/$LLVM_VERSION/clang+llvm-$LLVM_VERSION-x86_64-linux-gnu-ubuntu-14.04.tar.xz -O $LLVM_ARCHIVE_PATH - - mkdir $HOME/clang-$LLVM_VERSION - - tar xf $LLVM_ARCHIVE_PATH -C $HOME/clang-$LLVM_VERSION --strip-components 1 - - - os: linux - env: - - LLVM_VERSION=3.6.2 - - LLVM_ARCHIVE_PATH=$HOME/clang+llvm.tar.xz - - COMPILER=$HOME/clang-$LLVM_VERSION/bin/clang++ - - CPPFLAGS="-I $HOME/clang-$LLVM_VERSION/include/c++/v1" - - CXXFLAGS=-lc++ - - LD_LIBRARY_PATH=$HOME/clang-$LLVM_VERSION/lib:$LD_LIBRARY_PATH - before_install: - - wget http://llvm.org/releases/$LLVM_VERSION/clang+llvm-$LLVM_VERSION-x86_64-linux-gnu-ubuntu-14.04.tar.xz -O $LLVM_ARCHIVE_PATH - - mkdir $HOME/clang-$LLVM_VERSION - - tar xf $LLVM_ARCHIVE_PATH -C $HOME/clang-$LLVM_VERSION --strip-components 1 - - - os: linux - env: - - LLVM_VERSION=3.6.1 - - LLVM_ARCHIVE_PATH=$HOME/clang+llvm.tar.xz - - COMPILER=$HOME/clang-$LLVM_VERSION/bin/clang++ - - CPPFLAGS="-I $HOME/clang-$LLVM_VERSION/include/c++/v1" - - CXXFLAGS=-lc++ - - LD_LIBRARY_PATH=$HOME/clang-$LLVM_VERSION/lib:$LD_LIBRARY_PATH - before_install: - - wget http://llvm.org/releases/$LLVM_VERSION/clang+llvm-$LLVM_VERSION-x86_64-linux-gnu-ubuntu-14.04.tar.xz -O $LLVM_ARCHIVE_PATH - - mkdir $HOME/clang-$LLVM_VERSION - - tar xf $LLVM_ARCHIVE_PATH -C $HOME/clang-$LLVM_VERSION --strip-components 1 - - - os: linux - env: - - LLVM_VERSION=3.6.0 - - LLVM_ARCHIVE_PATH=$HOME/clang+llvm.tar.xz - - COMPILER=$HOME/clang-$LLVM_VERSION/bin/clang++ - - CPPFLAGS="-I $HOME/clang-$LLVM_VERSION/include/c++/v1" - - CXXFLAGS=-lc++ - - LD_LIBRARY_PATH=$HOME/clang-$LLVM_VERSION/lib:$LD_LIBRARY_PATH - before_install: - - wget http://llvm.org/releases/$LLVM_VERSION/clang+llvm-$LLVM_VERSION-x86_64-linux-gnu-ubuntu-14.04.tar.xz -O $LLVM_ARCHIVE_PATH - - mkdir $HOME/clang-$LLVM_VERSION - - tar xf $LLVM_ARCHIVE_PATH -C $HOME/clang-$LLVM_VERSION --strip-components 1 - - - os: linux - env: - - LLVM_VERSION=3.5.2 - - LLVM_ARCHIVE_PATH=$HOME/clang+llvm.tar.xz - - COMPILER=$HOME/clang-$LLVM_VERSION/bin/clang++ - - CPPFLAGS="-I $HOME/clang-$LLVM_VERSION/include/c++/v1" - - CXXFLAGS=-lc++ - - LD_LIBRARY_PATH=$HOME/clang-$LLVM_VERSION/lib:$LD_LIBRARY_PATH - before_install: - - wget http://llvm.org/releases/$LLVM_VERSION/clang+llvm-$LLVM_VERSION-x86_64-linux-gnu-ubuntu-14.04.tar.xz -O $LLVM_ARCHIVE_PATH - - mkdir $HOME/clang-$LLVM_VERSION - - tar xf $LLVM_ARCHIVE_PATH -C $HOME/clang-$LLVM_VERSION --strip-components 1 - - - os: linux - env: - - LLVM_VERSION=3.5.0 - - LLVM_ARCHIVE_PATH=$HOME/clang+llvm.tar.xz - - COMPILER=$HOME/clang-$LLVM_VERSION/bin/clang++ - - CPPFLAGS="-I $HOME/clang-$LLVM_VERSION/include/c++/v1" - before_install: - - wget http://llvm.org/releases/$LLVM_VERSION/clang+llvm-$LLVM_VERSION-x86_64-linux-gnu-ubuntu-14.04.tar.xz -O $LLVM_ARCHIVE_PATH - - mkdir $HOME/clang-$LLVM_VERSION - - tar xf $LLVM_ARCHIVE_PATH -C $HOME/clang-$LLVM_VERSION --strip-components 1 - # - os: linux # compiler: gcc # addons: From 947db6ffe3b7546bef932b814a2d86eaf973c38a Mon Sep 17 00:00:00 2001 From: Niels Date: Tue, 14 Jun 2016 08:02:29 +0200 Subject: [PATCH 111/133] added Xcode 8 beta --- .travis.yml | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/.travis.yml b/.travis.yml index eb00f6fc2..9c4029b5b 100644 --- a/.travis.yml +++ b/.travis.yml @@ -151,6 +151,13 @@ matrix: - COMPILER=clang - CXXFLAGS=-lstdc++ + - os: osx + osx_image: xcode8 + compiler: clang + env: + - COMPILER=clang + - CXXFLAGS=-lstdc++ + script: - uname -a - $COMPILER --version From c744d59f2d2a69cb410b9e2ba060e0feb9b8cdf2 Mon Sep 17 00:00:00 2001 From: Niels Date: Tue, 14 Jun 2016 08:14:25 +0200 Subject: [PATCH 112/133] adjusted README file to reality in Travis --- README.md | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 768943878..71eea31b1 100644 --- a/README.md +++ b/README.md @@ -72,12 +72,9 @@ The following compilers are currently used in [continuous integration](https://t | Compiler | Operating System | Version String | |-----------------|------------------------------|----------------| -| GCC 4.9.3 | Ubuntu 14.04.3 LTS | g++-4.9 (Ubuntu 4.9.3-8ubuntu2~14.04) 4.9.3 | -| GCC 5.3.0 | Ubuntu 14.04.3 LTS | g++-5 (Ubuntu 5.3.0-3ubuntu1~14.04) 5.3.0 20151204 | -| Clang 3.6.2 | Ubuntu 14.04.3 LTS | Ubuntu clang version 3.6.2-svn240577-1~exp1 (branches/release_36) (based on LLVM 3.6.2) | -| Clang 3.7.1 | Ubuntu 14.04.3 LTS | Ubuntu clang version 3.7.1-svn253571-1~exp1 (branches/release_37) (based on LLVM 3.7.1) | -| Clang 3.8.1 | Ubuntu 14.04.3 LTS | clang version 3.8.1-svn265380-1~exp1 (branches/release_38) | -| Clang 3.9.0 | Ubuntu 14.04.3 LTS | clang version 3.9.0-svn267478-1~exp1 (trunk) | +| GCC 4.9.3 | Ubuntu 14.04.4 LTS | g++-4.9 (Ubuntu 4.9.3-8ubuntu2~14.04) 4.9.3 | +| GCC 5.3.0 | Ubuntu 14.04.4 LTS | g++-5 (Ubuntu 5.3.0-3ubuntu1~14.04) 5.3.0 20151204 | +| Clang 3.8.0 | Ubuntu 14.04.4 LTS | clang version 3.8.0 (tags/RELEASE_380/final) | | Clang Xcode 6.1 | Darwin Kernel Version 13.4.0 (OSX 10.9.5) | Apple LLVM version 6.0 (clang-600.0.54) (based on LLVM 3.5svn) | | Clang Xcode 6.2 | Darwin Kernel Version 13.4.0 (OSX 10.9.5) | Apple LLVM version 6.0 (clang-600.0.57) (based on LLVM 3.5svn) | | Clang Xcode 6.3 | Darwin Kernel Version 14.3.0 (OSX 10.10.3) | Apple LLVM version 6.1.0 (clang-602.0.49) (based on LLVM 3.6.0svn) | @@ -85,6 +82,7 @@ The following compilers are currently used in [continuous integration](https://t | Clang Xcode 7.1 | Darwin Kernel Version 14.5.0 (OSX 10.10.5) | Apple LLVM version 7.0.0 (clang-700.1.76) | | Clang Xcode 7.2 | Darwin Kernel Version 15.0.0 (OSX 10.10.5) | Apple LLVM version 7.0.2 (clang-700.1.81) | | Clang Xcode 7.3 | Darwin Kernel Version 14.5.0 (OSX 10.11.1) | Apple LLVM version 7.3.0 (clang-703.0.29) | +| Clang Xcode 8.0 | Darwin Kernel Version 15.5.0 (OSX 10.11.5) | Apple LLVM version 8.0.0 (clang-800.0.24.1) | | Visual Studio 14 2015 | Windows Server 2012 R2 (x64) | Microsoft (R) Build Engine version 14.0.25123.0 | ## Examples From fb90388af5aa7ad67418573554af18a13bcb148f Mon Sep 17 00:00:00 2001 From: Tom Needham <06needhamt@gmail.com> Date: Tue, 14 Jun 2016 09:59:50 +0100 Subject: [PATCH 113/133] Fix Issue #265 --- src/json.hpp | 2 +- src/json.hpp.re2c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/json.hpp b/src/json.hpp index f66d0b590..cbb9e5f05 100644 --- a/src/json.hpp +++ b/src/json.hpp @@ -8504,7 +8504,7 @@ basic_json_parser_63: else { type = value_t::number_unsigned; - max = static_cast((std::numeric_limits::max())); + max = static_cast((std::numeric_limits::max)()); } // count the significant figures diff --git a/src/json.hpp.re2c b/src/json.hpp.re2c index f893aac0f..c60207f6f 100644 --- a/src/json.hpp.re2c +++ b/src/json.hpp.re2c @@ -7814,7 +7814,7 @@ class basic_json else { type = value_t::number_unsigned; - max = static_cast((std::numeric_limits::max())); + max = static_cast((std::numeric_limits::max)()); } // count the significant figures From 1eced269e3eb166b6e04f6505c3167157a708d25 Mon Sep 17 00:00:00 2001 From: Niels Date: Tue, 14 Jun 2016 15:27:16 +0200 Subject: [PATCH 114/133] update after PR #266 --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 71eea31b1..411c01397 100644 --- a/README.md +++ b/README.md @@ -434,6 +434,7 @@ I deeply appreciate the help of the following people. - [zewt](https://github.com/zewt) added useful notes to the README file about Android. - [Róbert Márki](https://github.com/robertmrk) added a fix to use move iterators and improved the integration via CMake. - [Chris Kitching](https://github.com/ChrisKitching) cleaned up the CMake files. +- [Tom Needham](https://github.com/06needhamt) fixed a subtle bug with MSVC 2015 which was also proposed by [Michael K.](https://github.com/Epidal). Thanks a lot for helping out! From bb8c7b1f4596d45c3fbac1be1ba46ee4527857ca Mon Sep 17 00:00:00 2001 From: Niels Date: Wed, 15 Jun 2016 21:28:27 +0200 Subject: [PATCH 115/133] mentioning Homebrew's `--HEAD` parameter --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 411c01397..6ef3539cc 100644 --- a/README.md +++ b/README.md @@ -41,7 +41,7 @@ using json = nlohmann::json; to the files you want to use JSON objects. That's it. Do not forget to set the necessary switches to enable C++11 (e.g., `-std=c++11` for GCC and Clang). -:beer: If you are using OS X and [Homebrew](http://brew.sh), just type `brew tap nlohmann/json` and `brew install nlohmann_json` and you're set. +:beer: If you are using OS X and [Homebrew](http://brew.sh), just type `brew tap nlohmann/json` and `brew install nlohmann_json` and you're set. If you want the bleeding edge rather than the latest release, use `brew install nlohmann_json --HEAD`. ## Supported compilers From 039565b9f5a8bbe0b9706190c0847c0a5273a653 Mon Sep 17 00:00:00 2001 From: Niels Date: Sat, 18 Jun 2016 14:33:27 +0200 Subject: [PATCH 116/133] trying codecov --- .travis.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.travis.yml b/.travis.yml index 9c4029b5b..aee8874f4 100644 --- a/.travis.yml +++ b/.travis.yml @@ -26,6 +26,7 @@ matrix: - make json_unit CXXFLAGS="-fprofile-arcs -ftest-coverage -std=c++11 -lstdc++" CXX=$COMPILER - ./json_unit "*" - coveralls --exclude test/src/catch.hpp --exclude test/src/unit.cpp --include src/json.hpp --gcov-options '\-lp' --gcov 'gcov-4.9' + - bash <(curl -s https://codecov.io/bash) env: COMPILER=g++-4.9 - os: linux From 4e31a0e852907dae6e1366027c816b2512e08cbd Mon Sep 17 00:00:00 2001 From: Niels Date: Sun, 19 Jun 2016 16:17:53 +0200 Subject: [PATCH 117/133] minor doc changes --- .gitignore | 3 ++- doc/Doxyfile | 2 +- src/json.hpp | 18 +++++++++--------- src/json.hpp.re2c | 18 +++++++++--------- 4 files changed, 21 insertions(+), 20 deletions(-) diff --git a/.gitignore b/.gitignore index c610519ef..d5bd2f7c9 100644 --- a/.gitignore +++ b/.gitignore @@ -10,4 +10,5 @@ working html me.nlohmann.json.docset -android \ No newline at end of file +android +doc/xml diff --git a/doc/Doxyfile b/doc/Doxyfile index 11faf6d03..e74a8a850 100644 --- a/doc/Doxyfile +++ b/doc/Doxyfile @@ -236,7 +236,7 @@ MAN_LINKS = NO #--------------------------------------------------------------------------- # Configuration options related to the XML output #--------------------------------------------------------------------------- -GENERATE_XML = NO +GENERATE_XML = YES XML_OUTPUT = xml XML_PROGRAMLISTING = YES #--------------------------------------------------------------------------- diff --git a/src/json.hpp b/src/json.hpp index cbb9e5f05..9d6687ddc 100644 --- a/src/json.hpp +++ b/src/json.hpp @@ -7278,17 +7278,17 @@ class basic_json enum class token_type { uninitialized, ///< indicating the scanner is uninitialized - literal_true, ///< the "true" literal - literal_false, ///< the "false" literal - literal_null, ///< the "null" literal + literal_true, ///< the `true` literal + literal_false, ///< the `false` literal + literal_null, ///< the `null` literal value_string, ///< a string -- use get_string() for actual value value_number, ///< a number -- use get_number() for actual value - begin_array, ///< the character for array begin "[" - begin_object, ///< the character for object begin "{" - end_array, ///< the character for array end "]" - end_object, ///< the character for object end "}" - name_separator, ///< the name separator ":" - value_separator, ///< the value separator "," + begin_array, ///< the character for array begin `[` + begin_object, ///< the character for object begin `{` + end_array, ///< the character for array end `]` + end_object, ///< the character for object end `}` + name_separator, ///< the name separator `:` + value_separator, ///< the value separator `,` parse_error, ///< indicating a parse error end_of_input ///< indicating the end of the input buffer }; diff --git a/src/json.hpp.re2c b/src/json.hpp.re2c index c60207f6f..9681bed2f 100644 --- a/src/json.hpp.re2c +++ b/src/json.hpp.re2c @@ -7278,17 +7278,17 @@ class basic_json enum class token_type { uninitialized, ///< indicating the scanner is uninitialized - literal_true, ///< the "true" literal - literal_false, ///< the "false" literal - literal_null, ///< the "null" literal + literal_true, ///< the `true` literal + literal_false, ///< the `false` literal + literal_null, ///< the `null` literal value_string, ///< a string -- use get_string() for actual value value_number, ///< a number -- use get_number() for actual value - begin_array, ///< the character for array begin "[" - begin_object, ///< the character for object begin "{" - end_array, ///< the character for array end "]" - end_object, ///< the character for object end "}" - name_separator, ///< the name separator ":" - value_separator, ///< the value separator "," + begin_array, ///< the character for array begin `[` + begin_object, ///< the character for object begin `{` + end_array, ///< the character for array end `]` + end_object, ///< the character for object end `}` + name_separator, ///< the name separator `:` + value_separator, ///< the value separator `,` parse_error, ///< indicating a parse error end_of_input ///< indicating the end of the input buffer }; From ad7a419a030e6721998280a894b7936370c18b53 Mon Sep 17 00:00:00 2001 From: Niels Date: Sun, 19 Jun 2016 17:13:13 +0200 Subject: [PATCH 118/133] removed roundtripping of floats (#230) --- src/json.hpp | 186 ++++------------------------------------------ src/json.hpp.re2c | 186 ++++------------------------------------------ test/src/unit.cpp | 20 ++--- 3 files changed, 43 insertions(+), 349 deletions(-) diff --git a/src/json.hpp b/src/json.hpp index 9d6687ddc..4eec1aeb2 100644 --- a/src/json.hpp +++ b/src/json.hpp @@ -711,73 +711,6 @@ class basic_json private: - /*! - @brief a type to hold JSON type information - - This bitfield type holds information about JSON types. It is internally - used to hold the basic JSON type enumeration, as well as additional - information in the case of values that have been parsed from a string - including whether of not it was created directly or parsed, and in the - case of floating point numbers the number of significant figures in the - original representaiton and if it was in exponential form, if a '+' was - included in the exponent and the capitilization of the exponent marker. - The sole purpose of this information is to permit accurate round trips. - - @since version 2.0.0 - */ - union type_data_t - { - struct - { - /// the type of the value (@ref value_t) - uint16_t type : 4; - /// whether the number was parsed from a string - uint16_t parsed : 1; - /// whether parsed number contained an exponent ('e'/'E') - uint16_t has_exp : 1; - /// whether parsed number contained a plus in the exponent - uint16_t exp_plus : 1; - /// whether parsed number's exponent was capitalized ('E') - uint16_t exp_cap : 1; - /// the number of figures for a parsed number - uint16_t precision : 8; - } bits; - uint16_t data; - - /// return the type as value_t - operator value_t() const - { - return static_cast(bits.type); - } - - /// test type for equality (ignore other fields) - bool operator==(const value_t& rhs) const - { - return static_cast(bits.type) == rhs; - } - - /// assignment - type_data_t& operator=(value_t rhs) - { - bits.type = static_cast(rhs) & 15; // avoid overflow - return *this; - } - - /// construct from value_t - type_data_t(value_t t) noexcept - { - *reinterpret_cast(this) = 0; - bits.type = static_cast(t) & 15; // avoid overflow - } - - /// default constructor - type_data_t() noexcept - { - data = 0; - bits.type = reinterpret_cast(value_t::null); - } - }; - /// helper for exception-safe object creation template static T* create(Args&& ... args) @@ -6183,79 +6116,23 @@ class basic_json case value_t::number_float: { - // check if number was parsed from a string - if (m_type.bits.parsed) + if (m_value.number_float == 0) { - // check if parsed number had an exponent given - if (m_type.bits.has_exp) - { - // buffer size: precision (2^8-1 = 255) + other ('-.e-xxx' = 7) + null (1) - char buf[263]; - int len; - - // handle capitalization of the exponent - if (m_type.bits.exp_cap) - { - len = snprintf(buf, sizeof(buf), "%.*E", - m_type.bits.precision, m_value.number_float) + 1; - } - else - { - len = snprintf(buf, sizeof(buf), "%.*e", - m_type.bits.precision, m_value.number_float) + 1; - } - - // remove '+' sign from the exponent if necessary - if (not m_type.bits.exp_plus) - { - if (len > static_cast(sizeof(buf))) - { - len = sizeof(buf); - } - for (int i = 0; i < len; i++) - { - if (buf[i] == '+') - { - for (; i + 1 < len; i++) - { - buf[i] = buf[i + 1]; - } - } - } - } - - o << buf; - } - else - { - // no exponent - output as a decimal - std::stringstream ss; - ss.imbue(std::locale(std::locale(), new DecimalSeparator)); // fix locale problems - ss << std::setprecision(m_type.bits.precision) - << std::fixed << m_value.number_float; - o << ss.str(); - } + // special case for zero to get "0.0"/"-0.0" + o << (std::signbit(m_value.number_float) ? "-0.0" : "0.0"); } else { - if (m_value.number_float == 0) - { - // special case for zero to get "0.0"/"-0.0" - o << (std::signbit(m_value.number_float) ? "-0.0" : "0.0"); - } - else - { - // Otherwise 6, 15 or 16 digits of precision allows - // round-trip IEEE 754 string->float->string, - // string->double->string or string->long - // double->string; to be safe, we read this value from - // std::numeric_limits::digits10 - std::stringstream ss; - ss.imbue(std::locale(std::locale(), new DecimalSeparator)); // fix locale problems - ss << std::setprecision(std::numeric_limits::digits10) - << m_value.number_float; - o << ss.str(); - } + // Otherwise 6, 15 or 16 digits of precision allows + // round-trip IEEE 754 string->float->string, + // string->double->string or string->long + // double->string; to be safe, we read this value from + // std::numeric_limits::digits10 + std::stringstream ss; + ss.imbue(std::locale(std::locale(), new DecimalSeparator)); // fix locale problems + ss << std::setprecision(std::numeric_limits::digits10) + << m_value.number_float; + o << ss.str(); } return; } @@ -6280,7 +6157,7 @@ class basic_json ////////////////////// /// the type of the current element - type_data_t m_type = value_t::null; + value_t m_type = value_t::null; /// the value of the current element json_value m_value = {}; @@ -8457,18 +8334,12 @@ basic_json_parser_63: number_integer_t or @ref number_unsigned_t then it sets the result parameter accordingly. - The 'floating point representation' includes the number of significant - figures after the radix point, whether the number is in exponential or - decimal form, the capitalization of the exponent marker, and if the - optional '+' is present in the exponent. This information is necessary - to perform accurate round trips of floating point numbers. - If the number is a floating point number the number is then parsed using @a std:strtod (or @a std:strtof or @a std::strtold). @param[out] result @ref basic_json object to receive the number, or - NAN if the conversion read past the current token. The latter case - needs to be treated by the caller function. + NAN if the conversion read past the current token. The latter case + needs to be treated by the caller function. */ void get_number(basic_json& result) const { @@ -8476,15 +8347,6 @@ basic_json_parser_63: const lexer::lexer_char_t* curptr = m_start; - // remember this number was parsed (for later serialization) - result.m_type.bits.parsed = true; - - // 'found_radix_point' will be set to 0xFF upon finding a radix - // point and later used to mask in/out the precision depending - // whether a radix is found i.e. 'precision &= found_radix_point' - uint8_t found_radix_point = 0; - uint8_t precision = 0; - // accumulate the integer conversion result (unsigned for now) number_unsigned_t value = 0; @@ -8517,22 +8379,11 @@ basic_json_parser_63: { // don't count '.' but change to float type = value_t::number_float; - - // reset precision count - precision = 0; - found_radix_point = 0xFF; continue; } // assume exponent (if not then will fail parse): change to // float, stop counting and record exponent details type = value_t::number_float; - result.m_type.bits.has_exp = true; - - // exponent capitalization - result.m_type.bits.exp_cap = (*curptr == 'E'); - - // exponent '+' sign - result.m_type.bits.exp_plus = (*(++curptr) == '+'); break; } @@ -8554,13 +8405,8 @@ basic_json_parser_63: value = temp; } } - ++precision; } - // If no radix point was found then precision would now be set to - // the number of digits, which is wrong - clear it. - result.m_type.bits.precision = precision & found_radix_point; - // save the value (if not a float) if (type == value_t::number_unsigned) { diff --git a/src/json.hpp.re2c b/src/json.hpp.re2c index 9681bed2f..84235cb1b 100644 --- a/src/json.hpp.re2c +++ b/src/json.hpp.re2c @@ -711,73 +711,6 @@ class basic_json private: - /*! - @brief a type to hold JSON type information - - This bitfield type holds information about JSON types. It is internally - used to hold the basic JSON type enumeration, as well as additional - information in the case of values that have been parsed from a string - including whether of not it was created directly or parsed, and in the - case of floating point numbers the number of significant figures in the - original representaiton and if it was in exponential form, if a '+' was - included in the exponent and the capitilization of the exponent marker. - The sole purpose of this information is to permit accurate round trips. - - @since version 2.0.0 - */ - union type_data_t - { - struct - { - /// the type of the value (@ref value_t) - uint16_t type : 4; - /// whether the number was parsed from a string - uint16_t parsed : 1; - /// whether parsed number contained an exponent ('e'/'E') - uint16_t has_exp : 1; - /// whether parsed number contained a plus in the exponent - uint16_t exp_plus : 1; - /// whether parsed number's exponent was capitalized ('E') - uint16_t exp_cap : 1; - /// the number of figures for a parsed number - uint16_t precision : 8; - } bits; - uint16_t data; - - /// return the type as value_t - operator value_t() const - { - return static_cast(bits.type); - } - - /// test type for equality (ignore other fields) - bool operator==(const value_t& rhs) const - { - return static_cast(bits.type) == rhs; - } - - /// assignment - type_data_t& operator=(value_t rhs) - { - bits.type = static_cast(rhs) & 15; // avoid overflow - return *this; - } - - /// construct from value_t - type_data_t(value_t t) noexcept - { - *reinterpret_cast(this) = 0; - bits.type = static_cast(t) & 15; // avoid overflow - } - - /// default constructor - type_data_t() noexcept - { - data = 0; - bits.type = reinterpret_cast(value_t::null); - } - }; - /// helper for exception-safe object creation template static T* create(Args&& ... args) @@ -6183,79 +6116,23 @@ class basic_json case value_t::number_float: { - // check if number was parsed from a string - if (m_type.bits.parsed) + if (m_value.number_float == 0) { - // check if parsed number had an exponent given - if (m_type.bits.has_exp) - { - // buffer size: precision (2^8-1 = 255) + other ('-.e-xxx' = 7) + null (1) - char buf[263]; - int len; - - // handle capitalization of the exponent - if (m_type.bits.exp_cap) - { - len = snprintf(buf, sizeof(buf), "%.*E", - m_type.bits.precision, m_value.number_float) + 1; - } - else - { - len = snprintf(buf, sizeof(buf), "%.*e", - m_type.bits.precision, m_value.number_float) + 1; - } - - // remove '+' sign from the exponent if necessary - if (not m_type.bits.exp_plus) - { - if (len > static_cast(sizeof(buf))) - { - len = sizeof(buf); - } - for (int i = 0; i < len; i++) - { - if (buf[i] == '+') - { - for (; i + 1 < len; i++) - { - buf[i] = buf[i + 1]; - } - } - } - } - - o << buf; - } - else - { - // no exponent - output as a decimal - std::stringstream ss; - ss.imbue(std::locale(std::locale(), new DecimalSeparator)); // fix locale problems - ss << std::setprecision(m_type.bits.precision) - << std::fixed << m_value.number_float; - o << ss.str(); - } + // special case for zero to get "0.0"/"-0.0" + o << (std::signbit(m_value.number_float) ? "-0.0" : "0.0"); } else { - if (m_value.number_float == 0) - { - // special case for zero to get "0.0"/"-0.0" - o << (std::signbit(m_value.number_float) ? "-0.0" : "0.0"); - } - else - { - // Otherwise 6, 15 or 16 digits of precision allows - // round-trip IEEE 754 string->float->string, - // string->double->string or string->long - // double->string; to be safe, we read this value from - // std::numeric_limits::digits10 - std::stringstream ss; - ss.imbue(std::locale(std::locale(), new DecimalSeparator)); // fix locale problems - ss << std::setprecision(std::numeric_limits::digits10) - << m_value.number_float; - o << ss.str(); - } + // Otherwise 6, 15 or 16 digits of precision allows + // round-trip IEEE 754 string->float->string, + // string->double->string or string->long + // double->string; to be safe, we read this value from + // std::numeric_limits::digits10 + std::stringstream ss; + ss.imbue(std::locale(std::locale(), new DecimalSeparator)); // fix locale problems + ss << std::setprecision(std::numeric_limits::digits10) + << m_value.number_float; + o << ss.str(); } return; } @@ -6280,7 +6157,7 @@ class basic_json ////////////////////// /// the type of the current element - type_data_t m_type = value_t::null; + value_t m_type = value_t::null; /// the value of the current element json_value m_value = {}; @@ -7767,18 +7644,12 @@ class basic_json number_integer_t or @ref number_unsigned_t then it sets the result parameter accordingly. - The 'floating point representation' includes the number of significant - figures after the radix point, whether the number is in exponential or - decimal form, the capitalization of the exponent marker, and if the - optional '+' is present in the exponent. This information is necessary - to perform accurate round trips of floating point numbers. - If the number is a floating point number the number is then parsed using @a std:strtod (or @a std:strtof or @a std::strtold). @param[out] result @ref basic_json object to receive the number, or - NAN if the conversion read past the current token. The latter case - needs to be treated by the caller function. + NAN if the conversion read past the current token. The latter case + needs to be treated by the caller function. */ void get_number(basic_json& result) const { @@ -7786,15 +7657,6 @@ class basic_json const lexer::lexer_char_t* curptr = m_start; - // remember this number was parsed (for later serialization) - result.m_type.bits.parsed = true; - - // 'found_radix_point' will be set to 0xFF upon finding a radix - // point and later used to mask in/out the precision depending - // whether a radix is found i.e. 'precision &= found_radix_point' - uint8_t found_radix_point = 0; - uint8_t precision = 0; - // accumulate the integer conversion result (unsigned for now) number_unsigned_t value = 0; @@ -7827,22 +7689,11 @@ class basic_json { // don't count '.' but change to float type = value_t::number_float; - - // reset precision count - precision = 0; - found_radix_point = 0xFF; continue; } // assume exponent (if not then will fail parse): change to // float, stop counting and record exponent details type = value_t::number_float; - result.m_type.bits.has_exp = true; - - // exponent capitalization - result.m_type.bits.exp_cap = (*curptr == 'E'); - - // exponent '+' sign - result.m_type.bits.exp_plus = (*(++curptr) == '+'); break; } @@ -7864,13 +7715,8 @@ class basic_json value = temp; } } - ++precision; } - // If no radix point was found then precision would now be set to - // the number of digits, which is wrong - clear it. - result.m_type.bits.precision = precision & found_radix_point; - // save the value (if not a float) if (type == value_t::number_unsigned) { diff --git a/test/src/unit.cpp b/test/src/unit.cpp index 0a2bdd104..73d58f24c 100644 --- a/test/src/unit.cpp +++ b/test/src/unit.cpp @@ -11900,14 +11900,14 @@ TEST_CASE("compliance tests from nativejson-benchmark") "test/data/json_roundtrip/roundtrip21.json", "test/data/json_roundtrip/roundtrip22.json", "test/data/json_roundtrip/roundtrip23.json", - "test/data/json_roundtrip/roundtrip24.json", - "test/data/json_roundtrip/roundtrip25.json", - "test/data/json_roundtrip/roundtrip26.json", - "test/data/json_roundtrip/roundtrip27.json", - "test/data/json_roundtrip/roundtrip28.json", + //"test/data/json_roundtrip/roundtrip24.json", // roundtrip error + //"test/data/json_roundtrip/roundtrip25.json", // roundtrip error + //"test/data/json_roundtrip/roundtrip26.json", // roundtrip error + //"test/data/json_roundtrip/roundtrip27.json", // roundtrip error + //"test/data/json_roundtrip/roundtrip28.json", // roundtrip error "test/data/json_roundtrip/roundtrip29.json", - "test/data/json_roundtrip/roundtrip30.json", - "test/data/json_roundtrip/roundtrip31.json", + //"test/data/json_roundtrip/roundtrip30.json", // roundtrip error + //"test/data/json_roundtrip/roundtrip31.json", // roundtrip error "test/data/json_roundtrip/roundtrip32.json" }) { @@ -14050,8 +14050,10 @@ TEST_CASE("regression tests") //CHECK(j2b.dump() == "23.42"); CHECK(j3a.dump() == "10000"); - CHECK(j3b.dump() == "1E04"); - CHECK(j3c.dump() == "1e04"); + CHECK(j3b.dump() == "10000"); + CHECK(j3c.dump() == "10000"); + //CHECK(j3b.dump() == "1E04"); // roundtrip error + //CHECK(j3c.dump() == "1e04"); // roundtrip error } SECTION("issue #233 - Can't use basic_json::iterator as a base iterator for std::move_iterator") From 4ff27b207ed0ee52bae6abf07f40c23edcf17509 Mon Sep 17 00:00:00 2001 From: Niels Date: Sun, 19 Jun 2016 17:56:58 +0200 Subject: [PATCH 119/133] fixed two typos --- test/src/unit.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/src/unit.cpp b/test/src/unit.cpp index 0a2bdd104..609e1be95 100644 --- a/test/src/unit.cpp +++ b/test/src/unit.cpp @@ -1285,7 +1285,7 @@ TEST_CASE("constructors") SECTION("create a JSON value from an input stream") { - SECTION("sts::stringstream") + SECTION("std::stringstream") { std::stringstream ss; ss << "[\"foo\",1,2,3,false,{\"one\":1}]"; @@ -14065,7 +14065,7 @@ TEST_CASE("regression tests") CHECK(dest == expected); } - SECTION("issue ##235 - ambiguous overload for 'push_back' and 'operator+='") + SECTION("issue #235 - ambiguous overload for 'push_back' and 'operator+='") { json data = {{"key", "value"}}; data.push_back({"key2", "value2"}); From 8c48ef1f73f6bf392d7fd66132c5e74b0739892e Mon Sep 17 00:00:00 2001 From: Niels Date: Sun, 19 Jun 2016 18:25:43 +0200 Subject: [PATCH 120/133] updated to Catch v1.5.6 --- test/src/catch.hpp | 452 ++++++++++++++++++++++++++++++--------------- 1 file changed, 301 insertions(+), 151 deletions(-) diff --git a/test/src/catch.hpp b/test/src/catch.hpp index 5cc33a838..879fc5b1d 100644 --- a/test/src/catch.hpp +++ b/test/src/catch.hpp @@ -1,6 +1,6 @@ /* - * Catch v1.3.4 - * Generated: 2016-02-10 19:24:03.089683 + * Catch v1.5.6 + * Generated: 2016-06-09 19:20:41.460328 * ---------------------------------------------------------- * This file has been merged from multiple headers. Please don't edit it directly * Copyright (c) 2012 Two Blue Cubes Ltd. All rights reserved. @@ -62,7 +62,11 @@ #define INTERNAL_CATCH_UNIQUE_NAME_LINE2( name, line ) name##line #define INTERNAL_CATCH_UNIQUE_NAME_LINE( name, line ) INTERNAL_CATCH_UNIQUE_NAME_LINE2( name, line ) -#define INTERNAL_CATCH_UNIQUE_NAME( name ) INTERNAL_CATCH_UNIQUE_NAME_LINE( name, __LINE__ ) +#ifdef CATCH_CONFIG_COUNTER +# define INTERNAL_CATCH_UNIQUE_NAME( name ) INTERNAL_CATCH_UNIQUE_NAME_LINE( name, __COUNTER__ ) +#else +# define INTERNAL_CATCH_UNIQUE_NAME( name ) INTERNAL_CATCH_UNIQUE_NAME_LINE( name, __LINE__ ) +#endif #define INTERNAL_CATCH_STRINGIFY2( expr ) #expr #define INTERNAL_CATCH_STRINGIFY( expr ) INTERNAL_CATCH_STRINGIFY2( expr ) @@ -89,7 +93,7 @@ // CATCH_CONFIG_CPP11_OR_GREATER : Is C++11 supported? // CATCH_CONFIG_VARIADIC_MACROS : are variadic macros supported? - +// CATCH_CONFIG_COUNTER : is the __COUNTER__ macro supported? // **************** // Note to maintainers: if new toggles are added please document them // in configuration.md, too @@ -102,6 +106,18 @@ // All the C++11 features can be disabled with CATCH_CONFIG_NO_CPP11 +#ifdef __cplusplus + +# if __cplusplus >= 201103L +# define CATCH_CPP11_OR_GREATER +# endif + +# if __cplusplus >= 201402L +# define CATCH_CPP14_OR_GREATER +# endif + +#endif + #ifdef __clang__ # if __has_feature(cxx_nullptr) @@ -112,6 +128,10 @@ # define CATCH_INTERNAL_CONFIG_CPP11_NOEXCEPT # endif +# if defined(CATCH_CPP11_OR_GREATER) +# define CATCH_INTERNAL_SUPPRESS_PARENTHESES_WARNINGS _Pragma( "clang diagnostic ignored \"-Wparentheses\"" ) +# endif + #endif // __clang__ //////////////////////////////////////////////////////////////////////////////// @@ -136,9 +156,13 @@ // GCC #ifdef __GNUC__ -#if __GNUC__ == 4 && __GNUC_MINOR__ >= 6 && defined(__GXX_EXPERIMENTAL_CXX0X__) -# define CATCH_INTERNAL_CONFIG_CPP11_NULLPTR -#endif +# if __GNUC__ == 4 && __GNUC_MINOR__ >= 6 && defined(__GXX_EXPERIMENTAL_CXX0X__) +# define CATCH_INTERNAL_CONFIG_CPP11_NULLPTR +# endif + +# if !defined(CATCH_INTERNAL_SUPPRESS_PARENTHESES_WARNINGS) && defined(CATCH_CPP11_OR_GREATER) +# define CATCH_INTERNAL_SUPPRESS_PARENTHESES_WARNINGS _Pragma( "GCC diagnostic ignored \"-Wparentheses\"" ) +# endif // - otherwise more recent versions define __cplusplus >= 201103L // and will get picked up below @@ -173,13 +197,20 @@ #endif +// Use __COUNTER__ if the compiler supports it +#if ( defined _MSC_VER && _MSC_VER >= 1300 ) || \ + ( defined __GNUC__ && __GNUC__ >= 4 && __GNUC_MINOR__ >= 3 ) || \ + ( defined __clang__ && __clang_major__ >= 3 ) + +#define CATCH_INTERNAL_CONFIG_COUNTER + +#endif + //////////////////////////////////////////////////////////////////////////////// // C++ language feature support // catch all support for C++11 -#if defined(__cplusplus) && __cplusplus >= 201103L - -# define CATCH_CPP11_OR_GREATER +#if defined(CATCH_CPP11_OR_GREATER) # if !defined(CATCH_INTERNAL_CONFIG_CPP11_NULLPTR) # define CATCH_INTERNAL_CONFIG_CPP11_NULLPTR @@ -246,6 +277,13 @@ #if defined(CATCH_INTERNAL_CONFIG_CPP11_UNIQUE_PTR) && !defined(CATCH_CONFIG_NO_UNIQUE_PTR) && !defined(CATCH_CONFIG_CPP11_UNIQUE_PTR) && !defined(CATCH_CONFIG_NO_CPP11) # define CATCH_CONFIG_CPP11_UNIQUE_PTR #endif +#if defined(CATCH_INTERNAL_CONFIG_COUNTER) && !defined(CATCH_CONFIG_NO_COUNTER) && !defined(CATCH_CONFIG_COUNTER) +# define CATCH_CONFIG_COUNTER +#endif + +#if !defined(CATCH_INTERNAL_SUPPRESS_PARENTHESES_WARNINGS) +# define CATCH_INTERNAL_SUPPRESS_PARENTHESES_WARNINGS +#endif // noexcept support: #if defined(CATCH_CONFIG_CPP11_NOEXCEPT) && !defined(CATCH_NOEXCEPT) @@ -672,24 +710,28 @@ void registerTestCaseFunction #ifdef CATCH_CONFIG_VARIADIC_MACROS /////////////////////////////////////////////////////////////////////////////// + #define INTERNAL_CATCH_TESTCASE2( TestName, ... ) \ + static void TestName(); \ + namespace{ Catch::AutoReg INTERNAL_CATCH_UNIQUE_NAME( autoRegistrar )( &TestName, CATCH_INTERNAL_LINEINFO, Catch::NameAndDesc( __VA_ARGS__ ) ); }\ + static void TestName() #define INTERNAL_CATCH_TESTCASE( ... ) \ - static void INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ )(); \ - namespace{ Catch::AutoReg INTERNAL_CATCH_UNIQUE_NAME( autoRegistrar )( &INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ ), CATCH_INTERNAL_LINEINFO, Catch::NameAndDesc( __VA_ARGS__ ) ); }\ - static void INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ )() + INTERNAL_CATCH_TESTCASE2( INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ ), __VA_ARGS__ ) /////////////////////////////////////////////////////////////////////////////// #define INTERNAL_CATCH_METHOD_AS_TEST_CASE( QualifiedMethod, ... ) \ namespace{ Catch::AutoReg INTERNAL_CATCH_UNIQUE_NAME( autoRegistrar )( &QualifiedMethod, "&" #QualifiedMethod, Catch::NameAndDesc( __VA_ARGS__ ), CATCH_INTERNAL_LINEINFO ); } /////////////////////////////////////////////////////////////////////////////// - #define INTERNAL_CATCH_TEST_CASE_METHOD( ClassName, ... )\ + #define INTERNAL_CATCH_TEST_CASE_METHOD2( TestName, ClassName, ... )\ namespace{ \ - struct INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ ) : ClassName{ \ + struct TestName : ClassName{ \ void test(); \ }; \ - Catch::AutoReg INTERNAL_CATCH_UNIQUE_NAME( autoRegistrar ) ( &INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ )::test, #ClassName, Catch::NameAndDesc( __VA_ARGS__ ), CATCH_INTERNAL_LINEINFO ); \ + Catch::AutoReg INTERNAL_CATCH_UNIQUE_NAME( autoRegistrar ) ( &TestName::test, #ClassName, Catch::NameAndDesc( __VA_ARGS__ ), CATCH_INTERNAL_LINEINFO ); \ } \ - void INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ )::test() + void TestName::test() + #define INTERNAL_CATCH_TEST_CASE_METHOD( ClassName, ... ) \ + INTERNAL_CATCH_TEST_CASE_METHOD2( INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ ), ClassName, __VA_ARGS__ ) /////////////////////////////////////////////////////////////////////////////// #define INTERNAL_CATCH_REGISTER_TESTCASE( Function, ... ) \ @@ -697,24 +739,28 @@ void registerTestCaseFunction #else /////////////////////////////////////////////////////////////////////////////// + #define INTERNAL_CATCH_TESTCASE2( TestName, Name, Desc ) \ + static void TestName(); \ + namespace{ Catch::AutoReg INTERNAL_CATCH_UNIQUE_NAME( autoRegistrar )( &TestName, CATCH_INTERNAL_LINEINFO, Catch::NameAndDesc( Name, Desc ) ); }\ + static void TestName() #define INTERNAL_CATCH_TESTCASE( Name, Desc ) \ - static void INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ )(); \ - namespace{ Catch::AutoReg INTERNAL_CATCH_UNIQUE_NAME( autoRegistrar )( &INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ ), CATCH_INTERNAL_LINEINFO, Catch::NameAndDesc( Name, Desc ) ); }\ - static void INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ )() + INTERNAL_CATCH_TESTCASE2( INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ ), Name, Desc ) /////////////////////////////////////////////////////////////////////////////// #define INTERNAL_CATCH_METHOD_AS_TEST_CASE( QualifiedMethod, Name, Desc ) \ namespace{ Catch::AutoReg INTERNAL_CATCH_UNIQUE_NAME( autoRegistrar )( &QualifiedMethod, "&" #QualifiedMethod, Catch::NameAndDesc( Name, Desc ), CATCH_INTERNAL_LINEINFO ); } /////////////////////////////////////////////////////////////////////////////// - #define INTERNAL_CATCH_TEST_CASE_METHOD( ClassName, TestName, Desc )\ + #define INTERNAL_CATCH_TEST_CASE_METHOD2( TestCaseName, ClassName, TestName, Desc )\ namespace{ \ - struct INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ ) : ClassName{ \ + struct TestCaseName : ClassName{ \ void test(); \ }; \ - Catch::AutoReg INTERNAL_CATCH_UNIQUE_NAME( autoRegistrar ) ( &INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ )::test, #ClassName, Catch::NameAndDesc( TestName, Desc ), CATCH_INTERNAL_LINEINFO ); \ + Catch::AutoReg INTERNAL_CATCH_UNIQUE_NAME( autoRegistrar ) ( &TestCaseName::test, #ClassName, Catch::NameAndDesc( TestName, Desc ), CATCH_INTERNAL_LINEINFO ); \ } \ - void INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ )::test() + void TestCaseName::test() + #define INTERNAL_CATCH_TEST_CASE_METHOD( ClassName, TestName, Desc )\ + INTERNAL_CATCH_TEST_CASE_METHOD2( INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ ), ClassName, TestName, Desc ) /////////////////////////////////////////////////////////////////////////////// #define INTERNAL_CATCH_REGISTER_TESTCASE( Function, Name, Desc ) \ @@ -1287,37 +1333,37 @@ namespace Internal { template struct Evaluator { static bool evaluate( T1 const& lhs, T2 const& rhs) { - return opCast( lhs ) == opCast( rhs ); + return bool( opCast( lhs ) == opCast( rhs ) ); } }; template struct Evaluator { static bool evaluate( T1 const& lhs, T2 const& rhs ) { - return opCast( lhs ) != opCast( rhs ); + return bool( opCast( lhs ) != opCast( rhs ) ); } }; template struct Evaluator { static bool evaluate( T1 const& lhs, T2 const& rhs ) { - return opCast( lhs ) < opCast( rhs ); + return bool( opCast( lhs ) < opCast( rhs ) ); } }; template struct Evaluator { static bool evaluate( T1 const& lhs, T2 const& rhs ) { - return opCast( lhs ) > opCast( rhs ); + return bool( opCast( lhs ) > opCast( rhs ) ); } }; template struct Evaluator { static bool evaluate( T1 const& lhs, T2 const& rhs ) { - return opCast( lhs ) >= opCast( rhs ); + return bool( opCast( lhs ) >= opCast( rhs ) ); } }; template struct Evaluator { static bool evaluate( T1 const& lhs, T2 const& rhs ) { - return opCast( lhs ) <= opCast( rhs ); + return bool( opCast( lhs ) <= opCast( rhs ) ); } }; @@ -2020,13 +2066,14 @@ namespace Catch { do { \ Catch::ResultBuilder __catchResult( macroName, CATCH_INTERNAL_LINEINFO, #expr, resultDisposition ); \ try { \ + CATCH_INTERNAL_SUPPRESS_PARENTHESES_WARNINGS \ ( __catchResult <= expr ).endExpression(); \ } \ catch( ... ) { \ __catchResult.useActiveException( Catch::ResultDisposition::Normal ); \ } \ INTERNAL_CATCH_REACT( __catchResult ) \ - } while( Catch::isTrue( false && static_cast(expr) ) ) // expr here is never evaluated at runtime but it forces the compiler to give it a look + } while( Catch::isTrue( false && !!(expr) ) ) // expr here is never evaluated at runtime but it forces the compiler to give it a look /////////////////////////////////////////////////////////////////////////////// #define INTERNAL_CATCH_IF( expr, resultDisposition, macroName ) \ @@ -2563,10 +2610,12 @@ namespace Catch { } /////////////////////////////////////////////////////////////////////////////// -#define INTERNAL_CATCH_TRANSLATE_EXCEPTION( signature ) \ - static std::string INTERNAL_CATCH_UNIQUE_NAME( catch_internal_ExceptionTranslator )( signature ); \ - namespace{ Catch::ExceptionTranslatorRegistrar INTERNAL_CATCH_UNIQUE_NAME( catch_internal_ExceptionRegistrar )( &INTERNAL_CATCH_UNIQUE_NAME( catch_internal_ExceptionTranslator ) ); }\ - static std::string INTERNAL_CATCH_UNIQUE_NAME( catch_internal_ExceptionTranslator )( signature ) +#define INTERNAL_CATCH_TRANSLATE_EXCEPTION2( translatorName, signature ) \ + static std::string translatorName( signature ); \ + namespace{ Catch::ExceptionTranslatorRegistrar INTERNAL_CATCH_UNIQUE_NAME( catch_internal_ExceptionRegistrar )( &translatorName ); }\ + static std::string translatorName( signature ) + +#define INTERNAL_CATCH_TRANSLATE_EXCEPTION( signature ) INTERNAL_CATCH_TRANSLATE_EXCEPTION2( INTERNAL_CATCH_UNIQUE_NAME( catch_internal_ExceptionTranslator ), signature ) // #included from: internal/catch_approx.hpp #define TWOBLUECUBES_CATCH_APPROX_HPP_INCLUDED @@ -3331,6 +3380,11 @@ namespace Catch { InLexicographicalOrder, InRandomOrder }; }; + struct UseColour { enum YesOrNo { + Auto, + Yes, + No + }; }; class TestSpec; @@ -3350,7 +3404,7 @@ namespace Catch { virtual TestSpec const& testSpec() const = 0; virtual RunTests::InWhatOrder runOrder() const = 0; virtual unsigned int rngSeed() const = 0; - virtual bool forceColour() const = 0; + virtual UseColour::YesOrNo useColour() const = 0; }; } @@ -3404,7 +3458,7 @@ namespace Catch { }; class DebugOutStream : public IStream { - std::auto_ptr m_streamBuf; + CATCH_AUTO_PTR( StreamBufBase ) m_streamBuf; mutable std::ostream m_os; public: DebugOutStream(); @@ -3439,14 +3493,14 @@ namespace Catch { noThrow( false ), showHelp( false ), showInvisibles( false ), - forceColour( false ), filenamesAsTags( false ), abortAfter( -1 ), rngSeed( 0 ), verbosity( Verbosity::Normal ), warnings( WarnAbout::Nothing ), showDurations( ShowDurations::DefaultForReporter ), - runOrder( RunTests::InDeclarationOrder ) + runOrder( RunTests::InDeclarationOrder ), + useColour( UseColour::Auto ) {} bool listTests; @@ -3459,7 +3513,6 @@ namespace Catch { bool noThrow; bool showHelp; bool showInvisibles; - bool forceColour; bool filenamesAsTags; int abortAfter; @@ -3469,6 +3522,7 @@ namespace Catch { WarnAbout::What warnings; ShowDurations::OrNot showDurations; RunTests::InWhatOrder runOrder; + UseColour::YesOrNo useColour; std::string outputFilename; std::string name; @@ -3534,7 +3588,7 @@ namespace Catch { virtual ShowDurations::OrNot showDurations() const { return m_data.showDurations; } virtual RunTests::InWhatOrder runOrder() const { return m_data.runOrder; } virtual unsigned int rngSeed() const { return m_data.rngSeed; } - virtual bool forceColour() const { return m_data.forceColour; } + virtual UseColour::YesOrNo useColour() const { return m_data.useColour; } private: @@ -3552,7 +3606,7 @@ namespace Catch { } ConfigData m_data; - std::auto_ptr m_stream; + CATCH_AUTO_PTR( IStream const ) m_stream; TestSpec m_testSpec; }; @@ -3572,7 +3626,7 @@ namespace Catch { #define STITCH_CLARA_OPEN_NAMESPACE namespace Catch { // #included from: ../external/clara.h -// Version 0.0.1.1 +// Version 0.0.2.4 // Only use header guard if we are not using an outer namespace #if !defined(TWOBLUECUBES_CLARA_H_INCLUDED) || defined(STITCH_CLARA_OPEN_NAMESPACE) @@ -3888,6 +3942,10 @@ namespace Tbc { #include #include +#if defined(WIN32) || defined(__WIN32__) || defined(_WIN32) || defined(_MSC_VER) +#define CLARA_PLATFORM_WINDOWS +#endif + // Use optional outer namespace #ifdef STITCH_CLARA_OPEN_NAMESPACE STITCH_CLARA_OPEN_NAMESPACE @@ -3911,9 +3969,6 @@ namespace Clara { const unsigned int consoleWidth = 80; #endif - // Use this to try and stop compiler from warning about unreachable code - inline bool isTrue( bool value ) { return value; } - using namespace Tbc; inline bool startsWith( std::string const& str, std::string const& prefix ) { @@ -3949,14 +4004,6 @@ namespace Clara { else throw std::runtime_error( "Expected a boolean value but did not recognise:\n '" + _source + "'" ); } - inline void convertInto( bool _source, bool& _dest ) { - _dest = _source; - } - template - inline void convertInto( bool, T& ) { - if( isTrue( true ) ) - throw std::runtime_error( "Invalid conversion" ); - } template struct IArgFunction { @@ -3966,7 +4013,6 @@ namespace Clara { IArgFunction( IArgFunction const& ) = default; #endif virtual void set( ConfigT& config, std::string const& value ) const = 0; - virtual void setFlag( ConfigT& config ) const = 0; virtual bool takesArg() const = 0; virtual IArgFunction* clone() const = 0; }; @@ -3988,9 +4034,6 @@ namespace Clara { void set( ConfigT& config, std::string const& value ) const { functionObj->set( config, value ); } - void setFlag( ConfigT& config ) const { - functionObj->setFlag( config ); - } bool takesArg() const { return functionObj->takesArg(); } bool isSet() const { @@ -4003,7 +4046,6 @@ namespace Clara { template struct NullBinder : IArgFunction{ virtual void set( C&, std::string const& ) const {} - virtual void setFlag( C& ) const {} virtual bool takesArg() const { return true; } virtual IArgFunction* clone() const { return new NullBinder( *this ); } }; @@ -4014,9 +4056,6 @@ namespace Clara { virtual void set( C& p, std::string const& stringValue ) const { convertInto( stringValue, p.*member ); } - virtual void setFlag( C& p ) const { - convertInto( true, p.*member ); - } virtual bool takesArg() const { return !IsBool::value; } virtual IArgFunction* clone() const { return new BoundDataMember( *this ); } M C::* member; @@ -4029,11 +4068,6 @@ namespace Clara { convertInto( stringValue, value ); (p.*member)( value ); } - virtual void setFlag( C& p ) const { - typename RemoveConstRef::type value; - convertInto( true, value ); - (p.*member)( value ); - } virtual bool takesArg() const { return !IsBool::value; } virtual IArgFunction* clone() const { return new BoundUnaryMethod( *this ); } void (C::*member)( M ); @@ -4047,9 +4081,6 @@ namespace Clara { if( value ) (p.*member)(); } - virtual void setFlag( C& p ) const { - (p.*member)(); - } virtual bool takesArg() const { return false; } virtual IArgFunction* clone() const { return new BoundNullaryMethod( *this ); } void (C::*member)(); @@ -4064,9 +4095,6 @@ namespace Clara { if( value ) function( obj ); } - virtual void setFlag( C& p ) const { - function( p ); - } virtual bool takesArg() const { return false; } virtual IArgFunction* clone() const { return new BoundUnaryFunction( *this ); } void (*function)( C& ); @@ -4080,11 +4108,6 @@ namespace Clara { convertInto( stringValue, value ); function( obj, value ); } - virtual void setFlag( C& obj ) const { - typename RemoveConstRef::type value; - convertInto( true, value ); - function( obj, value ); - } virtual bool takesArg() const { return !IsBool::value; } virtual IArgFunction* clone() const { return new BoundBinaryFunction( *this ); } void (*function)( C&, T ); @@ -4092,8 +4115,20 @@ namespace Clara { } // namespace Detail - struct Parser { - Parser() : separators( " \t=:" ) {} + inline std::vector argsToVector( int argc, char const* const* const argv ) { + std::vector args( static_cast( argc ) ); + for( std::size_t i = 0; i < static_cast( argc ); ++i ) + args[i] = argv[i]; + + return args; + } + + class Parser { + enum Mode { None, MaybeShortOpt, SlashOpt, ShortOpt, LongOpt, Positional }; + Mode mode; + std::size_t from; + bool inQuotes; + public: struct Token { enum Type { Positional, ShortOpt, LongOpt }; @@ -4102,38 +4137,75 @@ namespace Clara { std::string data; }; - void parseIntoTokens( int argc, char const* const argv[], std::vector& tokens ) const { + Parser() : mode( None ), from( 0 ), inQuotes( false ){} + + void parseIntoTokens( std::vector const& args, std::vector& tokens ) { const std::string doubleDash = "--"; - for( int i = 1; i < argc && argv[i] != doubleDash; ++i ) - parseIntoTokens( argv[i] , tokens); + for( std::size_t i = 1; i < args.size() && args[i] != doubleDash; ++i ) + parseIntoTokens( args[i], tokens); } - void parseIntoTokens( std::string arg, std::vector& tokens ) const { - while( !arg.empty() ) { - Parser::Token token( Parser::Token::Positional, arg ); - arg = ""; - if( token.data[0] == '-' ) { - if( token.data.size() > 1 && token.data[1] == '-' ) { - token = Parser::Token( Parser::Token::LongOpt, token.data.substr( 2 ) ); - } - else { - token = Parser::Token( Parser::Token::ShortOpt, token.data.substr( 1 ) ); - if( token.data.size() > 1 && separators.find( token.data[1] ) == std::string::npos ) { - arg = "-" + token.data.substr( 1 ); - token.data = token.data.substr( 0, 1 ); - } - } - } - if( token.type != Parser::Token::Positional ) { - std::size_t pos = token.data.find_first_of( separators ); - if( pos != std::string::npos ) { - arg = token.data.substr( pos+1 ); - token.data = token.data.substr( 0, pos ); - } - } - tokens.push_back( token ); + + void parseIntoTokens( std::string const& arg, std::vector& tokens ) { + for( std::size_t i = 0; i <= arg.size(); ++i ) { + char c = arg[i]; + if( c == '"' ) + inQuotes = !inQuotes; + mode = handleMode( i, c, arg, tokens ); } } - std::string separators; + Mode handleMode( std::size_t i, char c, std::string const& arg, std::vector& tokens ) { + switch( mode ) { + case None: return handleNone( i, c ); + case MaybeShortOpt: return handleMaybeShortOpt( i, c ); + case ShortOpt: + case LongOpt: + case SlashOpt: return handleOpt( i, c, arg, tokens ); + case Positional: return handlePositional( i, c, arg, tokens ); + default: throw std::logic_error( "Unknown mode" ); + } + } + + Mode handleNone( std::size_t i, char c ) { + if( inQuotes ) { + from = i; + return Positional; + } + switch( c ) { + case '-': return MaybeShortOpt; +#ifdef CLARA_PLATFORM_WINDOWS + case '/': from = i+1; return SlashOpt; +#endif + default: from = i; return Positional; + } + } + Mode handleMaybeShortOpt( std::size_t i, char c ) { + switch( c ) { + case '-': from = i+1; return LongOpt; + default: from = i; return ShortOpt; + } + } + Mode handleOpt( std::size_t i, char c, std::string const& arg, std::vector& tokens ) { + if( std::string( ":=\0", 3 ).find( c ) == std::string::npos ) + return mode; + + std::string optName = arg.substr( from, i-from ); + if( mode == ShortOpt ) + for( std::size_t j = 0; j < optName.size(); ++j ) + tokens.push_back( Token( Token::ShortOpt, optName.substr( j, 1 ) ) ); + else if( mode == SlashOpt && optName.size() == 1 ) + tokens.push_back( Token( Token::ShortOpt, optName ) ); + else + tokens.push_back( Token( Token::LongOpt, optName ) ); + return None; + } + Mode handlePositional( std::size_t i, char c, std::string const& arg, std::vector& tokens ) { + if( inQuotes || std::string( "\0", 1 ).find( c ) == std::string::npos ) + return mode; + + std::string data = arg.substr( from, i-from ); + tokens.push_back( Token( Token::Positional, data ) ); + return None; + } }; template @@ -4436,21 +4508,21 @@ namespace Clara { return oss.str(); } - ConfigT parse( int argc, char const* const argv[] ) const { + ConfigT parse( std::vector const& args ) const { ConfigT config; - parseInto( argc, argv, config ); + parseInto( args, config ); return config; } - std::vector parseInto( int argc, char const* argv[], ConfigT& config ) const { - std::string processName = argv[0]; + std::vector parseInto( std::vector const& args, ConfigT& config ) const { + std::string processName = args[0]; std::size_t lastSlash = processName.find_last_of( "/\\" ); if( lastSlash != std::string::npos ) processName = processName.substr( lastSlash+1 ); m_boundProcessName.set( config, processName ); std::vector tokens; Parser parser; - parser.parseIntoTokens( argc, argv, tokens ); + parser.parseIntoTokens( args, tokens ); return populate( tokens, config ); } @@ -4481,7 +4553,7 @@ namespace Clara { arg.boundField.set( config, tokens[++i].data ); } else { - arg.boundField.setFlag( config ); + arg.boundField.set( config, "true" ); } break; } @@ -4624,6 +4696,21 @@ namespace Catch { ? ShowDurations::Always : ShowDurations::Never; } + inline void setUseColour( ConfigData& config, std::string const& value ) { + std::string mode = toLower( value ); + + if( mode == "yes" ) + config.useColour = UseColour::Yes; + else if( mode == "no" ) + config.useColour = UseColour::No; + else if( mode == "auto" ) + config.useColour = UseColour::Auto; + else + throw std::runtime_error( "colour mode must be one of: auto, yes or no" ); + } + inline void forceColour( ConfigData& config ) { + config.useColour = UseColour::Yes; + } inline void loadTestNamesFromFile( ConfigData& config, std::string const& _filename ) { std::ifstream f( _filename.c_str() ); if( !f.is_open() ) @@ -4710,7 +4797,7 @@ namespace Catch { cli["-d"]["--durations"] .describe( "show test durations" ) - .bind( &setShowDurations, "yes/no" ); + .bind( &setShowDurations, "yes|no" ); cli["-f"]["--input-file"] .describe( "load test names to run from a file" ) @@ -4738,8 +4825,12 @@ namespace Catch { .bind( &setRngSeed, "'time'|number" ); cli["--force-colour"] - .describe( "force colourised output" ) - .bind( &ConfigData::forceColour ); + .describe( "force colourised output (deprecated)" ) + .bind( &forceColour ); + + cli["--use-colour"] + .describe( "should output be colourised" ) + .bind( &setUseColour, "yes|no" ); return cli; } @@ -5170,6 +5261,8 @@ namespace Catch bool aborting; }; + class MultipleReporters; + struct IStreamingReporter : IShared { virtual ~IStreamingReporter(); @@ -5197,6 +5290,8 @@ namespace Catch virtual void testRunEnded( TestRunStats const& testRunStats ) = 0; virtual void skipTest( TestCaseInfo const& testInfo ) = 0; + + virtual MultipleReporters* tryAsMulti() { return CATCH_NULL; } }; struct IReporterFactory : IShared { @@ -5414,6 +5509,10 @@ namespace TestCaseTracking { virtual void addChild( Ptr const& child ) = 0; virtual ITracker* findChild( std::string const& name ) = 0; virtual void openChild() = 0; + + // Debug/ checking + virtual bool isSectionTracker() const = 0; + virtual bool isIndexTracker() const = 0; }; class TrackerContext { @@ -5538,6 +5637,10 @@ namespace TestCaseTracking { m_parent->openChild(); } } + + virtual bool isSectionTracker() const CATCH_OVERRIDE { return false; } + virtual bool isIndexTracker() const CATCH_OVERRIDE { return false; } + void open() { m_runState = Executing; moveToThis(); @@ -5601,13 +5704,16 @@ namespace TestCaseTracking { {} virtual ~SectionTracker(); + virtual bool isSectionTracker() const CATCH_OVERRIDE { return true; } + static SectionTracker& acquire( TrackerContext& ctx, std::string const& name ) { SectionTracker* section = CATCH_NULL; ITracker& currentTracker = ctx.currentTracker(); if( ITracker* childTracker = currentTracker.findChild( name ) ) { - section = dynamic_cast( childTracker ); - assert( section ); + assert( childTracker ); + assert( childTracker->isSectionTracker() ); + section = static_cast( childTracker ); } else { section = new SectionTracker( name, ctx, ¤tTracker ); @@ -5632,13 +5738,16 @@ namespace TestCaseTracking { {} virtual ~IndexTracker(); + virtual bool isIndexTracker() const CATCH_OVERRIDE { return true; } + static IndexTracker& acquire( TrackerContext& ctx, std::string const& name, int size ) { IndexTracker* tracker = CATCH_NULL; ITracker& currentTracker = ctx.currentTracker(); if( ITracker* childTracker = currentTracker.findChild( name ) ) { - tracker = dynamic_cast( childTracker ); - assert( tracker ); + assert( childTracker ); + assert( childTracker->isIndexTracker() ); + tracker = static_cast( childTracker ); } else { tracker = new IndexTracker( name, ctx, ¤tTracker, size ); @@ -5845,6 +5954,11 @@ namespace Catch { while( getCurrentContext().advanceGeneratorsForCurrentTest() && !aborting() ); Totals deltaTotals = m_totals.delta( prevTotals ); + if( testInfo.expectedToFail() && deltaTotals.testCases.passed > 0 ) { + deltaTotals.assertions.failed++; + deltaTotals.testCases.passed--; + deltaTotals.testCases.failed++; + } m_totals.testCases += deltaTotals.testCases; m_reporter->testCaseEnded( TestCaseStats( testInfo, deltaTotals, @@ -6236,10 +6350,10 @@ namespace Catch { Catch::cout() << "For more detail usage please see the project docs\n" << std::endl; } - int applyCommandLine( int argc, char const* argv[], OnUnusedOptions::DoWhat unusedOptionBehaviour = OnUnusedOptions::Fail ) { + int applyCommandLine( int argc, char const* const* const argv, OnUnusedOptions::DoWhat unusedOptionBehaviour = OnUnusedOptions::Fail ) { try { m_cli.setThrowOnUnrecognisedTokens( unusedOptionBehaviour == OnUnusedOptions::Fail ); - m_unusedTokens = m_cli.parseInto( argc, argv, m_configData ); + m_unusedTokens = m_cli.parseInto( Clara::argsToVector( argc, argv ), m_configData ); if( m_configData.showHelp ) showHelp( m_configData.processName ); m_config.reset(); @@ -6263,16 +6377,13 @@ namespace Catch { m_config.reset(); } - int run( int argc, char const* argv[] ) { + int run( int argc, char const* const* const argv ) { int returnCode = applyCommandLine( argc, argv ); if( returnCode == 0 ) returnCode = run(); return returnCode; } - int run( int argc, char* argv[] ) { - return run( argc, const_cast( argv ) ); - } int run() { if( m_configData.showHelp ) @@ -6336,13 +6447,31 @@ namespace Catch { #include #include +#ifdef CATCH_CPP14_OR_GREATER +#include +#endif + namespace Catch { - struct LexSort { - bool operator() (TestCase i,TestCase j) const { return (i + static void shuffle( V& vector ) { + RandomNumberGenerator rng; +#ifdef CATCH_CPP14_OR_GREATER + std::shuffle( vector.begin(), vector.end(), rng ); +#else + std::random_shuffle( vector.begin(), vector.end(), rng ); +#endif + } }; inline std::vector sortTests( IConfig const& config, std::vector const& unsortedTestCases ) { @@ -6351,14 +6480,12 @@ namespace Catch { switch( config.runOrder() ) { case RunTests::InLexicographicalOrder: - std::sort( sorted.begin(), sorted.end(), LexSort() ); + std::sort( sorted.begin(), sorted.end() ); break; case RunTests::InRandomOrder: { seedRng( config ); - - RandomNumberGenerator rng; - std::random_shuffle( sorted.begin(), sorted.end(), rng ); + RandomNumberGenerator::shuffle( sorted ); } break; case RunTests::InDeclarationOrder: @@ -6377,13 +6504,15 @@ namespace Catch { it != itEnd; ++it ) { std::pair::const_iterator, bool> prev = seenFunctions.insert( *it ); - if( !prev.second ){ - Catch::cerr() - << Colour( Colour::Red ) - << "error: TEST_CASE( \"" << it->name << "\" ) already defined.\n" - << "\tFirst seen at " << prev.first->getTestCaseInfo().lineInfo << "\n" - << "\tRedefined at " << it->getTestCaseInfo().lineInfo << std::endl; - exit(1); + if( !prev.second ) { + std::ostringstream ss; + + ss << Colour( Colour::Red ) + << "error: TEST_CASE( \"" << it->name << "\" ) already defined.\n" + << "\tFirst seen at " << prev.first->getTestCaseInfo().lineInfo << "\n" + << "\tRedefined at " << it->getTestCaseInfo().lineInfo << std::endl; + + throw std::runtime_error(ss.str()); } } } @@ -6971,7 +7100,18 @@ namespace { IColourImpl* platformColourInstance() { static Win32ColourImpl s_instance; - return &s_instance; + + Ptr config = getCurrentContext().getConfig(); + UseColour::YesOrNo colourMode = config + ? config->useColour() + : UseColour::Auto; + if( colourMode == UseColour::Auto ) + colourMode = !isDebuggerActive() + ? UseColour::Yes + : UseColour::No; + return colourMode == UseColour::Yes + ? &s_instance + : NoColourImpl::instance(); } } // end anon namespace @@ -7022,7 +7162,14 @@ namespace { IColourImpl* platformColourInstance() { Ptr config = getCurrentContext().getConfig(); - return (config && config->forceColour()) || isatty(STDOUT_FILENO) + UseColour::YesOrNo colourMode = config + ? config->useColour() + : UseColour::Auto; + if( colourMode == UseColour::Auto ) + colourMode = (!isDebuggerActive() && isatty(STDOUT_FILENO) ) + ? UseColour::Yes + : UseColour::No; + return colourMode == UseColour::Yes ? PosixColourImpl::instance() : NoColourImpl::instance(); } @@ -7047,9 +7194,7 @@ namespace Catch { Colour::~Colour(){ if( !m_moved ) use( None ); } void Colour::use( Code _colourCode ) { - static IColourImpl* impl = isDebuggerActive() - ? NoColourImpl::instance() - : platformColourInstance(); + static IColourImpl* impl = platformColourInstance(); impl->use( _colourCode ); } @@ -7426,7 +7571,7 @@ namespace Catch { return os; } - Version libraryVersion( 1, 3, 4, "", 0 ); + Version libraryVersion( 1, 5, 6, "", 0 ); } @@ -8405,13 +8550,18 @@ public: // IStreamingReporter ++it ) (*it)->skipTest( testInfo ); } + + virtual MultipleReporters* tryAsMulti() CATCH_OVERRIDE { + return this; + } + }; Ptr addReporter( Ptr const& existingReporter, Ptr const& additionalReporter ) { Ptr resultingReporter; if( existingReporter ) { - MultipleReporters* multi = dynamic_cast( existingReporter.get() ); + MultipleReporters* multi = existingReporter->tryAsMulti(); if( !multi ) { multi = new MultipleReporters; resultingReporter = Ptr( multi ); @@ -8591,7 +8741,7 @@ namespace Catch { virtual void assertionStarting( AssertionInfo const& ) CATCH_OVERRIDE {} - virtual bool assertionEnded( AssertionStats const& assertionStats ) { + virtual bool assertionEnded( AssertionStats const& assertionStats ) CATCH_OVERRIDE { assert( !m_sectionStack.empty() ); SectionNode& sectionNode = *m_sectionStack.back(); sectionNode.assertions.push_back( assertionStats ); @@ -9722,7 +9872,7 @@ namespace Catch { if( totals.testCases.total() == 0 ) { stream << Colour( Colour::Warning ) << "No tests ran\n"; } - else if( totals.assertions.total() > 0 && totals.assertions.allPassed() ) { + else if( totals.assertions.total() > 0 && totals.testCases.allPassed() ) { stream << Colour( Colour::ResultSuccess ) << "All tests passed"; stream << " (" << pluralise( totals.assertions.passed, "assertion" ) << " in " From 20e4b20528445ecb3e1de815ff27101160ac1f9c Mon Sep 17 00:00:00 2001 From: Niels Date: Sun, 19 Jun 2016 21:57:32 +0200 Subject: [PATCH 121/133] fix SSL issue with coverity --- .travis.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.travis.yml b/.travis.yml index aee8874f4..b633faae7 100644 --- a/.travis.yml +++ b/.travis.yml @@ -43,6 +43,7 @@ matrix: build_command_prepend: "make clean ; sudo cp $(which g++-5) $(which g++)" build_command: "make" branch_pattern: coverity_scan + before_install: echo -n | openssl s_client -connect scan.coverity.com:443 | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' | sudo tee -a /etc/ssl/certs/ca-certificates.crt env: COMPILER=g++-5 # from https://github.com/travis-ci/travis-ci/issues/6120 From 3fe654e8276c8c0af8b7643717ae96ef8f76b3c7 Mon Sep 17 00:00:00 2001 From: Niels Date: Sun, 19 Jun 2016 22:12:56 +0200 Subject: [PATCH 122/133] fix for coverity --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index b633faae7..d027654ef 100644 --- a/.travis.yml +++ b/.travis.yml @@ -31,6 +31,7 @@ matrix: - os: linux compiler: gcc + before_install: echo -n | openssl s_client -connect scan.coverity.com:443 | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' | sudo tee -a /etc/ssl/certs/ca-certificates.crt addons: apt: sources: ['ubuntu-toolchain-r-test'] @@ -43,7 +44,6 @@ matrix: build_command_prepend: "make clean ; sudo cp $(which g++-5) $(which g++)" build_command: "make" branch_pattern: coverity_scan - before_install: echo -n | openssl s_client -connect scan.coverity.com:443 | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' | sudo tee -a /etc/ssl/certs/ca-certificates.crt env: COMPILER=g++-5 # from https://github.com/travis-ci/travis-ci/issues/6120 From 0865ec87d4084a41f6710147b53c9a0ca877ef40 Mon Sep 17 00:00:00 2001 From: Niels Date: Sun, 19 Jun 2016 22:20:02 +0200 Subject: [PATCH 123/133] re-added GCC6 --- .travis.yml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/.travis.yml b/.travis.yml index d027654ef..271ca8642 100644 --- a/.travis.yml +++ b/.travis.yml @@ -61,13 +61,13 @@ matrix: - mkdir $HOME/clang-$LLVM_VERSION - tar xf $LLVM_ARCHIVE_PATH -C $HOME/clang-$LLVM_VERSION --strip-components 1 -# - os: linux -# compiler: gcc -# addons: -# apt: -# sources: ['ubuntu-toolchain-r-test'] -# packages: ['g++-6', 'valgrind'] -# env: COMPILER=g++-6 + - os: linux + compiler: gcc + addons: + apt: + sources: ['ubuntu-toolchain-r-test'] + packages: ['g++-6', 'valgrind'] + env: COMPILER=g++-6 # Clang 3.5 is not able to compile the code, # see https://travis-ci.org/nlohmann/json/jobs/126720186 From 15a314abea0ef5e5e58c62e62198450dbc2e3339 Mon Sep 17 00:00:00 2001 From: Niels Date: Sun, 19 Jun 2016 22:38:54 +0200 Subject: [PATCH 124/133] updated README --- .travis.yml | 16 ++++++++-------- README.md | 3 ++- 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/.travis.yml b/.travis.yml index 271ca8642..b459f5d5a 100644 --- a/.travis.yml +++ b/.travis.yml @@ -46,6 +46,14 @@ matrix: branch_pattern: coverity_scan env: COMPILER=g++-5 + - os: linux + compiler: gcc + addons: + apt: + sources: ['ubuntu-toolchain-r-test'] + packages: ['g++-6', 'valgrind'] + env: COMPILER=g++-6 + # from https://github.com/travis-ci/travis-ci/issues/6120 - os: linux env: @@ -61,14 +69,6 @@ matrix: - mkdir $HOME/clang-$LLVM_VERSION - tar xf $LLVM_ARCHIVE_PATH -C $HOME/clang-$LLVM_VERSION --strip-components 1 - - os: linux - compiler: gcc - addons: - apt: - sources: ['ubuntu-toolchain-r-test'] - packages: ['g++-6', 'valgrind'] - env: COMPILER=g++-6 - # Clang 3.5 is not able to compile the code, # see https://travis-ci.org/nlohmann/json/jobs/126720186 diff --git a/README.md b/README.md index 6ef3539cc..9f78413fc 100644 --- a/README.md +++ b/README.md @@ -74,6 +74,7 @@ The following compilers are currently used in [continuous integration](https://t |-----------------|------------------------------|----------------| | GCC 4.9.3 | Ubuntu 14.04.4 LTS | g++-4.9 (Ubuntu 4.9.3-8ubuntu2~14.04) 4.9.3 | | GCC 5.3.0 | Ubuntu 14.04.4 LTS | g++-5 (Ubuntu 5.3.0-3ubuntu1~14.04) 5.3.0 20151204 | +| GCC 6.1.1 | Ubuntu 14.04.4 LTS | g++-6 (Ubuntu 6.1.1-3ubuntu11~14.04.1) 6.1.1 20160511 | | Clang 3.8.0 | Ubuntu 14.04.4 LTS | clang version 3.8.0 (tags/RELEASE_380/final) | | Clang Xcode 6.1 | Darwin Kernel Version 13.4.0 (OSX 10.9.5) | Apple LLVM version 6.0 (clang-600.0.54) (based on LLVM 3.5svn) | | Clang Xcode 6.2 | Darwin Kernel Version 13.4.0 (OSX 10.9.5) | Apple LLVM version 6.0 (clang-600.0.57) (based on LLVM 3.5svn) | @@ -81,7 +82,7 @@ The following compilers are currently used in [continuous integration](https://t | Clang Xcode 6.4 | Darwin Kernel Version 14.3.0 (OSX 10.10.3) | Apple LLVM version 6.1.0 (clang-602.0.53) (based on LLVM 3.6.0svn) | | Clang Xcode 7.1 | Darwin Kernel Version 14.5.0 (OSX 10.10.5) | Apple LLVM version 7.0.0 (clang-700.1.76) | | Clang Xcode 7.2 | Darwin Kernel Version 15.0.0 (OSX 10.10.5) | Apple LLVM version 7.0.2 (clang-700.1.81) | -| Clang Xcode 7.3 | Darwin Kernel Version 14.5.0 (OSX 10.11.1) | Apple LLVM version 7.3.0 (clang-703.0.29) | +| Clang Xcode 7.3 | Darwin Kernel Version 15.0.0 (OSX 10.10.5) | Apple LLVM version 7.3.0 (clang-703.0.29) | | Clang Xcode 8.0 | Darwin Kernel Version 15.5.0 (OSX 10.11.5) | Apple LLVM version 8.0.0 (clang-800.0.24.1) | | Visual Studio 14 2015 | Windows Server 2012 R2 (x64) | Microsoft (R) Build Engine version 14.0.25123.0 | From 3f97a5d5ad8f102a2c401706755ce9f0567564e8 Mon Sep 17 00:00:00 2001 From: Niels Date: Wed, 22 Jun 2016 20:05:44 +0200 Subject: [PATCH 125/133] a conceptual quick fix for #269 --- src/json.hpp | 7 +++++-- src/json.hpp.re2c | 7 +++++-- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/src/json.hpp b/src/json.hpp index 9d6687ddc..09b6a800c 100644 --- a/src/json.hpp +++ b/src/json.hpp @@ -10002,13 +10002,16 @@ basic_json_parser_63: // in a second pass, traverse the remaining elements // remove my remaining elements + const auto end_index = static_cast(result.size()); while (i < source.size()) { - result.push_back(object( + // add operations in reverse order to avoid invalid + // indices + result.insert(result.begin() + end_index, { {"op", "remove"}, {"path", path + "/" + std::to_string(i)} - })); + }); ++i; } diff --git a/src/json.hpp.re2c b/src/json.hpp.re2c index 9681bed2f..c5de92463 100644 --- a/src/json.hpp.re2c +++ b/src/json.hpp.re2c @@ -9312,13 +9312,16 @@ class basic_json // in a second pass, traverse the remaining elements // remove my remaining elements + const auto end_index = static_cast(result.size()); while (i < source.size()) { - result.push_back(object( + // add operations in reverse order to avoid invalid + // indices + result.insert(result.begin() + end_index, { {"op", "remove"}, {"path", path + "/" + std::to_string(i)} - })); + }); ++i; } From 59e67e768f11a18df143eed033cf4fe5a34fbd1d Mon Sep 17 00:00:00 2001 From: Niels Date: Wed, 22 Jun 2016 20:09:06 +0200 Subject: [PATCH 126/133] fix for previous commit --- src/json.hpp | 4 ++-- src/json.hpp.re2c | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/json.hpp b/src/json.hpp index 09b6a800c..c514015a5 100644 --- a/src/json.hpp +++ b/src/json.hpp @@ -10007,11 +10007,11 @@ basic_json_parser_63: { // add operations in reverse order to avoid invalid // indices - result.insert(result.begin() + end_index, + result.insert(result.begin() + end_index, object( { {"op", "remove"}, {"path", path + "/" + std::to_string(i)} - }); + })); ++i; } diff --git a/src/json.hpp.re2c b/src/json.hpp.re2c index c5de92463..86d901145 100644 --- a/src/json.hpp.re2c +++ b/src/json.hpp.re2c @@ -9317,11 +9317,11 @@ class basic_json { // add operations in reverse order to avoid invalid // indices - result.insert(result.begin() + end_index, + result.insert(result.begin() + end_index, object( { {"op", "remove"}, {"path", path + "/" + std::to_string(i)} - }); + })); ++i; } From ecf84dddb1abb2e7e1e937279b51e91d0e77d495 Mon Sep 17 00:00:00 2001 From: Niels Date: Wed, 22 Jun 2016 20:40:15 +0200 Subject: [PATCH 127/133] test case for #269 --- README.md | 2 +- test/src/unit.cpp | 9 +++++++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 9f78413fc..7efcabc5d 100644 --- a/README.md +++ b/README.md @@ -453,7 +453,7 @@ $ make $ ./json_unit "*" =============================================================================== -All tests passed (5568705 assertions in 31 test cases) +All tests passed (5568722 assertions in 32 test cases) ``` For more information, have a look at the file [.travis.yml](https://github.com/nlohmann/json/blob/master/.travis.yml). diff --git a/test/src/unit.cpp b/test/src/unit.cpp index 609e1be95..12611b3fe 100644 --- a/test/src/unit.cpp +++ b/test/src/unit.cpp @@ -14073,6 +14073,15 @@ TEST_CASE("regression tests") CHECK(data == json({{"key", "value"}, {"key2", "value2"}, {"key3", "value3"}})); } + + SECTION("issue #269 - diff generates incorrect patch when removing multiple array elements") + { + json doc = R"( { "arr1": [1, 2, 3, 4] } )"_json; + json expected = R"( { "arr1": [1, 2] } )"_json; + + // check roundtrip + CHECK(doc.patch(json::diff(doc, expected)) == expected); + } } // special test case to check if memory is leaked if constructor throws From 6f76c9237bacb4da34e08c9ecda514968f4f8b50 Mon Sep 17 00:00:00 2001 From: Niels Date: Wed, 22 Jun 2016 22:20:55 +0200 Subject: [PATCH 128/133] overworked ChangeLog and README --- ChangeLog.md | 9 +++ README.md | 145 +++++++++++++++++++++++++++++++--------------- test/src/unit.cpp | 38 +++++++++++- 3 files changed, 142 insertions(+), 50 deletions(-) diff --git a/ChangeLog.md b/ChangeLog.md index f0654ea28..a60026f14 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -5,6 +5,7 @@ All notable changes to this project will be documented in this file. This projec [Full Changelog](https://github.com/nlohmann/json/compare/v1.1.0...HEAD) +- concatenate objects [\#252](https://github.com/nlohmann/json/issues/252) - Unit test fails when doing a CMake out-of-tree build [\#241](https://github.com/nlohmann/json/issues/241) - Additional integration options [\#237](https://github.com/nlohmann/json/issues/237) - Can't use basic\_json::iterator as a base iterator for std::move\_iterator [\#233](https://github.com/nlohmann/json/issues/233) @@ -14,6 +15,7 @@ All notable changes to this project will be documented in this file. This projec - Add support for afl-fuzz testing [\#207](https://github.com/nlohmann/json/pull/207) ([mykter](https://github.com/mykter)) - Issue \#178 - Extending support to full uint64\_t/int64\_t range and unsigned type \(updated\) [\#193](https://github.com/nlohmann/json/pull/193) ([twelsby](https://github.com/twelsby)) +- Maybe a bug [\#258](https://github.com/nlohmann/json/issues/258) - -Wconversion warnings [\#239](https://github.com/nlohmann/json/issues/239) - ambiguous overload for 'push\_back' and 'operator+=' [\#235](https://github.com/nlohmann/json/issues/235) - double values are serialized with commas as decimal points [\#228](https://github.com/nlohmann/json/issues/228) @@ -26,11 +28,18 @@ All notable changes to this project will be documented in this file. This projec - Floating point exceptions [\#181](https://github.com/nlohmann/json/issues/181) - In basic\_json::basic\_json\(const CompatibleArrayType& val\), the requirement of CompatibleArrayType is not strict enough. [\#174](https://github.com/nlohmann/json/issues/174) - Implicit assignment to std::string fails [\#144](https://github.com/nlohmann/json/issues/144) +- Fix Issue \#265 [\#266](https://github.com/nlohmann/json/pull/266) ([06needhamt](https://github.com/06needhamt)) - Issue \#195 - update Travis to Trusty due to gcc/clang strtod\(\) bug [\#196](https://github.com/nlohmann/json/pull/196) ([twelsby](https://github.com/twelsby)) +- Compiler Errors With JSON.hpp [\#265](https://github.com/nlohmann/json/issues/265) +- VS2015 compile fail [\#260](https://github.com/nlohmann/json/issues/260) +- Error when using json in g++ [\#254](https://github.com/nlohmann/json/issues/254) +- Update long-term goals [\#246](https://github.com/nlohmann/json/issues/246) +- Error compile Android NDK error: 'strtof' is not a member of 'std' [\#219](https://github.com/nlohmann/json/issues/219) - Conflicting typedef of ssize\_t on Windows 32 bit when using Boost.Python [\#204](https://github.com/nlohmann/json/issues/204) - Integer conversion to unsigned [\#178](https://github.com/nlohmann/json/issues/178) +- Define CMake/CTest tests [\#247](https://github.com/nlohmann/json/pull/247) ([robertmrk](https://github.com/robertmrk)) - Out of tree builds and a few other miscellaneous CMake cleanups. [\#242](https://github.com/nlohmann/json/pull/242) ([ChrisKitching](https://github.com/ChrisKitching)) - Implement additional integration options [\#238](https://github.com/nlohmann/json/pull/238) ([robertmrk](https://github.com/robertmrk)) - make serialization locale-independent [\#232](https://github.com/nlohmann/json/pull/232) ([nlohmann](https://github.com/nlohmann)) diff --git a/README.md b/README.md index 9f78413fc..cb05d744b 100644 --- a/README.md +++ b/README.md @@ -16,7 +16,7 @@ There are myriads of [JSON](http://json.org) libraries out there, and each may e - **Intuitive syntax**. In languages such as Python, JSON feels like a first class data type. We used all the operator magic of modern C++ to achieve the same feeling in your code. Check out the [examples below](#examples) and you know, what I mean. -- **Trivial integration**. Our whole code consists of a single header file `json.hpp`. That's it. No library, no subproject, no dependencies, no complex build system. The class is written in vanilla C++11. All in all, everything should require no adjustment of your compiler flags or project settings. +- **Trivial integration**. Our whole code consists of a single header file [`json.hpp`](https://github.com/nlohmann/json/blob/develop/src/json.hpp). That's it. No library, no subproject, no dependencies, no complex build system. The class is written in vanilla C++11. All in all, everything should require no adjustment of your compiler flags or project settings. - **Serious testing**. Our class is heavily [unit-tested](https://github.com/nlohmann/json/blob/master/test/src/unit.cpp) and covers [100%](https://coveralls.io/r/nlohmann/json) of the code, including all exceptional behavior. Furthermore, we checked with [Valgrind](http://valgrind.org) that there are no memory leaks. @@ -28,6 +28,7 @@ Other aspects were not so important to us: See the [contribution guidelines](https://github.com/nlohmann/json/blob/master/.github/CONTRIBUTING.md#please-dont) for more information. + ## Integration The single required source, file `json.hpp` is in the `src` directory or [released here](https://github.com/nlohmann/json/releases). All you need to do is add @@ -43,48 +44,6 @@ to the files you want to use JSON objects. That's it. Do not forget to set the n :beer: If you are using OS X and [Homebrew](http://brew.sh), just type `brew tap nlohmann/json` and `brew install nlohmann_json` and you're set. If you want the bleeding edge rather than the latest release, use `brew install nlohmann_json --HEAD`. -## Supported compilers - -Though it's 2016 already, the support for C++11 is still a bit sparse. Currently, the following compilers are known to work: - -- GCC 4.9 - 6.0 (and possibly later) -- Clang 3.4 - 3.9 (and possibly later) -- Microsoft Visual C++ 2015 / 14.0 (and possibly later) - -I would be happy to learn about other compilers/versions. - -Please note: - -- GCC 4.8 does not work because of two bugs ([55817](https://gcc.gnu.org/bugzilla/show_bug.cgi?id=55817) and [57824](https://gcc.gnu.org/bugzilla/show_bug.cgi?id=57824)) in the C++11 support. Note there is a [pull request](https://github.com/nlohmann/json/pull/212) to fix some of the issues. -- Android defaults to using very old compilers and C++ libraries. To fix this, add the following to your `Application.mk`. This will switch to the LLVM C++ library, the Clang compiler, and enable C++11 and other features disabled by default. - - ``` - APP_STL := c++_shared - NDK_TOOLCHAIN_VERSION := clang3.6 - APP_CPPFLAGS += -frtti -fexceptions - ``` - - The code compiles successfully with [Android NDK](https://developer.android.com/ndk/index.html?hl=ml), Revision 9 - 11 (and possibly later) and [CrystaX's Android NDK](https://www.crystax.net/en/android/ndk) version 10. - -- For GCC running on MinGW or Android SDK, the error `'to_string' is not a member of 'std'` (or similarly, for `strtod`) may occur. Note this is not an issue with the code, but rather with the compiler itself. On Android, see above to build with a newer environment. For MinGW, please refer to [this site](http://tehsausage.com/mingw-to-string) and [this discussion](https://github.com/nlohmann/json/issues/136) for information on how to fix this bug. For Android NDK using `APP_STL := gnustl_static`, please refer to [this discussion](https://github.com/nlohmann/json/issues/219). - -The following compilers are currently used in [continuous integration](https://travis-ci.org/nlohmann/json): - -| Compiler | Operating System | Version String | -|-----------------|------------------------------|----------------| -| GCC 4.9.3 | Ubuntu 14.04.4 LTS | g++-4.9 (Ubuntu 4.9.3-8ubuntu2~14.04) 4.9.3 | -| GCC 5.3.0 | Ubuntu 14.04.4 LTS | g++-5 (Ubuntu 5.3.0-3ubuntu1~14.04) 5.3.0 20151204 | -| GCC 6.1.1 | Ubuntu 14.04.4 LTS | g++-6 (Ubuntu 6.1.1-3ubuntu11~14.04.1) 6.1.1 20160511 | -| Clang 3.8.0 | Ubuntu 14.04.4 LTS | clang version 3.8.0 (tags/RELEASE_380/final) | -| Clang Xcode 6.1 | Darwin Kernel Version 13.4.0 (OSX 10.9.5) | Apple LLVM version 6.0 (clang-600.0.54) (based on LLVM 3.5svn) | -| Clang Xcode 6.2 | Darwin Kernel Version 13.4.0 (OSX 10.9.5) | Apple LLVM version 6.0 (clang-600.0.57) (based on LLVM 3.5svn) | -| Clang Xcode 6.3 | Darwin Kernel Version 14.3.0 (OSX 10.10.3) | Apple LLVM version 6.1.0 (clang-602.0.49) (based on LLVM 3.6.0svn) | -| Clang Xcode 6.4 | Darwin Kernel Version 14.3.0 (OSX 10.10.3) | Apple LLVM version 6.1.0 (clang-602.0.53) (based on LLVM 3.6.0svn) | -| Clang Xcode 7.1 | Darwin Kernel Version 14.5.0 (OSX 10.10.5) | Apple LLVM version 7.0.0 (clang-700.1.76) | -| Clang Xcode 7.2 | Darwin Kernel Version 15.0.0 (OSX 10.10.5) | Apple LLVM version 7.0.2 (clang-700.1.81) | -| Clang Xcode 7.3 | Darwin Kernel Version 15.0.0 (OSX 10.10.5) | Apple LLVM version 7.3.0 (clang-703.0.29) | -| Clang Xcode 8.0 | Darwin Kernel Version 15.5.0 (OSX 10.11.5) | Apple LLVM version 8.0.0 (clang-800.0.24.1) | -| Visual Studio 14 2015 | Windows Server 2012 R2 (x64) | Microsoft (R) Build Engine version 14.0.25123.0 | ## Examples @@ -167,6 +126,7 @@ json empty_object_explicit = json::object(); json array_not_object = { json::array({"currency", "USD"}), json::array({"value", 42.99}) }; ``` + ### Serialization / Deserialization You can create an object (deserialization) by appending `_json` to a string literal: @@ -175,7 +135,7 @@ You can create an object (deserialization) by appending `_json` to a string lite // create object from string literal json j = "{ \"happy\": true, \"pi\": 3.141 }"_json; -// or even nicer (thanks http://isocpp.org/blog/2015/01/json-for-modern-cpp) +// or even nicer with a raw string literal auto j2 = R"( { "happy": true, @@ -220,6 +180,7 @@ These operators work for any subclasses of `std::istream` or `std::ostream`. Please note that setting the exception bit for `failbit` is inappropriate for this use case. It will result in program termination due to the `noexcept` specifier in use. + ### STL-like access We designed the JSON class to behave just like an STL container. In fact, it satisfies the [**ReversibleContainer**](http://en.cppreference.com/w/cpp/concept/ReversibleContainer) requirement. @@ -287,6 +248,7 @@ int fob_present = o.count("fob"); // 0 o.erase("foo"); ``` + ### Conversion from STL containers Any sequence container (`std::array`, `std::vector`, `std::deque`, `std::forward_list`, `std::list`) whose values can be used to construct JSON types (e.g., integers, floating point numbers, Booleans, string types, or again STL containers described in this section) can be used to create a JSON array. The same holds for similar associative containers (`std::set`, `std::multiset`, `std::unordered_set`, `std::unordered_multiset`), but in these cases the order of the elements of the array depends how the elements are ordered in the respective STL container. @@ -349,12 +311,51 @@ json j_ummap(c_ummap); // only one entry for key "three" is used // maybe {"one": true, "two": true, "three": true} ``` +### JSON Pointer and JSON Patch + +The library supports **JSON Pointer** ([RFC 6901](https://tools.ietf.org/html/rfc6901)) as alternative means to address structured values. On top of this, **JSON Patch** ([RFC 6902](https://tools.ietf.org/html/rfc6902)) allows to describe differences between two JSON values - effectively allowing patch and diff operations known from Unix. + +```cpp +// a JSON value +json j_original = R"({ + "baz": ["one", "two", "three"], + "foo": "bar" +})"_json; + +// access members with a JSON pointer (RFC 6901) +j_original["/baz/2"_json_pointer]; +// "two" + +// a JSON patch (RFC 6902) +json j_patch = R"([ + { "op": "replace", "path": "/baz", "value": "boo" }, + { "op": "add", "path": "/hello", "value": ["world"] }, + { "op": "remove", "path": "/foo"} +])"_json; + +// apply the patch +json j_result = j_original.patch(j_patch); +// { +// "baz": "boo", +// "hello": ["world"] +// } + +// calculate a JSON patch from two JSON values +json::diff(j_result, j_original); +// [ +// { "op":" replace", "path": "/baz", "value": ["one", "two", "three"] }, +// { "op":"remove","path":"/hello" }, +// { "op":"add","path":"/foo","value":"bar" } +// ] +``` + + ### Implicit conversions The type of the JSON object is determined automatically by the expression to store. Likewise, the stored value is implicitly converted. ```cpp -/// strings +// strings std::string s1 = "Hello, world!"; json js = s1; std::string s2 = js; @@ -382,6 +383,51 @@ int vi = jn.get(); // etc. ``` + +## Supported compilers + +Though it's 2016 already, the support for C++11 is still a bit sparse. Currently, the following compilers are known to work: + +- GCC 4.9 - 6.0 (and possibly later) +- Clang 3.4 - 3.9 (and possibly later) +- Microsoft Visual C++ 2015 / 14.0 (and possibly later) + +I would be happy to learn about other compilers/versions. + +Please note: + +- GCC 4.8 does not work because of two bugs ([55817](https://gcc.gnu.org/bugzilla/show_bug.cgi?id=55817) and [57824](https://gcc.gnu.org/bugzilla/show_bug.cgi?id=57824)) in the C++11 support. Note there is a [pull request](https://github.com/nlohmann/json/pull/212) to fix some of the issues. +- Android defaults to using very old compilers and C++ libraries. To fix this, add the following to your `Application.mk`. This will switch to the LLVM C++ library, the Clang compiler, and enable C++11 and other features disabled by default. + + ``` + APP_STL := c++_shared + NDK_TOOLCHAIN_VERSION := clang3.6 + APP_CPPFLAGS += -frtti -fexceptions + ``` + + The code compiles successfully with [Android NDK](https://developer.android.com/ndk/index.html?hl=ml), Revision 9 - 11 (and possibly later) and [CrystaX's Android NDK](https://www.crystax.net/en/android/ndk) version 10. + +- For GCC running on MinGW or Android SDK, the error `'to_string' is not a member of 'std'` (or similarly, for `strtod`) may occur. Note this is not an issue with the code, but rather with the compiler itself. On Android, see above to build with a newer environment. For MinGW, please refer to [this site](http://tehsausage.com/mingw-to-string) and [this discussion](https://github.com/nlohmann/json/issues/136) for information on how to fix this bug. For Android NDK using `APP_STL := gnustl_static`, please refer to [this discussion](https://github.com/nlohmann/json/issues/219). + +The following compilers are currently used in continuous integration at [Travis](https://travis-ci.org/nlohmann/json) and [AppVeyor](https://ci.appveyor.com/project/nlohmann/json): + +| Compiler | Operating System | Version String | +|-----------------|------------------------------|----------------| +| GCC 4.9.3 | Ubuntu 14.04.4 LTS | g++-4.9 (Ubuntu 4.9.3-8ubuntu2~14.04) 4.9.3 | +| GCC 5.3.0 | Ubuntu 14.04.4 LTS | g++-5 (Ubuntu 5.3.0-3ubuntu1~14.04) 5.3.0 20151204 | +| GCC 6.1.1 | Ubuntu 14.04.4 LTS | g++-6 (Ubuntu 6.1.1-3ubuntu11~14.04.1) 6.1.1 20160511 | +| Clang 3.8.0 | Ubuntu 14.04.4 LTS | clang version 3.8.0 (tags/RELEASE_380/final) | +| Clang Xcode 6.1 | Darwin Kernel Version 13.4.0 (OSX 10.9.5) | Apple LLVM version 6.0 (clang-600.0.54) (based on LLVM 3.5svn) | +| Clang Xcode 6.2 | Darwin Kernel Version 13.4.0 (OSX 10.9.5) | Apple LLVM version 6.0 (clang-600.0.57) (based on LLVM 3.5svn) | +| Clang Xcode 6.3 | Darwin Kernel Version 14.3.0 (OSX 10.10.3) | Apple LLVM version 6.1.0 (clang-602.0.49) (based on LLVM 3.6.0svn) | +| Clang Xcode 6.4 | Darwin Kernel Version 14.3.0 (OSX 10.10.3) | Apple LLVM version 6.1.0 (clang-602.0.53) (based on LLVM 3.6.0svn) | +| Clang Xcode 7.1 | Darwin Kernel Version 14.5.0 (OSX 10.10.5) | Apple LLVM version 7.0.0 (clang-700.1.76) | +| Clang Xcode 7.2 | Darwin Kernel Version 15.0.0 (OSX 10.10.5) | Apple LLVM version 7.0.2 (clang-700.1.81) | +| Clang Xcode 7.3 | Darwin Kernel Version 15.0.0 (OSX 10.10.5) | Apple LLVM version 7.3.0 (clang-703.0.29) | +| Clang Xcode 8.0 | Darwin Kernel Version 15.5.0 (OSX 10.11.5) | Apple LLVM version 8.0.0 (clang-800.0.24.1) | +| Visual Studio 14 2015 | Windows Server 2012 R2 (x64) | Microsoft (R) Build Engine version 14.0.25123.0 | + + ## License @@ -390,11 +436,12 @@ The class is licensed under the [MIT License](http://opensource.org/licenses/MIT Copyright © 2013-2016 [Niels Lohmann](http://nlohmann.me) -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + ## Thanks @@ -439,11 +486,13 @@ I deeply appreciate the help of the following people. Thanks a lot for helping out! + ## Notes - The code contains numerous debug **assertions** which can be switched off by defining the preprocessor macro `NDEBUG`, see the [documentation of `assert`](http://en.cppreference.com/w/cpp/error/assert). - As the exact type of a number is not defined in the [JSON specification](http://rfc7159.net/rfc7159), this library tries to choose the best fitting C++ number type automatically. As a result, the type `double` may be used to store numbers which may yield [**floating-point exceptions**](https://github.com/nlohmann/json/issues/181) in certain rare situations if floating-point exceptions have been unmasked in the calling code. These exceptions are not caused by the library and need to be fixed in the calling code, such as by re-masking the exceptions prior to calling library functions. + ## Execute unit tests To compile and run the tests, you need to execute @@ -453,7 +502,7 @@ $ make $ ./json_unit "*" =============================================================================== -All tests passed (5568705 assertions in 31 test cases) +All tests passed (5568721 assertions in 32 test cases) ``` For more information, have a look at the file [.travis.yml](https://github.com/nlohmann/json/blob/master/.travis.yml). diff --git a/test/src/unit.cpp b/test/src/unit.cpp index 609e1be95..e1c0b4c60 100644 --- a/test/src/unit.cpp +++ b/test/src/unit.cpp @@ -10371,7 +10371,7 @@ TEST_CASE("README", "[hide]") // create object from string literal json j = "{ \"happy\": true, \"pi\": 3.141 }"_json; - // or even nicer (thanks http://isocpp.org/blog/2015/01/json-for-modern-cpp) + // or even nicer with a raw string literal auto j2 = R"( { "happy": true, @@ -10499,7 +10499,7 @@ TEST_CASE("README", "[hide]") } { - /// strings + // strings std::string s1 = "Hello, world!"; json js = s1; std::string s2 = js; @@ -10522,6 +10522,40 @@ TEST_CASE("README", "[hide]") // etc. } + + { + // a JSON value + json j_original = R"({ + "baz": ["one", "two", "three"], + "foo": "bar" + })"_json; + + // access members with a JSON pointer (RFC 6901) + j_original["/baz/2"_json_pointer]; + // "two" + + // a JSON patch (RFC 6902) + json j_patch = R"([ + { "op": "replace", "path": "/baz", "value": "boo" }, + { "op": "add", "path": "/hello", "value": ["world"] }, + { "op": "remove", "path": "/foo"} + ])"_json; + + // apply the patch + json j_result = j_original.patch(j_patch); + // { + // "baz": "boo", + // "hello": ["world"] + // } + + // calculate a JSON patch from two JSON values + json::diff(j_result, j_original); + // [ + // { "op":" replace", "path": "/baz", "value": ["one", "two", "three"] }, + // { "op":"remove","path":"/hello" }, + // { "op":"add","path":"/foo","value":"bar" } + // ] + } } TEST_CASE("algorithms") From 3497fab3b539850c1d2e69f0ee20edf9ee42c9e1 Mon Sep 17 00:00:00 2001 From: Niels Date: Thu, 23 Jun 2016 05:55:48 +0200 Subject: [PATCH 129/133] cleanup --- README.md | 4 ---- 1 file changed, 4 deletions(-) diff --git a/README.md b/README.md index 9f0737fb0..4bb8b0be4 100644 --- a/README.md +++ b/README.md @@ -502,11 +502,7 @@ $ make $ ./json_unit "*" =============================================================================== -<<<<<<< HEAD All tests passed (5568722 assertions in 32 test cases) -======= -All tests passed (5568721 assertions in 32 test cases) ->>>>>>> develop ``` For more information, have a look at the file [.travis.yml](https://github.com/nlohmann/json/blob/master/.travis.yml). From 39a9cfcc12fdc7e363806488bf15a7a2352ad3ad Mon Sep 17 00:00:00 2001 From: Niels Date: Thu, 23 Jun 2016 18:08:20 +0200 Subject: [PATCH 130/133] updated README --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 4bb8b0be4..21ff3c593 100644 --- a/README.md +++ b/README.md @@ -502,7 +502,7 @@ $ make $ ./json_unit "*" =============================================================================== -All tests passed (5568722 assertions in 32 test cases) +All tests passed (5568715 assertions in 32 test cases) ``` For more information, have a look at the file [.travis.yml](https://github.com/nlohmann/json/blob/master/.travis.yml). From 6542ae57666e8a9663e629e31598876d3a805bbf Mon Sep 17 00:00:00 2001 From: Niels Date: Thu, 23 Jun 2016 22:49:48 +0200 Subject: [PATCH 131/133] fixed re2c warnings --- Makefile | 2 +- src/json.hpp.re2c | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Makefile b/Makefile index 6ea1d85d9..56e46d145 100644 --- a/Makefile +++ b/Makefile @@ -67,7 +67,7 @@ cppcheck: # create scanner with re2c re2c: src/json.hpp.re2c - $(RE2C) --bit-vectors --nested-ifs --no-debug-info $< | $(SED) '1d' > src/json.hpp + $(RE2C) -W --bit-vectors --nested-ifs --no-debug-info $< | $(SED) '1d' > src/json.hpp # pretty printer pretty: diff --git a/src/json.hpp.re2c b/src/json.hpp.re2c index 05b7ece63..aba10b496 100644 --- a/src/json.hpp.re2c +++ b/src/json.hpp.re2c @@ -7388,10 +7388,10 @@ class basic_json number { return token_type::value_number; } // string - quotation_mark = [\"]; + quotation_mark = ["]; escape = [\\]; - unescaped = [^\"\\\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0A\x0B\x0C\x0D\x0E\x0F]; - single_escaped = [\"\\/bfnrt]; + unescaped = [^"\\\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0A\x0B\x0C\x0D\x0E\x0F]; + single_escaped = ["\\/bfnrt]; unicode_escaped = [u][0-9a-fA-F]{4}; escaped = escape (single_escaped | unicode_escaped); char = unescaped | escaped; From b3cf45c8f5856c802d8a53e2cb1d75276c5131ba Mon Sep 17 00:00:00 2001 From: Niels Date: Thu, 23 Jun 2016 23:34:41 +0200 Subject: [PATCH 132/133] updated release information --- ChangeLog.md | 3 +++ doc/json.gif | Bin 366465 -> 451520 bytes 2 files changed, 3 insertions(+) diff --git a/ChangeLog.md b/ChangeLog.md index a60026f14..ae9e562f9 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -15,9 +15,12 @@ All notable changes to this project will be documented in this file. This projec - Add support for afl-fuzz testing [\#207](https://github.com/nlohmann/json/pull/207) ([mykter](https://github.com/mykter)) - Issue \#178 - Extending support to full uint64\_t/int64\_t range and unsigned type \(updated\) [\#193](https://github.com/nlohmann/json/pull/193) ([twelsby](https://github.com/twelsby)) +- json::diff generates incorrect patch when removing multiple array elements. [\#269](https://github.com/nlohmann/json/issues/269) +- -Wconversion warning [\#259](https://github.com/nlohmann/json/issues/259) - Maybe a bug [\#258](https://github.com/nlohmann/json/issues/258) - -Wconversion warnings [\#239](https://github.com/nlohmann/json/issues/239) - ambiguous overload for 'push\_back' and 'operator+=' [\#235](https://github.com/nlohmann/json/issues/235) +- Incorrect dumping of parsed numbers with exponents, but without decimal places [\#230](https://github.com/nlohmann/json/issues/230) - double values are serialized with commas as decimal points [\#228](https://github.com/nlohmann/json/issues/228) - Move semantics with std::initializer\_list [\#225](https://github.com/nlohmann/json/issues/225) - abort during getline in yyfill [\#223](https://github.com/nlohmann/json/issues/223) diff --git a/doc/json.gif b/doc/json.gif index 7cd94371713db21751ebed893238fcf92ab816ed..7edafe018c464d59c673ee3913805c83a370ae35 100644 GIT binary patch delta 447265 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%0DLd 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%0ApHHVM-H4<7I?i1MrL~>NU{a5y+ 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

77fGb(rM>KvP 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 VxBJT{Z-c`k#Xd%-O$-zmtO0_{7?J=0 delta 362463 zcmX?bT)J_+7_Ymhn}ucKF{TNO-~Tf#=P6}lW>fsh!tjE5vM{s#bp8sq-t+ zCU*)fUj3Ln!Tx?jlbeA4iV25>3brtv+r{&h`CPq5CeOn|oVqN5ZR&R$)(F`09hdR5 z5)yynZ^d)mr{86U&WH6|`4ozUZ7h%L_*p!Av-pDTV~Mu~7SDI|2pJ3iktqm&cO&Vz zkl~yKhj@ek9Q3vc2y;5bnX%aRkmN6g5IzMBfe*$EYzquLEV$Ped;Ggo%pbs{@LcDM z7gy%;*e1dHClXWo#g#?+nzRKIix1to8YOVnchZ!Aid$+A3VNM3tw=cZEMu~OtF?Au z?$!fQPY<8s=L)#TAhc8C?h}P#{fQeKkNi+zczTUX;jnHH|C4@0_Y=G}3`{JHJ|9_H zjSk#ln~@}7=lDnafVv>-ra$aA?>u4uz%pgg1liN47x=vj{a;^Q8us|W!vmkL25mTQ zwf+2Am)oqo#+HAtU2@RlYw8wYxDX|CLd#b)`vGy>tnXvEcN|(}i$#X-` z3AV~JDKOM0Oyc?Pdbsh!Vm|vA23BsTKJHn93`Q@GIZ9Y;XRu)EbdPxC9Fy2Ef3HHJ z)lY>FMhd(wdmb^w+9XP>Z{j!I@S$C7MXS`;T%{#b^I=t^)tmpgOB`5e? ztwo1RMczYTiL;jBcGC|o6Q@Ww{Ny{t{%huk?ze}p|6V23UHx|hLr25BiPt*Tn{lZK zO<8<$T#Y%4zUO25TyufLA zIqKXQcggx=O|dr)%m0>OSFuxIjFfr8H^usZNZdl6s1n7p;$Y{GXDqi{3Ao66XQ(?r z%UtVsXHuPA!BdA_i3e(yvGg1gc^u+Ucy>PP1Gd=}ZDunPJEb;!V4Yv=Vcizc$XzkD zp2=%PyPHKKI>!xF$Ev_iKRy;&qZ!hS&lLI_uP_Td{4<^N zK%l^^e`i>qN_5!GT5!4b!TO_*YQK@Z*uMLaITur(c7VcK-b8kuf33}PQ(c7qOEG9^Yzbqq z5SCH>5y?I$RUq}05@WG)Q_z1wevKEQBCV<~&hstcI%>6WBil!JJ%f#$$Nur~%)Q{E zHf!OI*clJ&S@;zk7z6?s@${K*R*vWPY?uus^)Rr^6K;kT-Xl~!U4w}Ju#O92Dt zu?5|)xQ@syFevOaZse|ia9G%M!hwHGa*7kObDYiy`5m*b|MIa*(Zhj((c=L7g$bb@ z29KGF7c+Kn8})_T80>j`G`!NZDXwPa^u2RrPM8{f*epEbv10y=Xr`#b3DG7Ad2tr+ z?0J4~*1O>+|L^E@hG#1#)cp`YU;D<8fywc>rAtE*V}s*l{!9Hv-*y~lENIZ*(a4;A z*Ftg8UvU|(rhfGs5%pVHBi)3#JZ&`$oE3j;U|IVAXoHi8@{GN`pX~n#_9$w+PZxU7 zyrYq^k>Ss;a^Dljl~;u7dUB))zn^9*_b;(C`u`iY>CGKV&&00xc1+*%?5M}$wO=#3 z-J%q3y*O}QZ39nxPeGos$8pDd7nyq&=P4}tH=X_88byKHgzZtQ`DSje=jY&PYDnf> zwnTckB~6(_7E8E7jxT^J#6fBw6^2mDg&$RA;FEpDZ8jP~iA$ zV-dr)7=_m-{xB*tJUF{tDxP1Uh4n*gi`JnZ@un4w`-~iTn_e7Bzvk8S@c-5?^*YJl z8A=#U_&#;#2ESu!&1d@8T3vn3pZ7AU4_E-fcnjZwJ;{ z?gDeJJI(*j-=UCjx|yjqt$2C5E^h(z{$$|)RukxakWq7h$$oRm zhYOYLEv&WQ`M(qtSv-mUe}M1fbtg%MbQZ<3di%*tG3mNo4cs@s8%s{8DL%|4z z-&TDYha$G`Eery!b>^*akGqvkkW;)vU)Z3A;~?+ZcKz0ZwyQ?W zSHJ656;y^Zw3}^bQ=PyhVqh*Yfk`ugX{v%ib%Ud7eFO7NjrgtN?ZO;3U%yoSaAMgv zp@iW9bFFJdM~1HP1|GlT)fd?K9TsF72r&QnYV6I>^Y|It6k$g51Lnn#qhAN){4Zi$ zG=cB716z(d)7S6(^LN;YB=jt+@H6|s)XTvjuz-gzkn7fWrpo2zn>@P3K9(~GR0v-B z7kADiJ;%YGw|)bwb&9|Q19K^Z47Nr-Z3FY)Y(-3A%%X; zVdz>up}8_sm%V_=a0B!0(5_qT4Dt`S-cR5wUQo+^p@lb*v-mSJ%gS=Y5BioLX6eq1 zn^4hxmL=+5g8S)Urd0y9{~b7rg_&Af1>PxiUtPp@ro;V#0*m(#uKx>IeRnn%f9_=| zNEty({Wjz8OrDaA7_Df$!CZR<4f`pDcQ>DJ3&KR>R1-9p`Cql8;fC+{bu%{Z(;wPn2!GBul!-`QjjU|F~X*Rzx#uJ^A7&# zhN@!>e6}k}R<-hbelY&W&CtU9k-NUKl6Bi=F1{H|fmQ+&7StYg;Xn6NKPn;o&`RnX~ zwgG|Pw=wLBT3sEXyGd%zma3T?NlVx_^2R%q7GGuzG#6n0ZY+0TF55vqJp=R8Zd3l( zKVo{9z$?_QuUNpFU@(_iaan3dL-j9x&IO(<8;kEu^AoZ#=P}?G`WRtdz`whp`syd< z&lC7^SI&KPf%hTT3T8zl;3BP5Y%EIiZ_zR*19f{M+fgS2t|Dae+NY zojFNm;ZE~@R>4(Qg_xbc@&629{qW?UK>06Y_xglIydU|ps=Dl*nKe)6FU;J$c!I*I zDuJ&LxEwBY6;Ec_cWRb>G2_F>W}M!2r*AU7Ua`+(NbGmV!XB zf%#K+fyW=}?ZvbOjxjLWKW30#z}UB&u`*g$<-lB}YPYE9O}EThSWfcG{VhqymLEhOfQSCd#5J>!q_>JjTj1pXj~FigV)egrh$WDJ`K;3a z4BS1O4&oO)E`2u^4Txe(+{DmuAaBcoQ!fN|KG^@Gh;hj)fo0JLe@xo-k7eVo`nn!{ zshA}jW()kBo4DY|AqLi%txQo> z%!&L{ckN#-aD?53(Xw-5r6iM`r$B+uai;o%JBy8va2N6}VCmYjHjko^WFTVuX@3e#gXe)`?NKG^gAA$`ftR{)Xd9jZ5}$o;3`9T#geGK z0sjtNtKY;L^qAlGkG`P6j9dfr>CvmqHu(Qf;C6}DWldPKbryrH!>Xy;Ox(YYvD-x7 z_+xx)jljnPvwvJ-^F1Z->j3xa16*OXSHpa{mhiYNxWE-rdv)~%?y{@A@x52qCwTr4 zV#s{Jm0EkXqFJHfi?RQPy_^$y6=QXU0t){h;D7T|UtXa80NY32wr+i=3*~L4Od_`Y z8@Jf-ycOW{6?iv+*=Ywat0Cu#Rh%i^`qH)Q)jRAzKk%P2nS;rYmn(Mus--+do%+5B zi~cY)GXyX`U%?(6Dd5m~`M`rU@0Kod+O=q#ffOC;XRHidEAaHfwjV)^=L`gTF1XK*75E+# z%%~R8e=7e>%;D4CmtV2$i`L;`b!0DKZIE1hQ>Itn;DKuqgAMlqZYDuqg_`6W7ta28 zbdlvFAKR{FBE4Jw7qJBy^SNkyxIgeZ6mV;^#@%ea*K_{r_rCFzkt^SQn5UsK`L6?8@#a%XD{6}j1orm>dz2c{ie3~>ou(;N;SIdz{ovHl<5Uk(Pb0=8`jc%KUJR!o?=%uQhK zhRfHOm@*1DavcsQXr4T6$#hVc`_1Y-yu8n3cAeNJ&6%6br;Ut_~4@E^w~gyZ`?Mj^fA6M{n}a z|Bxy6f$h3L{Z)qiD@^rgkH+dAUn{Vy;JMQbwxtQ&^A4~wYBBD(Eg+PyYv}M%B=Mt0 z`$v{T{Bdi-Kk_nppI%TYP|U@^q}9N9X3i?si~h^GnR8FAee`PbtAfkiyl*)b-*$cd zuC$Z2;s7(>3kKFVU#>EJ&G>Ds)!^}uVf~vbZstOs%F3LF3^nyX{wXo#ePElJmm~CM zi9`u=IRl&8+K0@BygYqn_76DM1+edwVNhMbadrRqLx1(J?YX{9{s(6xKhxT9c7+7h zhGw3RKh(8<3OoKhll+t6qyGbkCRScKml**Mo!WS1?OG%PAGvgi>dM7TWjNs0Cu^Jc zWl_JvT26W2vXF;oAFO7pSC7pzS@1Gp1*4o}j<&>!r3?WAe`hR7F%WB>t~T+A@(unj zPZ#0;H9m%U3CkGd-D{*h)+}|Ge8ur=ckq=Z3!08;b(rpKl08_P3~d) z$ihz#maUSTen} z)OO&v} z@+UEUVtDl<`GnyKmCI{3^%)53I8skI(qDOkK~Nzj)Snw|4LonZOE;`O|>|DVDO@kKj6 zty&Q9&gpbx5TB4*^K_kt2g;xKB`s+s;k(T#ZpEK}R(+5^$T68?zTG1u-R20X z>NSh&PnbRamtw{uf5h0|_WKj#g>^Oy8P>{`DW8~Yzsl!LdydGjWt?}qxE{1;3Q28T z%(u?)gfLUcn@-n~S4?NMyR=TBR_Nh+ z4OSt+lM3}>iJz4j?-d+8wUw*uIj?TFSHpywJt>-l9dc9t1La_BRdX!Sjw`G z!?1FEd2G@dUAE}pZ(HG8+>3c-H6 z2W<+mRa1>mHofbtPidZR_OIf|yq0GdnVr2y|CJ1=EFz^kqRd1${P#zma1Nv zz^+(Z5b4yEqnOa7_aaRoGsLmJ+9!ZX^52CgCbuy5eD* z;D>d}>;aAP^B$WEO}o&den!~-fFrltgM)nSFIbH36|QSNlPo!F2DA8z4XtJoPLe;n zPuMOv*lCfI$Q4=8tUArHzwHCFynl<5UB-!N8g3Ki1#Y^F&aZH7{cu=%(GF&b`gIf7 zoIV^fACu=|G4_awwFS(gl^+g?taE5{ zJmMtt(m7El)zUlaQ>XmTgvYLVmZzfZmekAdd9&2@$G?f*HE*5eXY)M!{;BXxirM9v z=UdWDmRkB|gYUx)r?ed)GF6mZRclwoWyFB-OOS;Wd zOaH2Cm*;&yl5Y2Pr+?kI%k%%UWH_)|1vH6WS-|d^;Uu~%pv~;cLjKka7gejkuCObM z#E)jUO;^xkWUVhz{Nu39-PI~+(!9yC%_}0goKG!?UpHmpktdVArB&RkYKn}1?qJvP z-gUWYN3t_tCA;B^WBiU52gE9y+!YIqCZ^mur10kjo3_@*?gyeOGP5lXi!miCwS*{( zANb>LIYseuWzu5-hc}mvgB-&yesGp*FF3@zrGV#L$78`jg+ns+Cdd8-@B5|9|6kF= z&WDk=`OacK#|?7&S`Qc!LsEK$Hy&Z0pe$IS@Q~x+=XTR)228rT5BP;-PS_Y-Y?`H$ zz-(^8n&Ir-%IRZfP^`ctd~_!N2DU;T#RAd!Pd>6JhFo=g@xZx?BY{ckzyXO_FIi9O z2(-#ySs+>SRNKtXpymAE`eqT{h{Gbk89A8~8s%SbFfk--IMBIAneWsD4pXlK4adA( zL|9)i2K@`<_nncTJi)n{V}kjF!Ujf0h7AX#>KOTaat;Ww8M4-2FgP0L@qq0UYq}l7 zN44%HPKLV7g{=4cF zzNCx6LG(ogPoV3Gj!+OQSTVW;&3|%u$sB#!IoSCD{t@`LL1u;%ElPiHFf%A@=(cN=W{_}r-&{X$ zq7Li7AB>a#M;v7oVR+ru(!`+Tam-<#AQQKX^JV3!u1qQgcj_-J=8=|k&|pjIyVSEl z@^b_i^E8`@wHCiwVr)6=pENY8Z;U);81dEllp{043I>@k3eKSkAG#Y0oIUI&xZCX5 zAgGg4p-{}=Ajj6kyP0u;ATwt>55ogiN3Z(NGN)Fobr2D3;Nn@Vba=ugaho3Xv?b4Z zJjFdM+X9ojdz?8KEE*K-mh#QO^PkTAvs3B4^%Q-Q;2SCS=@D%wHQWCPvg=)FSapIy^9GX_!hqU{SuV~sIK)ekEhfsWK042%v<>Bw$u~#@jS~OZgg-PI2XT}~EU25nzV7he5{I^|8|^g=?b@f>O&A&^K6KSJ zv~MkJH)m*^)zP4KgUQigPq<@yal=X$ZU$TLjv|E#^#SdL4NGe#wEKQ)FIQ-{F_~Pn zgYEr8)?=TWi#N7sFKBx(lU;|QK{R4PO+dS*75l1-?S&fk2b&MD9(&EWQ@JC31q0gw z)}|G$zBdkJShSQ&cLa90HlAp=;b`DIvF+FG6#)Vbyfda0zF=fvXc84*X#LHe^nrmP zqp9=-`%UKtM~@as38q6z9JMQ0RVFmBB{1h|Fzx!$UX##rYjI2Mi}ndc?Dh_A=@WWt zESMQ~Ff5^)??FLp=4tLWVY|1xSnr5`CGBkK3bkuY-+wEYp zv0&1xU~6t@_nN`TcA_Duf>kC$B!y#&_Ko%;ix!0p{ra7v)+bihPukfJtRRn^R+ptU;rG!rsOgZPp%)oD-OG7cenY zFs}K~o_v6bX9a^%foS9oQQaNwnI6q@9^Q=#?J6@`>tD2)D>TmX=BS>)#L&U8T&tsa zLZjRTr_u+F5*H3#G;Zdqf8ge4HNB>TrJ68zdH+G{eH84?)1I~r#H zXfKv%@|)6DuffK{&>;MSQTj!nxdKO(0?W&YM&ph~Ee-~`KkcOqObi-Ljy4<~3JuJ{ z9c-WZUqp8l3GCuMVduxwxb%>%DMN$95B8KD3=9%XM-(}N6c|`vwAR;iuyH9c_-eE= zXfW;!ZsQSP`0LCOw}3%dVqwaO2L1zG9-GhqG-5dx+-Tg;s4c)?rNEJ~gMpQSt!)A; zyMmsHM5_Qtlgc0Vf(uPd1`L-EHi}y?Oncli>1LDjghpRZ=3P76XJ#{QG3JO(XzcZ1 z5V>$5Lzscpp|$lu3u8uep+Y^ggax-%Lc2}DKgO3US{fPJH7^J;{$MbWaH+q+y0Dr- zvw=~ofq`iU3!hIbKSP6nLW_Dt6R%)PZwHg{kA_K%Eu4>-w@I@pa5TxEv1xwMsx@&} zGXq9l7ZDQf!F22eGlN5evTaAr0~b*R_D#$U@&)Z43=L8V?X?*mG6r_d z5$)?QGv40Oeo)|g{emv(i1z9m%=J8-O*u2#l{6&R|Em$TW@unjXlwOom#>)bbb!6u zpoy8ot-zzHUbUq%gYD&phB+#1rlt*C987<_nO>i4HClVAMWgLAGb8s8M(+m=e1F?> zCrs2**x!7DP4vTN?FQy#4>8pfO!_leXV?ZitvSPP(a5R5Dw5#eID^$xl`-rBd%YvlS~*UBpjHdYr*8-;5OfzV@`F0xDQA63f8C( zERq`=LuWWeuV@X?U}E^d;BCMjY{;gz;=Dy3>P1_fBezl$*HrxgS}~O<9=O^RDpAWzgsyR8uTu9-cxGh(qQoS=G8Z%2vDfmadjk{k@#x$W8+dz@#8 z1=n8?QkfxBC&4UX(3&RE!s5~3Gh_X39;Tl*`|imw#tAgb|6pNy;8@RL&dtHr`hvZl zw?VL?rP`xqQX_+11-k=B14qS{x*yF99t~~+th^DeLK_$>G}-_JcjQ zfssL>@o`ogZ$bl~FT3;)ruZ3cj}9=z{y24trJh0h#;&S03{A!za%_I~`9GbKW8kiRtwCrH}t;O^ytBup6;l|B&JAsXs3_Udx{H#0nx;8g@ z{$P)hm~SC4E2f}>B?|2Us~f@vI1(rHX)b85>tNn+xTU_MU5BAT`U6*R z1Y=Vr3v&d655t6@2mE3u%ws0-nJlnxT)_5lPjIV2yO~8Jg93y64<q1Fo?^`Cli8jU!@TA)`}PA2O~I@z4h@~o9Qu2ky=>c$e`vULhTZW( zhs=gnso$)u77fR2IFbbXG!C#Q&1hiTA#1|GU?9=PY0;op@7Q5s%8~*SSI^kVpwT=d zn~9(hSsTJ zSzU)%SriI|6d2auY5y3|;%mUbaYMf(p;s?KDg8mi!qpR8HD=md)Qg9BG%!904>e%m ziC}BB_{Vm?qFKAEy)Bn9?KQh~b(;V~Q}CQ8HZzo}D_9=(FqkbcX^dcHI>6v_@uUU= z180M&=@h2dj>!xf&21)47gRd(Crnh`z?=7iPv*q!`W?(N4(;w5GwnR&Lj?|8k7&0^ zXc1b_n)^Z0!-FGbf{?jHy+S$1R;?55RS{jc*p{}HBs5NFSLtZ3`@zYlV39n7fwh6P zwStwoqTzSSOI`~G{|2_en@#I)E=jI9uW~~mM1f1`#BHArZtES33MU9U33G^i+#EAu zf>Ok^bPs;R8DcWr4B9_fbT-_vOi*$=(O9^H{rgkKwP#qE1R9(oW(PSm)Z2%2MD5t7 zV$PA}!1Sf0nem@OYx4&d#vRNK+->X(jqG+GdoOirewd*7VP0`WBm0b&nb(*ZWEl7g zzHd0ekisA|DVWjKm_4uhN&N-(9<%1aORaNMIIJG*zW=8^%;1ecL^D?+>nBl;o6L?) z0_-9_jJX9$Qm@(*44QmB8v{7R>cbTpL=uiJ3251|A|>kq1FJ($orbm24F;AQ>zjA5 zFdD3yIHmd6Yl}jOrmzZjP3y*`PVFgo8d*1O;8@UHccU$%=3b2e>)I!-+Zz~a{L~=#&ua=-TYQ>k_-R zzwG^r%Et6yVg&}@Gfz^wO* zMfc^N`WNjE91YAXzSlEwF(fe0wKr!__+zxAkE4PAlEf#DFYkpJgzxYyo6Pv&l2cW%QstZJtPRP{ z*L@fyuDoSo&`-?T@q0Qqn_2(GlzT6~^9wUFHY>#m)dwhC4zyyZ%lMm~&)uN-ph`vm z9{1{*wf}E@6}_x~*R*)sS;dKq-_Ms_=Jvl)X+gtO$0PwJ52F+Pev6i0Gjb{TCUTWY z!H;*_1ULSnl3MHp<70&IO! zQUg>NdM+sGtB7m~w)GV_@Z9O}gbfXv;-`|&YA?>JFgm5VdXLd*-Q9nTnr|Msno{_` z=Tkakk4s8Ge}_&>7lY~)>GR@(ED1~#uRNI$F2}aAsgYsxClRM8xtT%-`0D*?Hy@s# zvLxw%dS`;cDZf7@f)1M8xra@;k6xPW&cu));9+6?d9f?2q-4nn#`RJz{%X<;7Y=H( zIT|12dt344_derV;!z3qG<~d34l#Nt=`pf#-9f!1=0dlarom%DJ3j`74#&$2`0m($RuFSt^@PQc znYBp5geUV{Lx16f28K-&I;3kpHCOymmePO0z_6>qwy5JE=RE@tyJZXwhyFemNdTfmpDp~%3L!NC8*ph0p;{Q}{U^}k}Q}vq#O`IMFdqP|o85uho^~%h8I4qLX*E=*YUQ*NGU%?>NzraaT z$$+`whZEPT8K%>eu1IRJDP}?a2bsXn_Oj2R63L6r5MsVBsL~La|p-5fu@ z49-`Y|A}cZG&~k#;$&cHl)awOB(Uhml$wNKz9TPMWwaC;9j^2^?Mq-_nWA`Pa1_)^I=*7H`!_}|i8l=#(gzwOR(uqxcS+{c zaA08II=~=mvuHlICcA9Nf<|VM11#k)+T0HbvR<+B(L2pSbOv)L@*d-L{;%!>lGoEZz&vK@32)(Bu$zH(6Y149ds1_P7LoMgo# z2O2pW4B88?F!QNTaH{8jbK!A{&qKDr1Sheeg@;>LEauVjXyX5Kpk<=Y6KRhQ2En=u zZCZ*a5<*j;A&oWjW0!SI8!j1I#=R^cc7g;(mCMApo31s?~pX9MfBK z@m-~gv&1Ps0o!?vJtZzJGFe=L_4*PYSgI9H$W9BJYA|WHK!t*{`1OLvc3T2@^4|QC zIeEh^Ng zEaWzSzVo@=f6EKab(?Y<9x!k@9%G*5P_Xc^q?D9{gLcikE+(Hh@>3ZO$j?~!b!~C| z-q&&et>%UsHb^XaEPwA6^NsUb982u@&L7(N&(Cg2Kttq`z3MdYy zeSA|!{RYEV5k>}cmS3OO)!V*F&M&V~ILLJU!SVV{Vrtb>WSf~L|FAT-5@4yCq0A=G z@#5X&^?#lk?_cw?z=`|D!)}fh4QI|SpI~t$q1L9InI+)|yYj4-cdsY!|MSe=zU9w@ zrepy}hF$LVEx!tP&%eExBl5#hb`61wAD{RC{}=wxWDf&7#{m(IbN?U4YSkQI6=_ho zbBEDRfyHgX-TIGBak=wZ%I4aoI3<@{Wi4C4UY9WMs`Hsfh3o&mGTT}xa4uWGwN8P1 z+XC)=3OvUa@SIcNy|#e&o&w*q1$^%m_`faS|ED0pworgiQBZ85pq!$R+Cm{cMPajr z!gh)xZVN^H6h*@pipD95r7aZ8Qxq>-C|;*1(Y8>cPf>E(LP?f+ic-s_-!Wm8s(+^_ z|81fCKSc$$MGAaMieift<&>1v7Aff|DVr@)wo_7ZTcqNrq#CwJHBLz_ZIN1@l6u)9 z^*SYuwnZ9!N}AIaY0gv9TDC}Qos#ypMcVt6bdD|3Ij5w1ZISLhCB0{h^xi4ye_N#g zPsxC7u>qg5q1a+WIb|cY#YTF{#%7EE8Q0q>o474D@l!SpTWlJqY?ijzEKk|IY_WNr zvPIisi#}z`X^SoADO)XDY_(3=dfQ^_eabe+7TcUtw!OC4_MWocv&DArl zz_!GJPsLGeiKCo~liCs|Jr!rOCC+v#E^bR){8U`Smbk{LxTP&|%TsYLTjE});?cIm zqpx1YbJ`Nmc`9DZmUyjG@!qz?d!LHWu_Zp|RD7>3@x7u%)4Ks$pqM!}3(a%a(@MsYbLdjp$R2 zoVGM_o@&&xrBUltqqi-M-lrOKY-!9n)!1uGWA6n;s>VHA8uv~${@c>{f2s*=%M$q1 z62+D!%Bdx(Elbi2+!uZObzH)H0_n z%bcf{wQO0|x-?!k76!<+qv;Ro84c<=*hNG{q@|_BCB+2<_?4BFwY9Z1HPlT^Ol)jy zEG*0o^z{`K6ddgBU0htey}dm=+=GLIqobq4Bf>cd8e5Lw=l_rF#O^(){7@d;knk;^NB8tUu0Ch77`F%+I=Dn7$PW|ocE40D!#HHA6$4Bhf7^PDy2 zyXh?S(pcbbxWwONX`touQ0o=pb}J+0=Qud6j&)m`=(R4ze`AL4hVNj?z?wwV$b4uy93Hc2T^;eb6vF59qv{gy48_w3oTW5@Ol8`jTTH1ELt=7S4ck1Xvzwxa*U znki>D%{f!wy!L$O#%pu-UY@e!Lht6wdsdv>wWj67wC*!=nomrfaCZKr^NXfkSUTtO zsu>rTFTA>b>Gh4vZ){n4bL+a>J2&0kyYJw>YX{feI=1c3somEPZ8&&v|DBb`Zf`#I zV9VLZyDx3Ke{jeBL;DXN*!}S6{zoScA3l8M^y%X#j^93id6zB_zCx0;gP;YvJ=ful*E%z-G@^Mvk(%hJFc~$J`ZEFvu z?F)MumCB_p%_pLwpdi4|aDRWD{iLP(?ZiORfH|VY-xr>EwE^Qt`bULB=8sVvGjT39!%K;xaF6 z7i6zjWJr$Q$M7Ew!MC#TicyDoUfwUcv?F)pnQGM88Fo5` zC^OVEp12s;P@gEkn=HZB`P8BDm+OjoOQyXN$=*=vIYGbPD1>XqziDA9Tr=+Hx+o`z zXoxa0R5`Hp6xC&B1RAdvnSDxAlwn!}YreutA%k;GDN{EVb5z}6pTF-{_?l&9uXO`* zZ+OTX$S53ebXj@l`9jy#952LkrA{)YG3^sw>0lsGZ@PJP{KT*&ZcGfHpGvWKU0lMjqHErqy1jmx&IB3=&g5J<__WcS*6B~w#wg~+$Br%H7gLzYx-{u6L%Gl6 ze+<6HQ`%TMuf|hq%s3RHeqc(W!oCv+q>_ahcv3#3W@<2`i6tB<6?|eouSwb3I{&rb5D|ZMfdkO@{7dsm1r#Yz%9~mfiuIu8;|}y;gDcm!ssRZVIgBg;Dnh!Svy;HC;r`He&&W??!tZ+ zhifN9XLI~euUc{@W8So9?u};{4Y)N}rS&))g!ouOxA-jGH7(;%ZEZ(ledG(1Eh&qQ z?zSa))W2cK_?NEgb*sNct7Wc~591Qf8B9z6dn)D33bXxVa6w!&Dc*4s^99|Lpuk`vz|wZmC9^49GLjd;JMKehRgkivhV zGi%*6y=JM(7OaYLi{~-6W~tO!YGipibQ^!Ia7UJwPvLy76`a9!54~iC7jJZURj}cO zuWv__h|f00>-wDaH%`U>GVT2&$L6^(_J9%3qBg#h%lAn;Hym0J9`x(RrukPT*Oix9 zHheQX(yqyR^;nYd!4Hht4ohAydf~DBLC000)clyEt&+1XIrzEUcJ1vkGv9E@!%TV0 zBIyO&{wW<(%FAI|yGcKJ?$&!Bm>w@%=^@U*Ww0Y-h6Mw&$7F|+sN3~ltajS$JsYrE zr@Mh8$ANF(gu{owtbDj+-ec~vCD;~3;`hllCOvIHIxmznjR%N-W%xZKiZRwFJO@~mN@l2mtqi_nP%>213=a@joYPcUNO z5%qCxE>8F)#YXTg+HT%X0~N!~ik63J%EymytG^E-uu?^I{6ZEdL6 zG-bZM(%K}5ealff;g8n@?0u&k=5bHx?Y;L$OQa{ggT3ZkzrsAm28MqzY7_LXM<`r+ z@hR<_`6DAY=3|UICcAuMP%C&=))A}P(dql@?EW(!>OY^FbMn1yY%|ZtCrdZ#ylBtfDnKnbZV|~(h6P~IIhnq4PclPYKC3*Pb*`kT@ znfz~0u?yuK5jc`}L9FA7*#hbO!_y~Sc>OCew?!q6$CzpBKC_$zi_;3c0#z$yI41kg zxm|efgEyPbqmG|;SKB*pzmb;nNJ}<%$gEf}zq8A2(btn<`#EO46Uk=K;SgGt@b{$1 z24M%b4-2^Kzcj9W)E&S3gSheINm40%T&ig2*xz8<{r_ z|7<7pvvo3;f03JERe7n9%j$`*obEpMpg()IKTK>gHoYbj@De^nJ%t-cxrjob^ra% z>=GN?K0GQHJXSX^T*G@Y!xUA4g{8_nr)JnJH_=#}y|mDEy}H0bv-+(p)=gJx>H`_S zezo)8ZkQL|m?0s0Vp@Hx-4ljx=7@ZyECvSW+;4?T1C_(e%WsBxPybSrQ=C}5+~j}| zLuG@&r2}05LYoDSZZGjFc4ZXs*?BGQm_UANc;$wJ;@zSuUe7Wc9;UM%3}kS~Vlk{L zuE?)kkvs2su!V$e)}?5NWVZ&#c9G!pt`it6!OVzHbq_SS*oOZD(Cs|i8 zflHc2x`?evysdGQODW67s5-|w+qRO+1|`3XUEi%p49-YC79ntnt(P^?{Lw;gmT(P0 z)tr{c!Fz5@u(?>p@S!RoJgT1AFlL@b#gSA20X3bLZ&i0*M6)I)tv$-6!NI_LfSZ*y zgq<>27f1T$RhphcpR>$Zv_jz$tg?Ls2`^8ON@(E7LWkuf24aRO06^76;FTp>Fl;W(q4? zjm*CH{1@bDV{Em0-s5p1bjp*0><^tAoMSIHDC(37OfqGd8z6A>`4pYUu`DVYY!jmH zd$98`mbz;Qq^T7!39?T+SiI<2yYTa=Ws>1+2lQDFPrLZ3_pZv!n9`6!G2J3|8`Dcs zNk3YY8gqB`G*&%1tA?W#r+vr=%l#Qgd+-N=l9??U1H#*7zU2F^M<*NZt>Vyl+&wM>_z z`2{K(XE|+M%qA=p@m>6&K?5@(tuzlfCD-q_$HwMx4&V!^D^H&YwJH2fM0i&id>;cRFUYEa~9m~^FN z=9Y8`tIhRunHjlvD={9J#BlW@kEKwt;$pSTU)7ukmsy($oW776d18uIq|0t2h66#2 zvzgrIGpc=?(Kz`KL`~crlyi~N!|r&nHR**Ypvq&7V2nCej{O2fB1k!`ypL>H_d5*$swYS zzb`ScT(H&C)OcC4u|grM&ysgdg2a!@t{0Z^$XrmAG5F{GB9iNrAj7W10{;}l4o+ZP zzjexG2X;Xw_me^l$1jVEZ_#{xM0M@Q+4_&YHigUXT@9peOcvRrAB#ErHHro8*s$&PwKpU;L5h zxQOk;=^N^93$|X3JE)*hXTcj}%$PWlYd&N4UqY#Ij-oBhw^?oPxOG&&EX)xQgl*$lSUj9=21f z$cdqNgXNCjvifG~s}FFm6A3a=QRfa|KdKZYbimVjlL^ZKHf7a7i+`^*D;RXR3p7N` z1xgF#S=G0)-R5CyWz02T^bp(qeMVt!u%f726Vns!H5V9}6&R#9gtrHBEuFx&U<*Ui zcl#PaMnMNdqi&U)TMSn<1O)1jF|OXgDes^ud0~6K^+Cyn`V7B~93C;SPjOWgX8c~L zzVd>UhniJdsLR^MDI6QQehV?o_hgWEP`bKEC$m8%zd$}(X-m-p>FQEvStka`fURv; z7-yL(2p4dzxj5;#x<-OHgWv_u7%3iS4Xc`o461Xy5>%C#j2VO!*v~CG6uPyZvFo&q z;01Bc4Qz!hKI|8HSXWC51}O3^*msCajqw9R#H3{m&YEsV>-IeEgp+CEQ^L3kPKf+Dp*WE%qFh>SmucaISPlcm+y<50$&4Zs7;`6Rte(Iq zx=rAK0{c9kQwJtE{O)l%mA)k ziCnn_i-Nyeac^MQy*Th^~5$wUf6VziD&v6hPO{9_grR^aA1@T*u^5qllS@LhCRzlHi*g`IGVkR?Qx7t zjsau+X&=VifD04uTu?YD+q&Ccs7K&Lq>$G_VK2qqJPR)>uqQHZV908iAar4G<{NX9 z6Bi8&|6SzUdr6}(WWpYL|a&lPZsGx8oP;NITABlPgvVMd|D3OpK$JVn0Ol5!(s#Z#j_8xJ*HKXKq1OCziL z1WvI+ZoL8~^$Dy(jNG~lZpb(C7(8HV^A$Shz*>9Ydeq&D%O(qYj$ZJe#u{P3+or%= ztt$}Wz%<2I@I?IsuC))CLKFnoIWSF6xIVr2x@sejdcm!EvR7ZHmT#V2clh|t%OBVc z73oWWgYM&^)&yS#mFY2sDv9A5;(#fSd9djr1Cg~ z=CShL6F9VhRsF&P@j6zsbL^{Yxoa4hjTo5M>+-PhG1nyA*xtap?g9IaUQTYt`w<14 zLjTw={AF*uz!j$OgunY%!-IORFa_oahet;DxPJ1^p34;5CfzNX!4a;&WH5nM{Q*-X z!!w3DR>cKRm>%*NU3gYKfmM-#;~(=zcGUvbx(TdveFbj#3bYw8waw*JcDPya;YPi} z^H~Z44Iged1U%q4C$J&lL4uyZ3I_J-1MI!EPp7?Qs$<}&cDQ*s;6Y8p4Wk3~*VZ~P z=^8vRa$x!qEAXL~Np}N#m;zIqf`Fj|Q~z96WrmxVFWgd3U@dT93JJJ=D1lY|!s|r2 zX_K9#F9YyMOCy5}4`&?qBq4H2qO1qoE|jRk-27 z$8!&uF1&lF;_&=&*T=WL56{eHRXK3`;@O97ey^Dr-zU6dR~LAsD)4fK0#p43uAui! zMi1`QEBiA=Zn(uJ_@LUBr@ZdL<=7W*b(zBx?khVy-=4t4-Y@WB@B1Wq=F_?YGXj_r z`fgOebkStIa;gOS(8UZ6ei#tZ|dgnjJl1yA3<|8kt4 z_hm27y8IW%^}evy3qD{l%(-=-@et44hQ^#I9toDYJ2x1e4ej({&Y#HOQV?aFC^d2C z0Ve~usf{5k1WZDhu9@iQiTGu!GEH`KP~WuY%8cOWe)DW=|FKAgya-t2+AHTeE97O+ zGT*scrltxFO$-cclsvwMybfCz+s-se@#B%Ta}3k@O4O7enPh|~)H}>>^JI}v&nfgP zW^4Ak+c-1DZ?~$l%j(QFw=*qIm0HvesBhWRBE4lQx1@IICrd>ET}NGYtAGC%T3it5 zoVm^|Bxg>c!X^pz0DtFeN>2_*sEgkcQ%iooMMsy#YWJl@%5fGd|6IP!iuqae?Cf0o zcDdNcY^$#dKbSZ#c6YdrieY`F97nIe=)qn8AB1{;=<3;ZVZ)RO56jAyX@_`BSdrAa z#z0(s&5njfmXL(zhb`I)N{t&c85AAabT_Sdq_ZGTbHbWA2GyFAe<-Ll_BS!@S;Qr@ zVa4e!oArWt4FsJ&G%vW3*1T-nB&P*V+~P3>sR}w7XPnrsbDVm_!n$2~lZSGDy^GPw zr(ux`tT?>_jl48D53v|JC^fT9u>J9(x!+b#@U2dUfnke6hS5W1Zo8tEPJX?+Z;~w{ zzMc4YXhJl@#t+j>cqQ5Vo1z{*cC^>wIkjMS$(c0^?6z!R>h}53basNyrVB0liT^eT z%(TCea#}#AEtz}5bso)PDJ{PPOxz9*N9&tfJpV44bXhZf>DI95{MxLkyc!A25;66x zW;f<8xcK^nMAD6wOPyO&w?(GUZ#9d`T(0W1$DU_n(-!4Khp^@M6qcIB6dqUI9#eeY zwToXeW`UFNla3=yeRCN$GR2gX2eku)TTlU5%MFo8Y+(lhrI7 zHBuQ4{rXm~+8yxWed5v%2I+b24D25kH83+gcpxUwz-`o8!}8;fNsuAqdtYXWr>hmu zs$FdU{?tXxVuO6ZoPw6qf+>;{4VaZm%qOHfEE3!6!6LQn$K>=DC&7$@BZeG7-7Yg8 z3hq_#P)$16?J{Sf(4`q}`ci@1O$LVrgQvKuo>OqO@LMcaKhc0q^~?c|WPuc+&WIM} z854z#<}nJj&S^7IGwhC1VB%ezkRmM{cqG#%St!lph?wsQk%T2m4Q6k+p34~QT_o|L z>a3v*6;vxic1WbbskIbo(dRrNpsNXt9K=V(-NkIh95Zi-02z zSr?l%L>_WD-DuP(uRmlhBcsUar18*1i?KyPXCb@&g}EjZ3Rtp*6xk<#Q06-};aGXu zCm!33LqY`;IvPEg*nNK-6e_yFa?18Fj|T%2-wO|cAeM(5em@w6E>!R+)(CSt9bi;r zf7DT|=g1*F=a|ug2h8d!3)zoIs|Nceb_M_GDrUcMlzVNv!&}>@?e$yVoP3j&wK?(& z!#qpPWBd|~Qv&}yU^iXR7})$^xAB7pk+~+$d?n%BGItgTo`2xVf8v9%%aa3wQ;d%p zEeqsPv~cX%xYSnte>`#so&w zCq+AsUhOOj)NT(ywT`#J*i|Q6BbG10U3u-?HqA=`heIAHGBVF-*5ota{`qCe?)uYj z*PTA+z_Rh#5~ust}Ry*Q{- z#->!E^MSU|q=KF5B8^20S2(H&-C>^Ki9duT4%|Xl@m9k@EC#GVG}@?D2S_FlW9k*WCphxvq$^N{DbUFovl! z-hPCaANq z%%3S5aM*@9fr078X17m!(is^TnAgX+vM>lVFsLN(aqd~5A(fEfRea#YTmuI-uZ_D* z@?Dtfd*_ufglKRv2Q28{tbKs>VZJcYu8Q~H%(|(;85gnIN=z#uzt?=gdc|2ix<-kYW5p*KnX^%B77ENl2bwiC7#cWY^hH-o>wi`gVBoo6$;cP+_Pb0# zgV`FT^Zb8|dDI;kgG-ti85oQmeG2c*x_@W)*$ECzPXgjt84~y|Gcufr+{kFipU}u0 z$r^g^z!wG^+e!6H6)IW8F0frX=g7+<;UINmf~XBc0uzfR8*|yNF19Z__i%7Htn`1@ zA-}^wec_8nv-(Rd3BpGtY#o>#yDl=PY3~qpj@%^p#c!KeygyKT zsmE$VqA34&Rs)UeJP8ta#47@v`6`QoZ>vsMkjnq*FzwP=}s z7@T+S%Jg7n_+VmFyxUHzwchLTrkB|abGlRl85p=bWK$y=B9uAay;QWEabU_#Q|8m0 znjTGy6!zG?Qu%*tug4BXAE|BZ++E7tO-jb*b+4AFSumyD*s3tQEo=9js2hwLHyAxK zHpo6WSSO`(YE|Ra;%$b9{xu#s&B-)*yYlMonF2bEmpL?kH2x9Vx6pu<$Ah^(K9eoI zpe?;Y_QpYGo{Hw+OC0AM8-fqnHD#~~G&uCmU|G2^kl|S3ygxHw>4QhDFJ{gQ zRcMgt(lh(Ki=}$!dC3JYEiFCHaK4ziGBbmjVF5#L#_m~CY_~EU&K+FXXu--{uz${? zr4J^x`B^y1PqMzf&~7^Ox+#*ZG6H)t>wm3W$Z$waXt{I*llzY48Vlw~t8@h%U{rKy zag%61+r%VeuvqQDY7Zu(tj9J@8BDSghYgKZxy)d3_h2#1+SD4fS2nxFHKR$2VX0=< zDvgE~4~LfJR&2MFJ8nyJBx^8brLeI7Tf9b2gUM}1i(3LqqK@-C1J(nPt!WKy<}7Rp z^(&a;7CIkaDEoNVKIc1j3>sU%eb#e#VF;^oVE(iA!7gUT3Ts;(`IpKZ?j;Q}zZ3=M zux;QzYT)fUmw}CK$Kl2Wec!ze*f;EI^k`*dXbkUaU|3-k%)v184rjuN11}FUPpL8G z{xy$r0)vFhuFIY?)fF`6IxyeW=5k@s>|N2KCQ#p`MIX4`{{8&n;bJQpl-`>;YW zfXSz-O~Ya3o|J8k9Bd{#G*o`LMy@bZv|uuEIPtH=W*y%HhSY|+&px+W|6s7{u$Wij zz%rrvVrKnro{qLg2FE2=I=+406=J~f_cDjD%E@yR=lHK-2-awQK4l0Yd1&7`Jf60h8HYTW~vFE=1k^jI;YZAe`SqwOUs1?8)W8AXiIH4 z=;zdxF5o1Qqm=n0AX6Yv;4G&At6G!5F`nKfx3S@5R-co>D!Aeb z>w*PrLJdK|m;IMAGbA)b*D{+IG@oC2VA5;O)Ds7+A3JcrSe(4zRAvV=LqtP#Y^eDL zRyWr0l0;VT23^w`4TcArOHw@-Mi?^*1-ZXI+j}FZm*Z-qKX3uj;p3BSj?fJPY&U18JU#26!f~SG= zg>ou`66c;91*VZDnyr2dnz?r{82n&}JJ_r(%GE#Rz)x*ivsC-#(j3tR4WDH?CLTHZ zAZz!eubmBh=gm2CbKzUgcY*%rd*(g(ByT$79Ls^oV2yKDb5Al9gw4xfi)!-P-d!L5 z{ntE(1(zqAMi(2duPnhXOQhuz#=R_-O?Yr17$d2HTh?Jvx7vuBNFfMCUx#y1T?yz$!BTm@fzScS|ZHBJRgsV;>_3KR(*1oL1+8ANUv5J||;K0q3(O<6I zoNw#$IV-46wPWJv{hz!U=Fd5IBzI0~Lc<w+~#sS6kw z4I0>%^ey1lXJue+$_QJtcjftsZ3}a6WY1;$*L~oFQ-fU5-M_rknzB#be#&W?AiFD& zdDGk3yZ7F#=e7!3bJ>_rV?Aqx%5x{Mpm= z!Dg{@4aZsA>}4KX&R{S-wwZepry0z5a>U~6BU;Tk8luj1 za&#~xGP1S3OZ_*OP54TD=QS>^X=$k!GJ49|Vh?0&nGxID!IoOkmT@3$Zo`StfQzX! zF81)X@yO2ais3rg$(C^A;wNJUrxKZj3RTXGjAzOn857!OwJFaln>1R!N8i(z#}1VR>8p5 z(O}UrmoK5&Vgdte$DFkut^7Nf`4bx0JDUH^InX?(?OO-oU`UVs_e$#?x^OJR9Z)9cZxd$z31K%EgezDzSTxM>DHNh*>~`LTd9t zxtwEcv0OJ&pQ&|(9AJ2Ij^Vc8&Y%+wSK5+nw>&)OI{Q=69G0LL>)pCy92os2IFdXV z9VI&I#aR3wu=vfm8zaHun2_4b!7TECsoqhdMO2`<@kFbL!0XU=Ogqo5G^=1XOL+XT z%z-JQ*|MYgt`rBKLIYn$^QV&L%nmkA1qQYNW&?wUu4|m}9<5^jtYIFl+IFm;*EE=I zU|_oO?BY8X2^MCi8w{2Q8W=akaW^b9sd&maqb<1LUjzFK2KI;sJ`aYKylng)%$5Po z^(+O~ESwp5GMblkYlcZMu*_&Mo5667*O*~LoIMKz?}d(_gk}!+w>Ph{vUV_78tm5c zW_^;zZ0f)er*^<#d4pL;!|_(orll>J3QP;u^>*0Xr{%9L$p0~q?I+utOo3*R6R+pq zXcfswZQ>|k=V#Vi!R>UQM3A3Z-$0@@q@<~SMgwzG8vBO0%oPo zXr6qJ^XkG6)_o1Lf;V67ZN4>;jdKOVH{)~jF0krOs|=g)GDxDqDj{LMOzzyi&5SX| zR}x=T@V-wAC<Wqp*t(SC{l0@`Odl9* zB=I*$ebL!W~ci z$gE&(S8ws2{$&9}G1v4q%N-wCJeUtY{3bK0YFhbEZN2p+M{6497tZ+}^N;<)&pB!x z)^_sxhxyvrLSF~ge+pjl%}k=u;BqU6Krt7`!8I$Gjo1HL-p#fCb8Ag{*N1zy=bthh ztrU`XV#uA|u>G?UN6_30$L2_XZCzVey~yK3!?{+`6(vnKSRE4@8{|4-BN)5pw*~M2 zaX`L>QM}nf;`PFW*3kUtJO&JN`i*Z#F zVO+*DODZ5eY87KK&o8e9X$u__92&V~cWrzekWeAuk#WtZsWrn!FlRxEKe9> z|CwIaxUnJW_$1xzZ#uWOWL>Y{l>7Rd?wuV)&o8ab{;n61q#$(q)r z2?sMS7A@t_DUFiQ?`JMllxaJ?I`#<1;O`1{%~*eD*X&+h)r${SwXnHf=WIy-vL%#5ZH3>`hNgo(?zUDItU8V|H{_P3)_W9O zoWe3aEcMcrowxp&#Iw{%O*!Ux&}Bi6RE=4eBjfY5153?5(B#DR z&$397Ej@K+(1G+*J|7OS)C;O4G-h4i^00x)&8y&|iI7A31$OQaZsESdbC(GiNO&w@ zVBqpNFi(clq?3VTrOWb(jxwf`6Fihng%5g$Yd)CI!nZ>5Vz}wsC+hxu8_anPxETyy zI0-Wp2t~+@sHp zMSOD#6xLy`>B8JOnWW*m% z4AsnD5qRpK)-N@2_rRZVOFk65U}~*zm-1vv?UKrBa=kru&kja6_N)y`diyh%OuTBc z?a0H^89e$X>G?d|`5J-v1B={(csgDbdO?e|6eQf~Ni^SnkT!+|NUHgWw3UEjc0 zqrlQ$bl}gdvH*)0A6JT^U zQ4-r6p_L)9M#Rs?+qmZ9fq<7uJwi_wN<6=GWTA(0@1+?Hg(oJ>)^AenxjK7M;2V!= z24Q{unJeeX9d44g+T|)aHT$vXw#%nG{5$jRWqBon~A?b(NI=}d*9*Q}l~2?#V!^-$)U z8RbxWK*`reMwyrE2baa!`Xi0sc$0a#JPugw-8p%|l15(pY&Ypk4Z6WO3U)KTESHhE z(01g(L8ilh4um%-wfjxeX6)-xaWj^he%xfS$i4) zkjcg={6L<;=RnWp8*=O_4Gir{0yT^q7>vapakE=E{7dqlbL{_-)Gn45&3dL(Yk9`0 z#tmEv2N?ISWMH^-(rBrsCIiO-2NouWy&WtJ42%*DOkIcC7z7lU+Ny-u)EBTNHE}Yo zE@);pP;I#1!phHZp+Sn}LBmXsWM(FdAm%DA5ut6Nj9dZE3_E7YY)M)z$t}Tf<<PyMAfh7MEztO5q6oK+WZUMkaAop4kuXkoOM)lrdM zzOCUYrzbN$*v!jxYaZ(aV_qwk1jejSt&0Rqr@U2EFtrG5U~sbT^`bDO|2T`*>Ps;w?W_Hdy#ccj*+w}U7 zr-H#d8XB+iHaPHIdU1*Mw-f`1MgrG1iL)}Zss-aC7#MCHb!K4OWA?^t+Y&AhnT2|@ zBN;+cwT{ej(2|(haNp!{gQ^=t#>v}ktP&3vZT)LFVdhK5d+$z5o-b&toAB^3Z$wZz zUq?X^$Akuzy8;ZqZTgvnGUFL099Jk>@ocJBy&}VVDHcUej`i(^5{yr-9I@t3Y>vFl z&ciC;P-hy+uuaK9ZogNVhV>E!PR-N_bB>fa&fySsIH_}U(gQE^ zp2d#uCO9^K$Pd`(z`$VFFo)I6N<%BIBaPQbgM}l3@xbkctE!U(n-5enh5ysiXQ+{R z5_>+Zex`(lYtKAJUS;c};yFJU>A0PM5vKv|MJ@1}hE?b{2&K4ujX39Z6?S zy*)W|`<(qtHnA|&`W;QTogu<%vEZcUF`WXT1l83utaa++1m-q=pTh8^lOc8Jg+ z%P%~W#S>q;L_ThQ7bF~WtGMmE+biBVOa^y034{xEx7Ks1g`V%c@38TKti{}CQ(HYx z@3H%-+<1_UOQrh8ufStkml_zo8-mJ>+inH(C^*@0C@`ffE3*1?Hn_EWF}*hJm~nEB z9DB=c1$Wb<%L0ou7U?{Ak+AWBPOsCU^9?(WzL47x_%8QF<@vUoZF(hpWEXU^nkF#3 zoAb+KW*yhHd$J{b z_mkGFc+LxVQ3usSfAEvR|g{LLW!?BYF<#~P2;^0NM~ar>bm>vUk=j+Hm3MqHRG*~0o%K%KFH zA%Nk-g!?8n4Y&X4o{%ySWeljFa3ivnpyg?-}f-zQu$Y`b6IQMwrj>p9h=A6HRo;Ok@^FT ztOi#YO#=^{_hCpody~25oR)-tpX3p)Usosp=~G$f6nN&r`8jUPQ{wsBS~WWO19l|- z_f>jd6aO?Pl-I~1^{4EyrSm;Rt~#;IVPcrB!PV+%Po{LQ@C_?p5ufI(tEBj@dP{% zjjeeju#4xw%dc_8u_w8lVuL$eeYYfU%YArwt!%`DNscp;A|AxP&6u_#Rr)Y1Gt(UT z2V0Xk4)vd$IGrit?oHVxdS)r#9yrRLIl!`~QDX-qYsvu$p`ZmS4ymnI!=JdQ`OTi% zdX&+ZA)vlS>c~cA-PRidXB$4+&N?r7q~_~QCe0@iG6A(M{BCRxY(htERZnuwbKA{0 z*)vw@{?z+_UMh6lyyfH|`(v((7?U8UF2BFQ1*a|dyEZC`d7U}DbXs7<1?`D3(=1gY zFY!ABHn2Zv%(Y?W2y{5Yp>Vl$$#KyIH&bWNHvFgXiIHEWK1}J4hmTKUcZKU+%`Y>K z)I>6LG!^ZgvNct7pRK#tzcYpg2ksoaxuCA{uVYdN|u@6^~m_ z%!9_xlui~#2i`er)mHJw3MVa8-73E54CBcIk@L4sUpG}XU#Q>sL8Hu#Ljf$z1!ni$ z)D~ZK4Oz?SYMj$Av#36fsemD$!MUW>>uTZLc{>+fmc0L8;rN^-awWB4%O#F#`5bVW zA^$w}KxE?VNeK>-lVN`aen@9!zm+)`sKNd6EzOi1QS8K771M8B5KXn}5$pn;?F)(dl+$||u{wcwQhkL99hhe0KY*CYX4V>qw>b_h3={Pd z4lry8VJVmw_`=cf;=yTM{cC<5V&8DBY7KAkf?G@)F)RfRNv9b5IzzQg`u-UnimjK^ zX<*zC%C?1n*Iz}0GY(7}rp!6f&Md*u|H*|-fWiBqd$`X5wm&`k0S-%Bx!C?_MQk{< zp(*I{o>hz<4QrM)DawV(Ja}A?b70|5O*K!3D-RAbWrRS(}Z{{$pu`J zD{Rx-^G0GXr`(Lw&pX%xBqjw`^lKU{&tYU{Sm)HC$H7!{@5kTnla;Mo{&_QR%vtf| zjkx1m?~P1nuT9jvqqBFSobQ9iqXD{=Yu9ksE_8po`1&Wd8?(3!6V^ml9O5c?)4Zf< z&7^;=()9_gfk#~Y7p=KB&(C+m^Jg!zUl%wja4;!;@i5_W(yM8b=s2h@(W367#ns`c zz`~?1lPoO|awNce(gR2K8V0reCO*ZOW4HBK&Q*9wlsIzL_^Pw$b5}S@wA3>yro39vIeDT;=K=w*i75?= z%d(4u80LEN?5aIktKyJ#){$|=?SP&zk+bW5YWcC=c=GIr==E)W>R;9+JUMawO^U81A5CIDnw)81=1})3EM%1bB;Ni}S-)l4s|4Scr7G7q=|=Y%2^?Co zso{y4-Z=|zlLAKxofe}4#((waISwfV7-_3GX#8(s)!~=rX^3`na9G!(f93$2O#@@X z0k$CO)hAuO7?uxxU5szKP%SEq?D!{J(GU z|NrI8gGT8Led!&B0m&z&e_RgKFOBtSU^v45>u77x21ltQ2Q9--ymiT{`oQ<^p(B$) zLy6JWh}EtJ1r0%y#rgKCsjPO@oWswsr~aQQW5dce2OUO()cCuX4=s{W?tc~W{cFGm z9>&cd4!CZOt|&EK=_p;3JvFLBLxO8YW2@1UBhlXQlj*r+7i)*$g2*rIjPs8&3K|C3Nca|L*Z=&-@WbRqX7&FYS~1s7o+|HJ z#-#1Q+_{>SU7?|QP16((SA&uRlM81aVQRHyOh{sEU|w=r%Z7oq;MmfY(HZi>D`tuw z=sL=`H9s<UD(%2bh zb-7NlpXbrjIQ4as$pc5ZH|O4$SXO%O3je|#*}~7?%*enIrMcpup~MkQnWxj{nk@{t zJoPDy>tu16MzaT+!c!KcN6hhW?{;0V*j4I};=>b`i)Jr-EXtKuZ@%l_V_Pe>6OP6X zhmB2|jX64k4bIO0RJzcq)5N8Lamsg%c$reh^NgY^?DSmnum7BXSTXsTpy|`nNzz)8 zK0hLDD%W5C)gKwQf!q3&F0))fgR}zkH1B3bUS@+CPHY7SCNUpnzmn?zL^fcB`bn99 z*L9J5aRxlqc z=g#WfgVw62f3NdA{PNtSV1?$VGnv@dFzU@Y+T34_qU`Na)CLUE*i;Rw?2Tvy*IPkZ=_J`-R!|KPjEAMbnX<%IPR8t@$BFF!= z-H)~2JJ#(^w(2{2s`%k*pMw$?zPxh3B>wHbOo~I1^OA!LUD<3(jlaB~TCt`rFR~^< z`2q8OPtl`||L5jL2mIS`<`MHhCZ6UfoBfe1tQ~xWEhap02xb#A(T*@+ZZP9kbem!^ zG0C-CyxuVF%8q{%limB}9os}KC#85!Ru5bz5}6geQdiU@g2CEq^xx`FWa0u-=t0oXJ z^6x@R_xd@mWTiD5r{rpTfmALM!<01qA19 z%~0ZSn6lnVV1?<1S&VGVoNNAZmK87INp^~QHnV%4rE-^skmMAFObN?o zNt?gFI2qJglav{lMGVddonf)kT6xCjbz$Sx3r+qD{<3McGBAiZI51jP%vvGI$HtJr zu!*5#!Re-&n_HCv-DCuS%JS-$L1p5(#AX~LFtOi;B; zU=gPs>mnCU#R(ZH7m^qK2wRXer=xX!#DW*83!~=DP~D(bl5tHbZq9_K>(VxdqSOl=kJ=UbG*3v#7i}<)+}n`(xHm*>*5W3PBhjtAeXLrkUQI6bY`hZY z&vsni@PAg2@|mD%XAVs1ah%M-&m$I~z+@K2%_CuEq59!T_e3*JUPUE6j!AL{bWaKz zpV3&{t}G(U%&sBfnd09lb8=y)%bW!VdosH|HnO|2EMjH%`ccKwzJgs!l|6{5d#Rv< zZkK9%zz3uNFAKWf!#bh)_XA9MFJKfcDFy`Ronu74q+C=mH# zrpkg1E2eu%6}A-iOtWA*7gcaz+k&{Nj6?f0iY7drAz$#Lae8J#d-S3tx5_jzcdd>2 zvm&x8mkGK5k$o}4Q${mxL8QjPy@FmEAGc5QI=6svqL+r`j~QNFk}qZkX3RV><5BB>z8C!GE*sORjT#HLhNz+%s}Ud+LPS+iPzMNsbu&&nf?UzQd2C^#&Pw*7HXPu0oE zd~QMA`GzKef(y)*oGs$^5{CsAM7CspTf}L<;jz%NOdjO$2={7l7x~7qdcg}`GnR6J~jpno&D%5B4C{*Zj9OGF0&qZZn zvqDRfWX}o4I}C2k6GhBF|l=B>V8r+s) zz+}W8#A$a*Kj$o$szY{QkFtVd@0kTh?r#cZk(zT*V)KiG5(O3eWPF+=k7Y!u76^2v zKlsf4viUCWg@T@l2M_9bL=uk~9b!9^{6&GiGvZi;v%BENutl7n529U99WZIyA|hxp zL+wLB0kgY~vWR6ti-TSycjg%;j)1L??$7(klYF9h?$oVsQa`61sr>n1gGA;^<-846 zT{g~~f9D)C68hLIqoUXsx99b{1qnU!22Ns4wHYpPS~fT5y_IybaJnp1|B)s0gc5u9 zB(}_d{RRR%-(JeAQ1;NsV(82?NahHV;LuMp?24GMD09k+gR`14eH%--cVw)Q4q`pT zqok7S&8=S?8|Nl;!F@ z@sigWL8lXrn>n%qTKXKf;qiz~tlF(~xi<^5dzsXf3ylI@0;w__jRk!( zqy^uHsVh~Kh?sXgHn}i?S*FLbdkV*fiCq_1WW)|~R;zZ@?C05_A+eJ4%~ORc<$8}6 z8JC^WRulBzNd1#^JoU(|{L<@2&ZP&Rbt!BT>ys!DReoe4=On={09uCofur%wyPPE} z4)XtyIs3(MF^@R|lgNwcq|o)Vt|~uy<75~9uxo+{*Hnd8r6PgHoe|j=j&e8^$xnRU zC@@_xyHwco`~_x3XBQz$hUo^+Yf_l`Tk3@#J(l|(mY(|T+JT)cjxTjSS?y0c;w1KD zTmQ_(*P~yn?K&$c$tt$lwZ)Qq$+?nA`nArUEuJy6h2m15xG}5=ibos-+mmAUi+wpJEiCCW)8>YnSrt5E`f(? zm|WcI-C3%hIb2ISa8ReJ=igzqFAvyG$9ZhlbqjjwRjs)B#6hEaxm&F#u0L;hy5Wsl zQd)O!=;b%lPV9Yb`#$r^RKLv+DjXMVc+|uo^`P}$34hA;7t@nnxHNJ$#BmEf+@ECi z=#Y){+jC|Ulm0BYtML8zeckFF#S^m>d|y<%N;o#VOi-%7d1#*cA{E9~nInc`84mO2 z^}RbUHD{qv+Jc{sjT_Eny?$`|jM#k*B}Eohn=VPG8Q&b1JU9|@#7XG+99F(r8}=)| zo69kU!&UX&m-F#qM|Ni@w5oJ8usB54DlS~WA~o%ntqkA6x$ki=c(s%jfqWGoilw@{h?M6yw+ zj{T9@+kO_MGv^$3AMsakTUhmljr|eV2bBV*>K7BwbvBkQ`10gbV$%Um8AVRLfRZm9 zSFExtI~K6_yyTE^4D4Ch!=))GcT{4QL;SphoJ|T>xs(<)FkCs~&^E9BA*a#=g`R^v zEeB>)^()9cWT|iX;Kaz;@ZgHt@sqO{E{Pr5-IK|2?7{j43h%$2Vry04*uo!OXTWs& zz($D+oQ((eEK?Mj@*;78f>9MCr^!pDlz`s{3^?wzNKR3>u!NC|gI`I2ku@@tPu)pu zm+No7w1h_izkhjfELkl+DS>b1!g@|I#k~TF9Cti8tX2!&`NzT0@_YY;R(-K*;O5q8Ml3IpzW#Q$j!b>WvCGuWKb}ba2Q&@kw z&QMA1#45EFPu0|=)gMV#9hA8on6&NUsuwOxcWiw6&Lw~&N%GXjnSBezD;UK*KPm`* zvg%vNv&*+uq*1_{{l&i~$tp&nf`yw0vlr1+Y+Ztu6Jv{ZtNr*+0%jwL-ym!i> zMXHgTROdgg?fIzZ*Dm&Iqo2tM)j}in(jxWx%1!FEpVS+TG+K)^IyY(j>;0rL@sri8 zg%NDYnv;d*)+lEDIV3*gljhn>n;I0EH4;>vqD57vyuXnMng*4VHZt?46iokphjjD2If9v zrG`XiyLu631BLWuj(lnj&KHe6KDyX`Ez+Om$ZNL1@TmfWhN`WGgR-6r)2_|JW(O`U zdnh8aC1V+*gaw1iyke#$Li`pF)+;eFb3CxrG*Qx1(Pnw%azKSl6q!?0}RiKq-H%d^9}aU-Kx;= zPf;{snN>)!Evqx%h9-q)!A2Yj3>6|uQjdI_N;N{LqC zkGZPwPh@e*2M5IlMt(gP$BzfJKQS=;6XGwK#$3~?u&yOekxAWcX_!0%L&UUXS%-w@ zpY7z zNz@HH7^%(VwZu5AUf99a_NW${0>g%N`C5fU5iK1SK64O431SN`w9TZzJN$JvJ^A`+Oj?GMYp`jcJ zd^HP2-hH)YRbt{%U>0)VjWJCWPSBmTP|=J*DovSDXhBAJqp{*4<~zj-^NbmHOcIw_ zpsg~s*z#G1wL|Iigv{mjjQlJOZucC-T^2H)Nl`32GgJZvjguB7mU&!Q;zrHj-H7s(74MGXc<4>ewn18S$j6pVtaQ%TOwPG;6F3(q~r5@u0|4Yyzj5m7%>8pE5w#&(EzPFZMsgjV%Y z@t8`5V`0|fO15GR68zVF4w*TLHyCL#l>DAnb<#|cd79rX1ty~e=6hy*EQdta1gFa~ z=p3$)I`(6_c#^ipHbspGRo5lzHGCDBEfQ>IIZ93YBsuL4M zE92nmugKt_;9cj`%3m`5VHuOip)g4aC5Nwzj1RerG-wy^G~&ME#F)V3Bc@cpXom7q zMJBZdKR-tIR3`py=AzdaT>d#87P*vQ8kWfW?MH?34h61T727Q}gBLOzDTtnk44TR) zQRB#`;lOwAQ~S-Uv%0_9XZ-N(Y*mnIa^e=@;ZTwgI>2b<$i&mYrxeAYq%fCJh4EWy z8@~kOy)UhntYyxYA?%AXJ%2ekny;=`uA16Bo$1cZP`h7d&byKs6gKE9l`j3Pb^ zB!S_EL;cMJ27w0_jf%Wat}s8jVyx!i_tbWeyI{Ly zy$Tasg6<^+#)^YXdR9_u2Nqg0PjO8BHzissm1Ds=aV9;V2%Fgp7u>AQS!=e4(ZSR} zNy2EUb&!w+2iUmOU}+~M)4{s3c`qX=J$lud&cOVYyL@JRL~CZE*# z(hdwf4Gan)1*!)Qs2?a`Phx(sm`TM!%IW}Pg`?@s+3U~$UYq&ZfqMa?m}q7EE`P^z zJ*lKB_G=7650Z5sP1?U`lWLOsF_~1M1cs!|l0FMXp2VDMf5iK!=G^u>kEggWiY#DS zA*t%4SZ^f$U}Y_{z5O4PQbzl);`}~}=iWQ4Oih6&v*d~zkCTn{`?8cqIf6*K!=Y-aOb z!%zo5Q%jKqy&&im35V);EcLBs&I@KTYp|@oR-eP2lp`%Y@b6D|I| zQOOI1Urc9KN?>-{#@AJ)$RWvC;>h$bNK)MGogH40k6idr{5BOLdCKTV@BY$iCX|e09(x*?C>}1`3`gU^1&FdcPSk7uMGUfYo zATyl7FKS8jESGw&E&KA1xE=cYbp0hEorSyt%6ulpydM^b{M%9~Wp^M%_(8COMAFSE zHAXe$=m-tdMrVN&JA0e4Oj;|9)jht~;8~oo-^y=yYpKV+E5&hFQTZ zeKrOo2JZ;2gDfqVuP}Hts4E)qvlyxU;h4nRU@kvEsJaa zO<`tmnAK9Ol&rBc!C_U)Y9Wb;VD%d&HuVg4H8G|RjW=h>FtKb{pmw%>i_n@!3)i}x zYx}ol^28(thXm)@=0Xe_0yZHkv-_7aF%;Omof6Ge{3&3E#MWmrJhSV~q8%74Z+v`` zJ`F%W)ppK;lh+xz?N_y7C*cxj}>0Y|5^0R{}Lrc*aLq%c?ruzN^Y zTsY}of578FgC6Hb#{(<}6gWWlYi5XgEK_-KK$dgqA_m6XDJG5y@=FCH8NWV!=)ksI zQJ}G!Y1_gE1}-57$6AG{L3jGIB3OCYnKdLFSe*Do+q>kKPI7RUFJ*FKuwzqjEc0Dz zbby8Fqq|!0!GsIZGZpT#UiZJ`BXB?bWY5D1v&!z(cc#y);#=yimG*Oz*KCEKO72p* zCEo@0SL!fd`lq$JXJwGqT}ESfsT>{ADJH9zBu!nsI@e1~F84uWfbq(Ridhwotjb!_ z#R^fv1{F&V9$aWY^Aa0-)&!|(^Ofu@drdAeD0|5ib}V`vxMbzV<@5GgtU9gLBs5iJ znb0c6*k!9{B-MM(-uK~x z802cPoR}EE`pPWSJ^onx@kpk?=jV*R{rk^SGC%Y;=;SQqj^{XRli44& zJFz)**2K04CAwib1`O=W3-??WX^6ZW!P=K0#2dV0d9?gR1;Om}LrQi6KzwZUE_T!vYLa<;MRocEe{eIGC#EH>0IIAHfV?z zGdS>4h{=7n>JvVe2?rv=9x+&2aPjkZwk^IiVS4CK z5II(mBb8SD$iE@6k;OzIMS20J566L1jU9^^`8*ofjSMDoGb&6s7e2srE1Z$t!Ka={ zEQ3VmPCNX(if3I}vuxfhMaF+z4IgygeLTw7-O+A&rBT#0lkLH~ z0u!4#PExg6ou5zb++MVaiNC_3&%}>$>W0omzCJP>+99lJ{1L?qSaer7E>-F^yUW&e zHHS@3WX85;uaZR~YnK@+Us%L3Vg2Nl9Sm&sN>LXlbd@YI@Hxe1rqG_BW#pogyV5(J z>++0KCCg0KuJq0Cx;*Dq$#R>wEB))aLj25>E37250#0sGT=b~KS=v@BAc9NCCS}3O z-np_T=TRKknNI^`(Ts0;G788iss;hOlCG4no^49+?m(*OK*A1`>f&xrz5*3 zb#e9-)GMSd$*KzrY}`9-!q?k`tXw%;$sKhrDSiZXHn>yF?G1uuxTTEzMv8IWa%gxe!JYkeEynQ6OS#gkqM8TvY(s_P3w|o zNZ7LClJ=I0u8(JX7GE+^QLFcPo$FD0R%40txr^$>OCx)WD@-^uG6MDnPnBZ3&{kU+ z{7;c<21AUGqF{^10w&Id2cklZZZn<_)yVZYz#i4Une)aqHI^Ay99mdoybY2iMGgwA zoE3YgF=jfG;wM)Y6Ria$Pk*XPOx0(KP+PNa?Pf`)N@u2~g*_KM4lfRWqUTX>w4s65 zb*I{F-<<7*(-qSGE#cEujEJ_fn{v)&f#oY+E`u8iH;mTq+*QO7@PT8pti{UyTGhs^ zNR^Nev(8+MO1smuZ?Wx5?Pt@XWIPT`^m@d`p5w6eaznCIQ}_f9&KK{P72j=Xc=$~q z@IkF4%Z`Y3bG~O@=$XU0vY9zdk&AhUW4#m)gL64&!$zxw6ca`RL5~L=cb3a{oD2DC zvA!xe5q6g^?o49TlM!s`mSfwbkuYtjHIu~O> zjeTNGxFC;A14I3`Qq_%&G805*CVJ2RWXQaM;bHxgytiAq@+L^yx0DsIM_WFrb=zoT zYS_qp(Y)zk#bpP^neEa4>`g=}6a=?@%Qk^|yf z&3sWzP(zSqlBLu^A&v=*ImN;`VX<=$#=JWmaM^&dayr-k=kd7*+KdmgG>YnG8>XlWGZn^uVH9MW*mCxRbc~pe`~?C2K*PL={Y;Ozb0$cAba&l+jB8Is4fBD5 zqOFXX0b2V%x*WJr&%h$Uc;*V*1GT=;lMGD@(=*h1{Z!d^8nRzjFFlZulcT`S5m_dA zfNkM3C6Vp?WZx|n+-Am5KV^mBG$ZyR0Y=UX zvR;!Iiw)QlrrUEDOpqy&HDgk?vfw>z5c~As;@psw+_@2coR=nFR_IdwC@A)j&5)Bp z;EIgUfv}9m(z{QUr7FB8t1}2LXmALex|dPyK!mWfhN$pz$K%tjmwO2AWS*>*$jI=) zdDnrdSGP{%y^zTf*(4IsQ181~DCAg)pH{LjQ#-pKghsb83aWAn)mV1F?$_yqb+-+pRQs4itI5l06zY$InabybwD> zg6r9heaB`nXnxQAEne)SC35xwcd3DR?@z%AiLPrLYMf@RKK)9J`GWDzTNwv`=sa3H zJ4KR#=d-lj$7Y@eE3t#i*Q}C{yc)dy;RFXktD_w2OfPmxX_c#VSjUG-urV;0WpXhY z)Z0tCDeX=WPI;yf6(zFc=&XB!jIURko#gV}zl~wy)+IqZ82A&?Z)N_oEuP@Dv@;IYIDLs>;JRB6*Bv|{6#9kj1#9$KM>EcY+$v7` zFG_n21LyobwT@+@_r43uHeFJ=_r$9sON%*y(Ji`u#bHqf)6Hy_OJ<**ptPY#_NIHO zm_TSK$EN7nqJGN-Vx)yK#YB#u4A*tkUoOD#<(7)cMKR6;+(ylDsczlwiGrHZ+s<(r zDKaxKG8nl;xp-)bZWdju)yNRjY|W#Paq-z|X>G>aPc|lS@0_?=ZfOF;fpFmzZXW)E zjY|?IFI5n(&&l4L+U;4%!f@?nXcV_l(S>vl>8!a^H?+1&dEOK;P%6z0T&uZAOY&c} zYh0G-J*}Plx%b2wD*n-GQjy?kwHC`?uyxr5mCi}4xxVh?JlM>T&~9bu&;Dde!>TPt zySJzZDFih#GB(s-PT*o&F#D{*))|ilyDS)XcJDgKz5ipiNd1I~47YFcWIqs`A#Iea z)H8SXT$6T(p*HQKnMTlwTPeOdoPfTwv6hy7pD@My)CP zc%QGn6u`)EK|x(){-@pQ=amfde=XQ+E_dlr&EHQ4)N*XEZ)BL;Ah7xZBhv)$Ct^A} z2Ym_y91VZ(zvQjdBqXd_|Eeg@&?%cCujH`)(T%Gvv@m>%XcE+Ex&M0hiWT0gt6~)< z3+-gC*=1e#Z{L!sZa?-J#i;EI=-0`SKV86OxW?|SyP60?X2k}ty5?hkfri!66EeyS z7yV>RHgaeEWOzih>CS8cMjegY65YH8jK!y;_baw8WzE}gscUAq@EPuT3+o?kzrey^ z8{KH6*eyB1EB?;GiO*JR9Tei7z$nJ7e1F#QpNu?$3dbuhak2(1J}5pbv^DTdyYUW* z(*?8G+%p*X4#=unFdAsE^Efc@9$=d_)ydU`F`L2Z^Y+l@hw1aCa=q9Zp1)<5zwQ!%&I(UAy5chI}3$n|2 zo_;EHR$RC2k-mgL?0%^&_X_2Y|L(I|sJU;!AydV5vlh9?{*C6{ut@brdfn1pFO?Xt z|EXVHtK47wpvT3KeM?Px!NOgfMP@<*OI)uo*0LFO=P=3%C>?Y-E>OEzp@DJ6rWvf? zvhy8;=N2&5rftwxQ4%`PVr6SknZi)CLVdYHN6ii3=+at)!`!i^`WZQZQQ%kdpJJ$95KD% z@{x^g<1X$EjGR*$HK2TJl_4t=$!n&iVaJuZ$}<^^>p@=+cF7a2XoK- zh`r+#h@I*zna*VDCy}VfQ6gYP%jVgz)k3Bq&Rn9I9{J zD#dtPLD7*V?pZt|&#wB3jP=GZnV+U)eG!~?A=4>RSb1g8rSG>FbSb*jdWjsIaQ+C_ z{=X|Eq&w6eu8G=WCQ-oihi$Qzy5W~1+gwMN`-#dn9*o^m!kf6)a4fjGBAGpLQ_akG zZyZ>k1AJ| zQ?+2=k%pQUgGJmp?GL4TJ+{3PG&^{VXI1)8x>xl1NUZ&Nj&a7uUS0o~%}4+_z3 z^=0{oPPIN&2uupO7n`w6VQ%OBgup_dLodyRpNTUr)0*PEqFjOHfz;Z1i;vaPV*mVq z##Boj(N^S{D4Z(JAR_R&ot0tFDz)-}S<(jVtAFgfEx{nMK-%}U>god7YU?c4Mg|Fo zzY-3N`MmpE6n}5tztv#TQP$hjwDW#H(Pn(oBVT{x%A8!+4VMLk&6t&2A6pqUGJLAb zE0f+YHRbD_^Q)FDoNX+;_YJ=QgNDiMunh_ZO>Clmlhtw`I(Kj?+L@R-FdDQ9Gi)&2 z(Z#?R%vP&t5O69%lZnydN0$J@d1o623!f#Cm!J90u`GS}HC z3ZvK<{$;xObr`RWJiU$U`IEU(H$EgDDdJF>(0t=#@`;J6{>x%+rn4~Qiu_}}Fs+Y) z?R1$}^#q6O=Xe=?m};#zKZxGTb(>+vhMfw}uQoBR*m&pm_WHzlE{hkNe&7C4_~hhN zeRnHn2ewu@*)>(X2bldcg@i<|zI5Cg*gK0mD`$;>KLeYD_`kpV3iRBceSB)~B3bdT z_Rr6+@7<+}8;^W`C6%u{Z&qZ2^_5$nHK+Cm?euLrC$@@%@vB+4L&KdXlRWwOuH0y` z7f^TBJS^aC^3g@4dUaMk13Pz6vi5#4h6KKOi!|Sw%ncH5HDxd`SRu*Ez@WX0Q6Of$ zs?hS8xebg=3LQ8`gheg7!crYB(Wj@NuZ^ml+CBVfyXYGQC94jvS)=$s*l*(tN zwbZ$fjjbS=&(AXVqQ1?O7bSdWE=iR7&uO^WvE58?N0wqg+ltFhjBj@5F0^D)cyQT8 zkaZdJ%&jUeB9S0Ulq;Gj?!@wZm(2%iu>$IzxHk-<#vo#OAJj$_zrKmwx zbXKaNalOkYwR5Mm%e*bc6c}!ozpmf<{oXPgrwP1=cs4a0m=#v}nAeo8PPvisK!S5` z>(vh78DEnVGbm@7O#q|B;m6tHVuqL{zXk14=mX8XTYqRVeCm|dB*YV|g&BYb7d z^^+P(9y2&FT`ZZz*2G+36YMx=$;B*%jxAljhdF0#708{nXy32AJ)f^tZ#t;4!s9?6 zhXg}L$FZ`6>GR92^cmw)nHMnaTz>J?R^^xTG@fq%eyyhXob~gQ%B(-m?or^HSAAmo zBaulBujd+Vn6oTYgyTSL*NdEBx9I%CJx4-sJ=p49f4*6~?#DS>K8EsNTr*-9hNwvV zJK_WmkY14~+{2QMSr zg9RdCPdJL2-zXk(X!>&1g_o-$()U9`14DuXZ>Gm#rppIbJ1=qJU0%S<$m6hk=R^$) zri0F!HyjukcGNGdRaQyl6r8HP%V&vXmIMO>(}hC}DG#c-7?1JfUg}}+V`;r}s;AmP zf`L&Yf!Bm{{!^ci4H=f144EEtIp_Xx(Rju#Q9Qw!Q9P)N&qaYr;()WTps{9Pt6|Tl z`$+VV?on4FGB`lP4@&pe%yW<2+& zPlj9YtjkN%OxITW=A_jJ&)#>?`CZV;zaPv>zbJP1ss@CJeCG|EGWF};mUF^b5UAKLyIj4!j;oY{>G8fIQ%;g|W)AXTxo zi#NhhLi)rE$7c?WK{*V|Sv8Ncd^q5A=wXUz_KAkWd6zgBwQS{m#n>htHj(Stt>qh} zCp1^xn!r|B*wCmp(^)F&P-w94VUesEQ}unaLmZxU@y@VXSt*pz$jkDQapy`8?|Sh^ z-7FWpxA1LnU{;#Yz#5=#9VK##AtIEE)k9$gS3!WZUX=~EO9S(z70xVT3Jk0nfo*xW z{=G2qGGtifn<6Tx;J~7`p9d3mRB9R45&o zbbu+Rhp{Pyl{s!&c=VkK4V(!IjG_)F*xs$y(KS1^Yu%>;mWtxUoQ;VE5B@3}Xap?j zd~}3~Ux3%EFNQ(a_!Q%(ROJk(CU&0Ru1riFmrT~(>DlkYpuDm9rOC4m>AO3Uj@B7^ zNY%47Of@+(O)abLq!s5O1@;GyQb}St%Z_Q89QfEG`cK!xSpQlHtm4iUA zh=cL6j)s3MbKbt0TRW?>X=;#b(erNC?Qc(VCpJ&XXW|ivSfJq~tmS*psd3Q*vuOE? zKB12$b+PaiN|j4E#LEa>S#+ay#TCyJ@nQ`V_dlthb-t`6g2|!zU^~n0=*t&e_iR>W z=aW=mF6?mDx+b)dF~ET@S3zdUWEtiB)aUnEXEL+T3Y@rkU6QD%#`ooGPh4ukgy*^B^y`%eT`N0X!GWQG`IH%Y;E1S-C+%@-h^A^UJIT@#0BYQ#)6&_%; z$a=A>+^pBM;0Q1CfoA=GVToMzQYy^lU4qwL1|Aa*;p)v4!%97A849Ax> zva@P1Fn$PjV6I_rV(a<0iKAj(<%y-cd%YHzaa;0V7B5&ZvARBLDO=`yr$q;g5;_(! z)aV{%mA~}8sbT@6sSCr?FFwcGS4cAc_$wl(VqnDg%RQF|cGfFdJQO%++=|->3SbaoK#vrh=W5J8Wh#h<&}WGsm-m zN1Nk$00UbD1DisFANQ(yNhPh9jr#JQ%|90Iv76km#;M^;w)7t^12Ja~k8b90;WcRq z6C_tC7AQ^eQ!r!wAlN_C_PX)f5QBfL!9PS8_b4%WnD`qr*m&r_)a(oCFo~FHbLl64 zf-mGCBF20Wv)vA>rZcqhGc@euXbYa% zeDy&ClZJTEV_PPZj*JK+w_>9g)z%9>bj+Q|#`RBQyYBCOO&1*4BU^J8?=_jj@xIw^ z&tiT~6^4I{k9-YezA4SXnP9anOIZ4|0oMbDI73!;hC>r?xXmzV;7nlVV{mK=IJ&Uj zY4?)ZjNh5uF1{8pPnfn}fq_p!qSIsM-Pvq)H;s2*aDRD-fjv=x^T00FiiXP!ZNIc7 zI5QZuPjLpnSZmhd#1paD++zW2(S!#945kt$shc}*cs5)*#c<1zwJPSQ@?i#^f~h9P zoUtbucqdHMWjZv+z?3I}nM;A8<@G*>8w_R_>KjU1jxPJ@#XrHiQOAlY;-m=&Pen2V zTaoy=6Smboi*7_U^cd^S4rt?aXxJaLnQexs&X$Ei3Ra&j)~6HhSY?^^9RnPG}Z4`+dy?qO!Gf^9t26P?bSR?lMIW3qs8g@>hp z)3Syw--%{1FQ3^XQo1B9g83r%Ud|nXM-Q$zexR8pVef{Y$5Id)2i_1z*$^k)5NF#E7vB)q*buke5ck>;kKPc^xglO_L%jEf_?!*#y&K~9 zHpKsLNC0nWploQ6ZfLM=XozoUXl!U$ZfJOIXhd&l4`vpIW*&vh>3gr83TS4^;4#Z^&8hi& z?WDt=xSodB4B^F3XPX@0ShVO^ac=mD8O=;5EX(I!Kjfjw!w_6`_WI%r+MGwiYyV!K z$Iv#Bso9n_qWLJNr0nHp$JmG^KNOf&G;jwrH>E~&>2hSQVE8eyp<&PEuD3VZI|BQ@ zMog5AoTM8$**0>DZ{*b2$Z5He(_MQS7?7^H)~^>40bO#ftgNh~qhoArY;A4r;^N}t z;}a4R5*;0#l9H00om~RH!1|mF(|JX<^Gci-RCz9H@?X>uzN9O5$w2(FiOdxX`K#8- zSFKgAIqO_^H@NO$bi>>9rk~}_Alr3THET>NHrUlK*DP2hn|UkD@ph!^omj8CNq+ZI zgYJoEhTqSLdXN|UpdkKXN%G^GoJZvukLwF22dojTcXIvj=K0^-_rG7@|De$SQ8E9+ zBLBxF{!dQ*pPlHq55|K*kc^9%oPa%tY?+qu;XbWQc1=t=vNrXR|hbE0xt zeZ&8jmX@BLp2?FZ&z?Pd$&w{&)~wmGWy_vDd!F|-KA+g~VoLjqX`L@;_P&}o>Gi^C zZV- zI=rW;<$rhY|Mt%Rv*-SwGVOo=g#Ysw{9nA}|LQgWm#_H0dF%h(d;V|V@qhh>|F@SN zxxexB$M{{I&~RNQCt?V*lVtrspbmj$W=BO4;oG_TqUtpCZd63 zjdK_;*A&y!+t%LR?k*^66vELxRg;HLL_%P}`umK*(+=fEbU4JbHn9sIxn$n`==cO> zZ#B+S4h)QS#@Xj$TGKQFba^Gey|yq~!BlHqp28ZXvN~XL^67cClR}%$?x;7F&)^l- zeKfU$FQZJMvMXL&Zmq-*E}`6}BU=`G&-dF{@NOS7mqvj>YuD6EhHL-D)Xg%w(sY(v zN&1oXzQr#XPB?anJIvel_xBIpti=1%9h%s}M4CE+%w?OR7+P0+VaVfkIM&5fC(Cf# zjsKe|t4Bu=T&E6=3644Uvy%7xgs*0bIRwP@D-TdSq@ zdX3rC7t^!2HZr9%u|^&Y?~!S3Itgz0xkX1evS>88uGz9|^*XOuw->tgP6FRr9g=E|JO!2b6dGI|`Gp(~Fs#aJ z%l25%#&Nr;sBFqnrWDg7r$o67KCE+J`D^KO*N`8--UGRP+O!#=v!lm)oWQrFDM2bWn$D1IH6ek`|K&j_3HH>4n(c-QPgy7vuW7gTCHrP zD5fsM>)Puhq7Rns5aavr7Z{da=w#$fY+cB5U{h0xJ_GZK`+Jua ztYMq;*2clfL&IoWz47ri%QILMLl-l6OmH@6u&?~pRiPI)LFDJtY?g;p=JI{on5LLw z%lzY%qD%qoNC z=(nIF{A7}$?hlP8T*p71e#bY(_VB}8hTfh>jf+AArrRD@FugKKlxOnXeF?tJt$PGz zmzN(2@>6xLS5%bZ{c6|P@+e}V^}@7gtrIS9S({q7%j4`HCx$1I$9gy3h-Y{cvT$Z= zK?BDErWUCL4JM!bdiELdLWwWx4Nc$mFuuB+#K&LM+Q8eu81f=YNL;)-eP?$SYxb2e zrUC|O(`5=DvzIy;Nj5m%Dw>h|@6eS-4RJ1y*h>n3=R6f%;dcDz%ufqkJeTuI8u_uS z6{Yviirf3k>161qps9Q}m+slebliv6rBS=PwNT{2TIWB73=Z4Tt{D|K$Xx8SKOofMbe`kFEVBhVYgR-t_?aC0Ea@`CMfSv&f0hD* zRp+^y3MDxfem9wY&@H^SQ_Jai)s(JEA(8crtWmGkjGJ37P3FI# zmnk93xB9%U{pj3NaU}eZy%>Xy)>m$M_D}VzrmLxRuHM9IGXFe$S4(t@XL@bZ65?6RG$DA?uP}`@ zFIF*%6)-UW@Ma8eIQQ`0NqrAR2S)x2P8tfomp5Pevd+$G`SD#|49^lc3)^-tV%Rc) zm9eHsq26y-&bO9KkLHN2`WHhy6q&+~ceQNd`l2+`@saxh+s3O&9zhub?`KO~cxPx> z+`Rt2!tRLjpe+iWzP#r?g?XNRa^>LOziZp7ldipHS+I*~X7apyp^6e*#pdjSADfM5 zOD|n52~6MI)Oqt$ zuDQ?iIV{%?*DIcv5a&vKb}Z?%quq%qVMpa}?F#CiA$&ryM|;y90kf`9=8r|O+LzR4 zZ7*V)nGrFy{g5Shi(x%W#jO~@OX|!I&TbTVX;`tk%W31X>-wA>x1Z^hX|Y>>?LAY( zFmauR{fmQ~SD6Y6Qn)W&)jfKiq40OUEvHfr%ZId`f@?N!DHeKo_QwSVjsx+_^iSIa z{4MU`ap71|HEXHkJN-LMKlSEuYlX~vr@1WSl-?}H6|eT~sJwlPcVTMQpZe)94PS9x zmNIpTyF1+_oA0cPP}vsFNeTURX5Nx=_vLxlrH1C3)}6ZaINo6G$HNZK8|(h9S@lmq zdIRs-UHaW~x1CD7bdzz*WUhz__iomlo!LA?*rxT$YX^rZtuwxfEzx*?b(i7~QI{>V z6kf$u9M65W-FC7_Z>VtgqZ^!DKAa4f>)Z7*gxEzVI*Bn{R`{Ot*(CWz!mim0FPD@! zD(o&uOHV6wNH^bTyf|F_UXg;j`U6L`s@D-EqFwXfU5O3%tC;HYgCSBP&`HYLFraqr z;Y>ZNtcb5(`%ip!jsClZiEF{e=VlKWP2Tb4nD~YsmgM^IQpVxt$6G7^WJYayspq{{ zM!0^z@Yl7ME?QOIHPZh4ss&%rGp=8p8Pg&V%UXTmvwLrfUBq{- zxyl0S?X^r7L;b@A4uu(2IQz<5r16y3Wve&nh7|v}CLhtj(V7s#rdnrqLQvMNkyA0r z%EG^EbFq#@QZ1wA{>3?dYPIG@6>Oz7e-GM(1w=kQB6s_U@65&=wu$AIuIe|$82W^` zz02JcS{V)*);qtQEa`L9F8Z5o(lN_FpWLm?GyVoz@=mY0GriJ7Lw{OQ*wgQke-fK! zx%qB5+PbYcB{(BRV5#vxq2lJQ457d8L^tk%P0L z^!HTBPghbmxY-^KF1vHQG;oUQi)XDfKU&MOdET2YdGj&DlP&d4tKEuOG+b6K>SAV$ z+`QQY&pMmTPtwn02gIvqFYLG0D3u{ls-(4&)A}(rjc`HN;#uKsU)YW zsCaMthnC;~P1cQa2cGxpc?!-F``78uT05gePTC^yH;4Kb(enQ)J;IZfT4x9dFKu&r zX)ClOO;XHW!%RRnypwT?6)05=UO!beSG`60xPJYfW#PQyop;!C zB6qewJ>p#_oS1YpJ}@+H?xaQzbAdzCYJAul^k+`z7cA${Y+72;8saYCUz{JPq2Y0e zYiUq?fklqk)#(+_ZI^t>T(v1hMx)}?VI9@Wh2NJo=tmfZxy#jFn(FkW>yJ{Z?#%+m z1KPsNriniD6rNmswlty6vW30Au;_qD@Q))?&U{i0Ii@pZNz%My`eu(Bt0L!cUQ9H) z*;W@=c2}jFrO?&&SpW3Ez*l8cCqHds71TKS&r_hdC6aTa{MF_18Z16vrbOjEPWWir zZNA8P>7_~0>{7O7T@0CRPT^DgC0l}p4W4|7bH8E3Sll>EF|5E-m#r`*&n#tjy_kar zOZ){vuEUcJ*n}2v3u=^Q&Jo+yR^u|^S903{;=Ndx~0?0WxC!*9`d3ZPbwB>cnMs-TyU*D&_vsVWmzJh07Ba*!)l7e-U*68)-^5`5Xl`4u z0lQPZ?}7s9KMz;6Hb`vp>tRe2BiDjU-XEOJ=VnMw5HZ&H9y+tjk&A&Vt*GVkq*)T7 z=5aw)^=*z>!rYs``ST}BFeR*fQ|NiQR5C0fY}TiB^@%3BA2&v`IXE(%?tdX>!fC)- zW61Eqqvpm&vGOMjrL0NISFw7QxXnA^SN%(Mtz)pyBd1jz90ElV+(-V&L?%e^FtqzU zbDfx^Ch}w5mJExi%c~jMIOeJ*&R)z=axv0y603cX!_1axYbLOUJYsMyS$i~7?OTSW zc@b-y1M7-HhWeNzW+{wZ9bZ(JHnP5HWC(SrGdE)0ASko4P*g}-{n{ztrCjE14Xm43 zB-SQ|h8S%Bn8XlxDed8B)k#GbhT5((7H-`r5HS5BL+AqEc_C7pyJTYnwUVv-ze=jF zZg!bIO{(taV4-yghXz>78~ci z?!-rj&;#bVyBTIo^4T895WGN(|HIZ2mGA|La?=+|GC8m=SimZw!Vr+r@VAil$iF1k zB&)3f*$XQkP2md;W__@S+i|nN5pkvi3{xlD?fmGgp2QKtWKh`@Dspg3{X)MPX&m)m zRD%ylH!hL9wJf9JlpIgJfLhD1fO%W?^Bi~FQOFSXVN2>N=?540#~Vq#*j;>vNuqj^ z@$^CkR)ziT+?uh>j{Fy-_AZuWQ?R-qVf4w#Q>|2a#>InPjFC(ZViQUg*eAHJTBMm- zvWEMEGSdPES2ix52dYd5vHQvOzoneshksI;eCwuyQ6aye$b|@Zbpd z1P0Cx4F7l|ES7yf!r8#^z~s1aqHW+C-GvIf*&7)67O=V$afBRT;CpcN*F}b-M|Dq5 zW98ex(A8bqwPq4eIqMNqvG4;YmNVBM4R279yUkE(ZPzKXYeVC_!eEZf#6o6MGKL`q$(}K13=;!bK8c-_F*UXDSKW9?6*`0ImVk+M3n*DZaUZl{R_ciB#)C7Dv?YH#N-rvqM z>wn5zVCpqetCpO2Cyb>qCB^Cj&)o~1i}uJ(bvehrEBVa@vD%B51i8Yu=wGd@jBLB8 zAbaVX;@ppgMKi@U?yCN~q_y|bCc{AE$y0S-mVY~T$t3o2!NC@`aF2;4a*HxA+x@-l zG10|xQuFB*Qyprrc<72uU0(k2hj{r?wRy9y1leA#H+blDU)Vq5=9!SaS7U62HiyO6 zgsR5cUQ6*6ZoDMsMUOwY^?qE2y=U)ml|!LB#c%yVvE4rOz}? ztFyh)@>f7hZF%e58(p%dFHSD&{(Ga-cg6IWixXmRPFt(|&iYJrBkO~`GgNlHtpA(%<#Uq$HG$WL z_nyW+*nH?{(?q3Hj~G6P`vHm@y1JmF2VU_q*B7`F)e^-^0y|7&rp@ zSOZwY9x1;smO66L_laTrab8>2hFf{gaghO!BNa|^9o)jQ;ex`w$6ZYi*f@>uhloWa z`FOTEB;9^=!s8fg!b8;(j$+38r*d(A!3Hrq-ad}VlRx5mJoJKbdp1Ku_>+TM3iRFy zEOcNny0=8?u|B)Ndc|jRBITZ^C_S3d(b>93gx7)LiJ;#<&QHl+{~oPtdB&qC9>n*Q zN$+0KycbD_j^0Z@!8d_{d4W`S7y}Q(OXJB;3^qUEEPR$JcdudHiv@bpO8+9$dFqdf zh92j+!0^EF8B@Bmi!4O8Sk8m^XYJZSeeRFG>{4Fi|MYso?mu7=}Nl!Y#zeSF34U5Fspk-LJ= z@`SGVynA!+-MfG9KFGcQWcU8dKf&HJ3@%4G>XQ|?CL6F#d?3&@fo++Cz`6-+g%7y0 zKd`M+5V`z|;Zodtf%}3y0$C3pvI+^XXA3YUJ`m7kV9a(9m^^_|H-Jl?;U5#Xz2N!< z>?I1UWfM60K615O_{1*wxg|hgW&(R{Lka%^aen!acKL#mK}LxRj9mikA`{s71lbG} zI9UR@>ZLz0trK8UEchh!k<+Dt#a)2KCg3v{Blolh7OM%&bqNA9A23@gupW@*o@u~t zGlALtK^%*~YkT|eVuHr5)7V4>IJ*KE<>k588E~#k;OY_J46)~$sKD8B|BH+O^Tr8G znhsxuK5{V?a@jYqa8Km4pTJUHz?|$au%Up(=>c<4y@J5{1{TKvb{hxw+*z+n?*B3= zezQ@4Ga-O$DFfSN1%Vz0ro;(M(i0es3qF}0V3gUw*yZqnO`e-`zTkQTmTBt+*8f|; zx!!@(V!~&ZgY0$=9Ighxm?m;ApTK3e;8*U6U+e7u@otp2-Tz(Efw}tut7yZQjS8Gy zA6P{N*cBVOmMbq{w|Dr<=T?rxa(z?yX~$4to=^DfR3;*V$%|r!q3H%Lxft$a_dsJw`F7*iqwj__SYFeilBN z>gHuWOYY6%!$CSLh5WzHkP>cWU|n-1?%15j&uQo8+SdQ8|0Z)vfSGwg-YM4=hxFq1 z#(sUV!sW(?gW=9KHx4E*cb{N2Q()evuB{GYE(?0)-RFUCoes{D40!S7PQ+r1BR_6d zJzl7F)b`WGhqKKTy+o#ev+U^d6a3~>@g(uQWPX5NM2Mkkl>$-Hqe zoE9F}$SM}nBJf5*HE(a#DbC$!U#sJQgn$ zSYCNWHa7F>-DqHzHrbTqaoWJ^O}oOHUrQExmA!D>6A>Vp)GmAPcKyGHtJ>le51os6 zG2yeVT$@LinS!d83j>o+vQeO`cXan=H5|fC;cGYb+)(I#+U`){M z>b9B`aWaXKX#vYw0j3oSTk08^?ip>1&fm{!9@DZ+f`Kt_rt4Z27mQJ6}X){%QT=b1uA4iArYnlz7;% zYsbBMk0WjRe0CmFOmY?|@&pP*Jr?xbcVp2L(;x~J#K2V7B!qQcDJux!!0B6!y}^a z$dp5&4-{H?{Z^QW>Awn3Y!f0OHKGBEU4=uuyR0 z1_c)8j=58(Fct}EHp}vF;?&?VYBOGws59>ZOV9)-(I$<0M+K>WOkFH84;Vv(Q;epb z)Ynyb5LMtQuBs@(?YiLs^YtDEb^8Uvk5UgfY6URH1w7^wS#Ur!*C56#M$)on$pjJM zgO44*?BEJFNo?^skZvHIw4O=lfc0sX42Q$6tjd1R9VHtUXxKG0S-2<(&OY;iJ!0kl zBS)F$Y*^iJIZ08m-t`Cr%csj6+6rlc;kPy@zH3=7Ea2q4bLs{`{aQ`yGAV9rdQNPoh0zl36*}$@jlBpWxKnW!NC~;Xq^;gLw+Kt41LFLa`G6f;lb`8ylGZT;39*;D>=}<< z2CfeUI?HN26v}U&4zy-z_7v(gF-sAeGs#0!A~5Z_0+XP?zoI!$ZPKl--#k}-ta#qn zJ?VDeBR$)8Fl}`^$Pv84vOa#|k@qeKIqEI)kBIare3)gv=$YI6F2U(;#cn)rxjd9v zE|`8TUXkwI$|!Mwi-Xab?Z~u7!lAcrX<(LIu)yt7L8GaL5_6bshbYenpTO|h>rPzCaz3EI=(@#`Y1*4E?WhfnK{7uw z6gukIRpj3yk3no31NF9$~p+z{#spS$O}S%1+H3t}Ao3 z9t(Rq2CF-LY}=!#F>%KNmn|PuTE5rJWL=f1l%T*>?|GnM`@{-InT!vO0(WL-D*SNZ zy7ItSuf}mhHV0$F*=@ry?5IzI1|3H<5)AgVG2DIL#l$*YT`0|MBa>hf--^eJ zLm2tiDDY@^)W2~{7HBhE@$UhX-)|?jFotH{1r2PH1+$ba7@AFQC@{zTI3=Yulkre( z;=LY*X5K4v%lURB@WyClwFDl>Z<*q>BQb(mVos~zJUcnHH5Nw{1vXv{P-yz38Mxt~ zU{Ob%(J6ta^R=~|0_{Hfv#9H?5K(Ti67-7t$}J*ro8^E&XFczkR@P@W98wP$%(6L6 zKP=l-zGvm;;ulL!w3Q$mAKPKR?s1M7+P%{!P_7dUp_kYcn@3iu%9FFe_GrVa~( zqwAq2rULGaMSb(7w$;0L*y-(P(Es?)Hn^bq$igLN8mxQ)jHVvUrX7u(7Tc#^*t>LR zgBe3JZ^Qw%Elc!V7!5=YbN(<5-{CN`kX3vIgT#YFeF@!6FE$FWbh2V>9;O^5ymd9esat_@Corw@6&SZ(%WCGUpaMP7~HUv`;rs1`*v{%149S!_5_H|E?V!6TPDAFm<*-(73$!!nQX^vJciv~HDBTNUFPFt|N zF=F87c0aXAhsV$*?x#!30lk2FO;;7i7R?pMBmT`;!(!m7D$^jhrNh-jJR-+oW4D5S zC+lkMRoNjpw+^_jA==S zvqD3?4Tp=t2}PlmPXieIY&hOjHMFms!&G>rR_REfO^5fAHL;l-Je)4=JB~NkFPL3# zbx4KNowZ_Z$eh)$oENp!C}iC_74)Hr^M{cB4~B3Dxvn|fk~bRm7PM;Y?$8lvm?h9@ zd}e{b1O~npQ>G=haR0EHzL1f(gL(O(!$B){PcLqrUcGnPZjQ6X9IOHiGkKIQPS|t) zgPZf6S#LIR@I*GW>^#!s+~IA*z+|vw$(8z(VmV%29bPJ&$NzOWaD<4Q*cG(ntg_UC zBD<^A>z-`hRm` z5$@5zSP;0M2l9eXM? z8CGr7)V8=>pE!$2dxxg;gALl*^S>U}+x_!OLrSY~&6TAk2hW={X#P0q#M{c|&|qOI zIm5>E0tc&(0>c**p=}S0q*WSb9hqZj+47g8Rp>KEK!Ov$@{w?r4{Uj+$u6bj!D44WVZv4y;p3zTT=T;^o4?65#0U!t!^C4&#kE4Qra* z*9J2l(5~ieUil8f8{?J$ft9Ie?Pk^I++;UxV4M(kI)$}ss;*8&gOcVHri3t_m!3Tht(IT6h|G!V z5}0&t4o9tNgW*n>KNqgI$_6+t4R_(WaCyr#kB<`rLZ(GD@SR)Iq3OY}j)T=jBjC$5kZY!gZDc zYTzmxq^|Jt7@^AGT}yR-4`r+H!sJ(udWq9JQj?x=&oJ zuRnFX&B3L;_7;PNW5(Wp_d6Lbv|R`a-*Wq9t_|aY@D$4_|3kwQUd~qMn|z_>fuUI^ zw^-=yv$34}n0UjYmc4!O_e$JxmkV=SlDi!qE{&1!nlrs{A(ji5@^d=^{rwG}@z%Yq4{MV`T5g=Ix*yRH zCVSN}@Q%8>t4Qrx7o)b+Nf(+VzX-A}J$X~sBe*Q&!P>_Lf(&d2Ru^oMW>*}t$GvmCUmgqN3;a~ zXv(hP3^!;t(qMM@px~gvY|_x|CC#}esX@kMW`F|U`@>B-1}#n}nob-!FKE}1`PET7 z;mDf3NA`ZTGrzn~Wl#O%?hC<;>(YJqWI3Fhs;-&xFUL+vR_ze;0fEHWB%K*K=D~Nx zdeQ^$o_xDBt&}av%B&?$GrH@9znYvHlS7ssUqZu{Q^9T`E+q`7(%#l<-Pv1t)5*0% zKVi;M#_jzTEYcdr;X77zMKE)CFz!9qv5~XceMLj(E3VLvCUpTuwFC9eMioq|35$C( zT8sqrdpKCNPh7mmE2(J1qFd0w640P|qDiOY=8=1ERNn=7+)N5ldCt;&tD8gkYRfgN zb>dyN(yMSkO?-+-YEN?n=O_u8x0OH?noQ%xExKu;c*? z_oi9zn=P6J1y=XGSfz8l@0!%WbpZ(%(}b>H~7x6-%8qnWFNCB0b5FZ$x`j|+kXX1f>6^jXx% z9nkD^Q(>7=Yu;&-;1eRQD;!uKE-+(wy>zFntA*6h=;lBVory16%ClG;6IM4Xw65=B z4ZXp_ucXaUJx8a!H7A_ay?|x%s}{G8Cc%1%mg%#;W%aWL3ADIJZ@;XtV1)e!}m;7^}M)*MBim{ zi75-i1L`+0Jq=6Ud+-uR&_(4|CD#`WdK`_s4%_}Dvb?+^B)LLF+F~2Wi%G9{aI-cs z>ON%Xjbaga(eN>^!+?WvW%w^WgHk>Xg?BNGKNYLOE0_~mIyD-aGz1t06&mfen$-+6 z9Riv%?K!lbYw5Um_ysf>b0~^eEf8o|X;(M$NZzhpD(-UUi>QvHVedh)d*K?Kt-d-M z|4m-5J6bXIT-wL8E&(fo+t;3nV{JX@5azp`v-)GM)RUJU{vRU_2rx!`*nY|XW>>US z&&R78ntDV;V&XloMl;&vtXNjjRJIy=>8 zn;BLXP3V~v%FfvPLdEEmP`mQ^4u!7;mpgI4r&t zblq=nV^WA%?b^_AWaEZ<4vqs49OK!ty}A7yTp63#7Sq;Xi&32*hyXDi-3g4j>3R?Dan>AZmfj? z8Hx4Ejtg7-H@X~b@%fi=#3b0)Tvze3N7|P!0qV*VK28w!vr$Ru^`0hh!m-!jVuwe# zfI+L6Vb)I7>9OyQbBQun9AnT3Q<#vdvnJ$XECaKTVM0pV&Qb?4HN`~^`HTVqM?Dr; zI5b2zFLe{r;AeOh#+1>O!ogHu-@D`}BgYFjA#Glbh7-==G7M5mk2^z-G6t_{JzAY> z#h~uluF^1jNrb|KTaFLc3EUhzRwU2U zWO(g3;nPdityiO@#l%>6Cd`cJ3b}C1adHZSn@)7WfrpOqDGDdM#qFMSacSAqiyUTO zwx_y@TPf7yq@#}A2@f{29Y$RLxD|X(sEYW#V41A7@dby9ubHigtMEa&Bf*m$7>z#m zZ8VU4!r?oKDM@F+nq3U5uCLl-bUIOXQLAF+#w0_HR*|MmPkr%8MVW0W3t4Mh#3mg* z7vH$ZRm^a8>PN>lAO6H{FrJ>a@e2RdHTA4p;x-m_TnaTmYjS>#gaO031lhH&H*2MW zwq1`8ezo~hz;+w+yMHz|buhEC{GGb}!7(MhozXcBc{;B?aSQe+9ktG9SJ>6G-XkHU z;D@xhO~fg7(K!r$*l^p-cGqO2mZ=I?gC z-e>*3e((I!4u-8i?QA|Cb?=VYe!tB+PbYKBkAD}q6kkj^#;Uk?^&zg$bp-_-KPOpK z?&mYx?~%MCFIJv^!5uYPl^8~Oj9sV^;9T2Jz6?h!o;totHYT+K!DxN!lh`+>H|tihHczO6nHWtns*-%>iX`(trL)O z=+Hg!?nN^ag}o&g{Fl1ep|0U5(3deody53?Khs0%u3d-Jqy$+7170fhX)sD&njzYM z_M8f*N~h?jO?LG>pEmZ_{aGBwbimO;XwrnX8w(;N4l;`W{r8qxtEW{dU_&EsfdY@p zZzgsPN#^zg3~c-x9l2zL*!WT=O;Stua!|c5p-IR^fl1Zipy0+AEJjlem{c_wz2?=xqr*km!TvFj=yr}Y~R3O|X zNw7t@QzNcoU*H^lv85I=j>>|Zo*su{mnK|yP<<#MRiGfW&cId0L1FKP8|mS3fv%GS zeoY8pb3}CAgd5)0iox|Wt&WI#&dgL#30h*Dvq)H_nnN?JX;>Q`);X}sSTug!vxt>7B(Z;2{qD5?KbW~# z1sE7JlUtcTow|OuXxrv_f7f{O6tX@O2olQt;Uw|sfUW&1B>|Q<{u&z=u&!;|wr$&9 z-Mr$}x9@)1wte4U-GXNAI}e4n?>J_wS2TI`ou@|IcPzAUxe)VeLQv1uiggS0oK{tf zRT{0`dGD`Y#bN7dIx-6wa($gS@+6w-O(P0;)jOP(oIZH`-H^n^YQT_rboKqepRVuz z=k3#=_}~jGr^+H;p@<1A%9q+KJQ`wtpKM}S(a`bk+xA0Z`wH^-Ew8q>Br^4MII~_! zaD1+rBq-{zp>A0M!>yzpNA>CqLrpDK*3~))_55H^PTt6&S8|EF-I!HE?qZw75ryL$ z>n#>?Cp>87T${M>uTz2MAqHltA7>ZFPiRrf5NH;bZJF9X!G-hZ;|AsciDPMY#p-29aGF$-h{PHDo;alA3upXbXv+V5nAK*eF%eDavT{H7_!;L(69& zSK;m0XpsY%(>5M5%xNnt7GFJm(-bA4t^jA&EX{SgGDk#Y7BF^cDKNWoOmRGtcDT{| zB4g3g2Q2;d6)q}=7VPneX}GrTL(}AB6>a7k={xgWk7P2LN|jyHz0J>fnK{BoH{V)j zPiuq&quhqK?LCSt@&=VGS(;qW6qhjXcjHhq7GUyz6~Wxu;m8^$(8;^!pyqy!?v1(`$E_idz>qOTffV&{_^OgqfgAL7pWqDUHaIHBYZqcG~#6fA! zQC-%s2#W(r!| zLrfZRiV_a_91e^caXL#9=kYW=m2HY~h++7^sbS(UkHg_u>>TlZiiNFAOgUZ2JA>Cs zILOXAl55c*)+3|(El`frKk`Ci?E5+X0>WZGzK-s8VL#IC|s3El8x** zR`MY66Jwja6E}00OZ1uJjv?)uN{1N!geGJ|Eq(lXW&MW>jeU zSTA|sy@*?bhavFW$qNC=E@G))R8?b+rRKS|GYQCvTKr>(d-Sxr$34!_`XcDzqnm!@S_SDlN-{^#yPBIx& zlvJ)U?`%?%@$;P0l=ZP)vGQkYaAOEJEes(OzCl zrsb7?7HwkjVDh~hD#)B5|bW1 zaemMm{;vLV(9M$!A`Ek6oUEO=V<(6`%Y0J$DeU3GuFhOX&5Q#b|9U9FBy ziTE8Hgz%s$wl@!}?H0K(lR1 zdtk%0S-dTd90d(rDuGf97%nt2>~;*|jS=B}AXOLQ#Q%a(@P>xxoI~||Hx7EtxooQ^ zsK@G^cxUoTp%v?wWyNMKWtieyYLKeK^5m!?!v+_&scBpu$DGO@Xnje1vF_0|p{=43 zEeF{u8kH&zvQFsMC}{Y8#EEx}w~mGo&yj;tA})VZ8Q2#bkjinqGnHGwGK%fXO6djS z>^+TAD-O2axyicXfYgl!){YzZ>(@4lM>t&EdVr*<_40z%==jj@zOzSqK#R?92JC>eWmy_GrH1)>fTeS>(N;`gEWaxPzeXIV` z>4O3O0=7-h3Oe>3lva*8uy56AWrq_Uwnug@VsM-A{FPkGjBN=zTO8PIJaj5LoH@=t z+`!OT<|+Hu!~P2H zoeo+~1$;ki9eEDCxc_hN4QHK0@AdN81H`#xq&`eKqmgo;Q|So%jF-+T?{^2R_q)>2 zBI3u!68Jime|kz2{|85%8*7*LxyZdaATMxg)tpcxsU~I*IVPXR`g6P*0SDU{mx(So zrD)(##8TfYcH|MG#evkwgQ70Iq8bf_HsLFmF8(F+A%A0&*puEl7mvFnKIKq{+i5IH#%ZRU_X8N3|L!wUqZq?+RKU-{PbF%zF9}rYQ&IWlSc zu|wQnigZH0v@AKu5_3Q$*I_|xYcSi=h&@h1G6x;^{5vG@-~itj2L2BY0u7%W4}9@? zzg4PPGjfWPbPJ=zn#QbuXQdc)oHPzeG#r$O=+_Kr@w_vWv%f`SO{3t)ZtX3M>)u{) zoO4^MW}B43B_)gZ6OS@(UnZ`saY(#ApyAis2dgK!sy;AP{lb`g{ae44^zlzy^QtqM zH12=c!Ngk;aQe>8k6oGB=Bi>M2bk7;Dr>!yXTN=V+(8Bvhl$sEH7*?Byi;^~2h-fWeH_iUn>UK@Xq2~TQs2>}Z_#YNquKt4b>IwbXN%VG9lNho^lmiarM!SRS-5-_hkRAUU0d|KInn<2!nSPrvVNi9h(G=lPDl*Y3UbU8(OX z8jZ_0b6QTn;-e@~8MIB&GvcH$^G=`LTukTAiZIkiyi?ge&*bMisU}7q#wD0Vm$@70w zYl?!yPdPo^de;)26_F2rXmhtMir`#TR~DajV^GOkwa-k6 z!B@d_U4)8N{mErZPnA4#)L@_4$}0VRXSVxJD`xh~3vT@~c{sbks_p9al~Y_bSSX4NoPnw5`?Ic=j?-0prO!v%ichOf($MQ#*3F{f5S)M_HMFiFqLCk>EV8r z*-bRX);jRt-s}WN=9oSITb&d|8XUTg6e~8Ybk>V8{e8q_yk7O*p(SXk>3!>^T5ZE-Ad%gN#;mDTkMe;iG^ zkIb}Ey0CtR&pZph`1l1C>-MGUJem0U<-&P;+N-*GLzc0<`yU$jML5}R>9uAC)hBvab3Xy5m}TU(ek6qvp%J1K5Ber*k}QbUtno2$kO_lNaW zmoKzF^|P!!v6CU9@j;vWPW_30(v;Oc)gQ~w)~gP%J$qWrVMAA_>Vf76_KiFh4IF|~ z8Q7gFr2?Z0bHZkx?SaED{NYY?tmJrxbayZDy zS|54HD|Gj?-01E3506c?o}L%GYXg_4m-fW~#egzKb}^e71&N2-1=Yi3u3r#wUZ~KX zWI9t+<8<%V1FT;stvoVeX0oDGf`ZQKE&N`X4Q+}{>>GoGlAbkv_P`EB}K8&9Pj^P-iMdZZ#1 zIT~!P#jU)@FD2ygAb-tl#w__5TL;H~e~z-5o z+ZgipoL~?Ludgu_yHYpVLsi?O$**x+gr@?-g`|y-mI#GT;hOS!(wa+aCoGzkaq4}9 z)rtuWAEGauF}~;%eAe`4&Sc+!RS^!{rxIrBOmUK!amaqVk&42$hyp7P5#F28e2e$) zaG7Y_$-x!8W~xco#s*1djZX^Fx0Ox=`RE?nq~;QL$ZwC+)Xn_$Rw}of^iSzC>IUn6 zo@ISPMRt2l(4xrfT`OD{Gkv&xHolQJ>_%dzZrR3wb^j6`2w3Z`-q2-x_m+=$XrT6k zo3p}<9W-@zg!W&XCbrka^y-OIxecDRtG2kwWhX72pef<8pn+jU!j!vy$x~0P?z%Pm zI#=G#tFMl}$w_@}r%^5>)LqZOHsjIx3vSuD>Wp#)=UXZGISL=?DWz*MSE+-4qIKFdyy}8IL$n1(#B_age&7G z&vym&g*;0c8JRAGEowb^#_Dzc>dOXZO+W6gh;cms*7t5ne#%qERooT{_o|N8?+vt@ z!2i<1?CzFpR%hNE+b!XxDZ8PQYZd1VrM23;6IOLGRxLebJ6kB%|A^kd+r|nELgC&F zCl*@%f8WK#vB89gPo%TC*@UmiwT;h$BT;B;#sdYxoiP(rp3aKtRBQ>{^P)lU5T9d1 z1FJ)gs&ELG^->|!TMr@hL25JZt@a-c%ij#1#V0zb-Ys+!plb zvgbRGLz7?qIcCMsoy+)b=O-=8+7QOxlG|6kz4so`Z&Gm3U%hEwc$G?n{8bm#Yuvny zEFbiL#j1MNMte`@+NPx#`Gm2DTc*cm>m0s$E!AtgP8DAZp3F11BmDR4d)%Uv71&LjD>o=GFWunCT4z3kO=Lj>d*we? z)s6+tHUe(^_Aeay+a_=x{J_W&&*CJX#niQvjU+32bk6^Xw?aL zr@OwBm(6^cFzY|nV%3s!-a6Cvi%oNPd*e4cSV!?z5s+_qEGYc5=!#Kdu+PLyX> zRLIl~TP2v9P6(c5y6WV`_~D|(MNWT)2P>pSds96Nx2Pua7&bVxB{KDUxUgPRm}-#n zKrlVq1i|ncm5S-E&%|I#2P{ ztJ@O(??y(X44dH>1(Q`NI(myNYcIZDSi`Bvd@fD6ccH(_{G9Lwd`uSG7O;hG&{Fi? z{rFUKgGfVbKtcpprvKb)O9hx8B+CRCbb2gEC^MB*GvXJjXOlRfz;<h*b<rRJ`}q!ut8cG{*{tp3?^1kx$dErSOVI9F#t>>x}k)c0q25c@Eoq*bk;8v6oG7 z;{VjZr7)+`p!5c#)Y2waCW!+#S~VOPBeZiKPE*Nd%Q(ZZgPChWnlEGhp}1=-2CYJA zXBakaY+_(o!OFB^mLvNKQ_pX{^BWax%>C-Q8W^M=ypxV}ymVT#!Ohc>fw8CNi3?k+ z=ca88|L-he(4MEsxT~eLVR8yri1K7cjp_ebk6oQ68hoSjYJ}#*86sVxd>bkmgdXJ2 zI1#S|8}|UvA~c$nCTG zvFIz~>O1b--%J(%i16i4zWhFRNBEDAG1IiCuBx{cTUsCB!lSm~aC5}WpLr|K%w5{l z!F1)bLiW{dArTinSMFiraI|p!UjCrnKXJcWCBybbk7@<}u^80+J+l4(-;eYETRu0M zkRMqjlD&v`4_~=Tl8{jYn@W?Q)&uSrP7fs-{;qn=z_9xF4KH1p28J)^bl)VfAJLe5 z=VcXF0%MW4);&G``nZQIoBP*aIkf)KdM+;a{|N?csReAEOPBx3*L6{3i(_C>Nnnjx zz?*bXH0J?pfCE#&0@fwx*}@vwG8kCR4$O>6WYs&snsk6|%1Yg^=GF&F)^;blULrd=VSPANvJ_2>kh^ z-OIs{!u3&NqM_u}Ld%T95i#`#1)Kz!p5}{PY*#QcFyK4L(2-+M^is<5*o_E9#Yg#) zCpXHRz4&j|5{9&-h=hkP#T@=zODd3iz_#>|fWQHU9q0Att-H^`EVAx_-2Wx-#UA`% zab@Isz{v1XMzly#QmBn@AtRr|#fH?HB^y;&B>WRH5~(_7@N1FM?WP-I4gEZd^^779 zqy$etl`>KdEmG}vHTt6MWO3X??}TdPCbis8YK7oSsa210U< zGu;w}R2a<@gO%JG1s4S=xiktYCGJsc6f{#{Q&Y6eUw*S*%#l$x*g)=pgm@p2D9V_X1fOFzRUks+?vchVX}F0I`fmu zq7n;jl^-x!EGS*%A+#q!#OopVo=ti(4pys;9Ysqtwl*lpe`XF?z&o$sRB;eZC2Z(z`W>$h=T)b5~EQ#gIV|jy+U@@Fon_p1s8rL z&($km-P)w))5x5o;2@yL{j0#^;uhU&$E2Sxa$ITX+kX1TBTv1QdIpv$nrv1FM0hUf zCog2PNHA|U@U}Fx5jSL2OAt&t$hIO=*Pz(vfATQ{Cy$3Aj$56MJV`on@82PT4F{Cf zMI+v&Fb3%8MKyTwE3w%f5KReI%2>e6a8;DWR7@q2*(pIV{Qz5BJDb^qv@455%nk&u z_%Ve(H--ckNIE zgR8oH3uCyQm)dP}=PS}A_)iV92YPrIVjy?c>V8= zFx!rEwwYzZylN^vXLb2Z6oaoBIGY)`ZF30tmbuY~;YFdY+C$!J3r>193Vt(+YUN<5 zo0f2}jQ5d4&g}KB@?lyoihLKo)w?~_+w|lSqs_If&Zl2nL`3A;^KJXv-YEUCd$0TD z+SfMzKT-N(*S_kqd@nRQZWnhx^MBa`KE?ul9#Q@CMIXQE#}^pJFq++dz?4(w;Bb&@ z%SI*3zK>?*z5)vw6*3sa6f&Z=b5-#%8+I|SQ4rBHFitq*!ot9KL!Ddfft2hL<9aSd zMwfF8YZkO8h zOSybn{@Fjez~z#{(6HTUOERO(0=sv93~UOFo61TbFKQNO@MTvPa!OzgYuLpw)nN?- zU@1p9AXte;2AMPpW}hH#tfC%)G5zY8DqZ3nQ1eMEns-mny9h- zs2SI*IZK{4JbonRz{sL-!K~A#Yog|oC+oR%PAXUwY-ac&qP%8?0WaSShlEXfUe^=% z&G2=qPn^$k)bop9xQfAdxkn5<%NN}_W4Gr~bB&IfMTCNbmOWo$V?1kr!jX+X7G-_8 zZnvfB-x&iX2S>)Te>Z~OJ6kL$oOKbiX$uxU02&K7;rTeF>O?E@w($P ziMN4af-?7k?Y)^llO0nMf4G{QP|~&WRf$sWbv@h^Sieg1m1^xHCKnA&yAwyMY~DUh za^XI{Xxoh>ACJRvEh(l;B;C9`m7FRI6H^#e-fh2@q`vFIWuXPrE=o4po((LCyvWz+ z^UT!ckY&9?*QPnke0?MBwgeo0m24HI9C`DQVnCqXs+r+ij;Orr?(Cg;G{vj$_|A(@ zoZT;1E_%7uNWiiF*}0#ybu+Z8j@BJIE)ciK?wHHsKU$L=PBE&87x5>mOPssRb?exn znN#mSZePl@L?pM>;JKnhO1#bDgnu@^i_*0=u{|xi=H&H5HS*%rMX!}aJRBEE1m$r$ z=l$Jg((P8^axQki<(#QMmwr8b%dIcb=griakCbFur^qRl|7_vnW2mn_xnybmc2l-g zhF8uDmL8gY)ydXqLc$`Y(TpPlbHo7*=KDaxaBjKON_f@!<_ z?t16rNj96=7L+WHS(xta$fo6x`&x-t;enQFf^%{rPeg+G!3V59is^e5Sbhn!)_1)W z^kZOgc)*gu5E%TNWsxSE2E$68#DY(SI^{|)_gOAhRNGO%%T&y3dW6rq^=V!K&HZ;& zRfHTCNFD84E4?Cqv0VW3hDBkz*W6o0W`>9SIV98CY22Q#t1R*(Oo8uqU0D*-?{h^4 z+xM|5C!1-A$tf~#DQ4agx;#da^^FNzQGKYvth2mw3-$S(PB~eZxg~a(C2(I+;N7uc zmW?pm0fn+3p-LLpM6(o_S^l)S8*dZaIZdH$^?k_|OI32O{j)L?Z4PlPI_=yPo2oi{cN#;HREox;<&KA!$>q&6>)g0%o7};l9$WV;Jhw$nrIGp2 z0a2&=1L2k;JbMy&7F~5#UF2$6$m{h`a32HDoK+&%97NO@dG;yXXibV-D`55PPoo^b;^~4M>pHm zPPC3ac68b0Osg*Qjs=BWYqFWb|4EsooO~)1rMqg6u290_Y*~XCrF$`oLjUA!gq&tS zcq`0mp`aJ*$hu~0h`qwjU43kJ2M#+vNRvxs&QM@csbOBE!E3?5x^FUD*fEQE1}9?$ zmXc5o;|0tOa`mNqLX`F?Fk8e3t>R2#KP;Mc`Lw)^*bauM(69Hj8#4CSGTn1lbGifdw`UNeztw z8@Y}di7+r~H%ABwxlCDbpq{~nEm@RH!J$F1xlJHOljBvxu`V`omK8xCx)>R`dE~ry zY)H^xW_FOw5okE*6u`y7vcc(+f;KDT3LTRWhX%3cC?)}i0u3>3c1Dp9AAy9-gKey4 z$2LteUbe6&LM-iI(1%Bivp23&_^`_L0ArKm>sx!f&DY=CTl4$ZUv7&H3HAFItWa?{ zV77j>sJs_z=)yyx2PNcHj?WZWmatMhJIQuc!r}$1B@&VvPi|NdveH93<4977V(}VJ z$$dwPL?5-J{F@Z7rPH$m3!q)uRK58QsdWyJ@@-X|`iw^M`W1o=sFE7|HA+>fna zSF^z>VBL}nPg7()p0TkOvb5eUP`M~@kX>OtRJ zqKsWJjwU4sVjP!knaK2yb*83MV=1enR&<<==mv+Rro2-xmqjWF+!tAB^TEMqfktKg zRBj)~ON!hA1(cpTfRF(HuAE%eDM(Xg}@hF+tz&_Ipg0*>6RqM;in#Y9R>aoxZcP}1tbBvIhH zYVNz!`TPGpTY8ki_tDc+oSIjb9^%>^nC7KZIHNO-ZK_m?Gh4QXkh@Hm$ER6GS$&(* zb(WSe)HlcK76@>16n$E%pAeT~(CIkkZQ2D5g%@lurP&${56-L#y%-vx``^3dqRPgm zj`a;2nY`M{0$HzI?2rk{j$Np7_uuskYh;Q%e4OQLI}}63w_Lc^{=;j^4h6|eTVoe) znEUkVgVsY^FS*_CEx*@vHf2qm;R3M`Zbgr89PIKYe+ufA99@GNXNfKij1AauwQ_mx z#yMvS19DRwoY^M5D$Tvpv{rEE3B?@+(XKll%Dh}6?Xqn;GY3oSiB<8hd#m3yZfp{5 z*p=Tkb=Q7=|C*2fpU#Ra%M?5~Dq(hola1A^LC}e9s^y*HBf{BjO!KnWFuI+YEUx0k z79%pH<7<46WApiq^)rN+SQJh6h)-heIXnHVOv^+!Zpk^4?GiPLJP8SokCPU1aPCOp z*1f>MA$L%m{YJZrxMb%?y^e$5c@ml=ON6uq1pYNhloqt8yixcxiM?5%hJkgGR%?+H zL!03V2cs?zM&%}@PSKimN|P2ia##s4iMc3=S$>JsjGDmKeB>Z&y_Qd-5*sVy>9?sK zEC=M{d$)&|;}cEJl-8 z6(3dneu#maRfCcF=3>p2BK2KP35uFZHcR6KCbmXzJu-F68r3OM0SvkkAA1)?xbSFA zII?#`5*NEg!}~7v)n6wZ;o>kjuses-_mPMb10#pS{Y9D6|7nI4Gh`iJX1+gjx^v9S zGSxMWUuBkyhlL#E+I=NjL!@D4RO~{o<1EW<-!^fun<#KUIg%zO^?~8x-QorH50>0k zOnB(!si72j(S$|mm*<5JFVH2`D_r%vF7{-VES7n@!rh+h66lU<72TDd{#}=*+?pgD zS@A4aPVt1t3PFQ)6-Sg)x;#CPlq^$rIU>rk>e2$P(iLjDE{q%(7+RRpnWF_*PuiWF z?%L46EZM;r^7~R7Z%d=;I?nUjS`+I#yK1KLPpx2$_q)jMHK$2s`2rXDL#L)B{GGU> zWbNu$!&ME;3QS^Nu`aCJ0=Rg$Bp8^69${zmo@3#mz%yxuLwIL0yUf2o45F+jS%j)S zG|Q?auC2Uzn7=`wMgGG@8tBa_i}YWfn`6)F!lj%2l+Pa^Ou0cTlHt2$N{dg+|#=P93sO7)4i1aN<8S zt5fbwj;dNr^Ba$r?R}H`p4C6XSYk_}$)-qW?zWD7Vs{FJ3@sQr0zR-FmspaZ zyC70JLE(Yx4u#^S9}aQ)2{8XTw~V#RfR*Q!O1(q~Pa|LX2gX$HMIjM9jU1H=4;Lp- z?3DeZC|3D^F~JD=q_f2R#vvDDlf637a2L;;9SAJa8u<|g!Un0Bw5+#lG3`{~f(bJU~4zAhgaFqX@ z0Jrs*hRyXG6_`5HeHbo2tvFxvuDCK{A}iAZSN(XV#uNuJseAX-STzD-3$%-7d2Tys z&i6asQ9^N}dgvnd#k`-}wVgO**GTABUtpAvYvl6!(7?BG!4ck12HYVjkJ!tnaWWaP z2HL-_y1v_vWrfs)*AXoXnbM^Wv(Af{5O_q9H<6=pA-ha{%q-Vk3b__#Iy(erzwceR z%CCx5s4wA~LH|yrnH)?)X%odmWE$C>B$x#94B8|1B=OlWH0{oxz%q$t7K6>Rt^5DK zeIF3x_>Ylo#q(H|i?fa%IG3pK!r_pS!4AfDhaDRmHZ57}+sxUbV6M(_aMJO`?XoWv zg=a>Xt3K#TQV?i7S6?ByTGebXdvi(?e?F_z9_>#J%mE9xGQ8h;{x&xk(}EU#!v_bR zrF>p0;NxVZw_{#LfWybjDS0>ipE$88Jv_O_|KfwvnTPqRE-=gAVPIdqZq2F4ya~ZI zRvJ}5@&YtAGJA!jc>Mjh^X~h7aX((E@=01SvU5G{;ww2RT6n|Zh^cXXp}$y5$+gHM z>>3}ASo|q9k6Fj@p5?)%-6v)}nYqB3Uu)wv9|lK`nGUA2xi8&OTJu+Qy~RvX6Pm=1_=w2g zU`P&|(5Mxz!=j(j$a~pSA)O!fTL>x+vG>A!arE!7}%J^IAa`` z^Axxe7q}HZU^Pr&PF6^$yeLq5Tzu9C_8d3P$_eZh4eXTx>>BM{6$VjkhTK&X*z0RQ zaH@P{ul^8L>X^*p(c=0daF4NfNeRcRi(W^P6=tTl1ZuPjg|aeTU}z3=io76q_ltGA z11sAGv0#n13lF#^$O6{F855N~ zC#hymQtzCkxpI>B$w|7BavsUudYY4&Gdb86=sv2qm~3g;7oFT2vtqLS%Kn7`4A)tv zxJLG`Nnm*NU5=lj)$Qe!vmH~sB6}GRbo*ycJv4)XYk_`L1H+t(sqvECkpT=G1|?36 z)6zS;qY@bIHBQT&+3mcML07py&vSa+4fkTvaF@vG)sh{xDpL~{_SI<4Xpord$jHU^ zpu2hHj9QKQDOEcaId{&OXxX+VfrD>>$h7GSoDU{WIyuudgX3t(G`2$4NQ3EfGiTYi zn=GxIwff|&wJ&F_=bXJ!bM|J>*;_MbZ||JFbLH&aCui^d_j2}r&N&A)=N$H&b2M|# z@y~Wv_W@9t@lUleN0$ zE_7g3`pBTfwfIWpBAx{d2g(*d%H%Lv#L5z|&^BxCf(L?Z4;j8YFS#E%IcFj(^Mk40 zv*s?Cz!1s66>7l1m9RMI)|}P@44efFi&PFReQ?qw+G?3dde^edRm-wZEz5niET3z6 zq1RkSM%XnU1}~Wm>N(hjg@vW1rNt%01^D@um6f%%wKdf>OiWCyt*xz0Ee!PZ73Ad| ztnKU_Ake|t+1ba($HT)tI5;>uIyx#WBEZi-HZe9iIXNdMCo?^xq@<*#rn;iMydXC} zJ|X^s8qXzNk;^91=M~wn+NhkDXT9d6bHmHzR*>yV9joHi#^sCUvKnjZZb!P_%M8Dp z==-1`?qOLf_at4miCTP9427qeh|jQ)o@FCG-JG#cMPatR$~yj1Q{i!$BD7= zPw%Z@;+cLch=r&AXcIRgkMd-mPDDXz%{U zgKk!w|6eTv1Rk!z55RA z|8#gyd&mD7v;Ox_{I`6?|83jBSA?uMdVk~TCwneG+lE?jtZ{mPqLH{ad6|KR?Qhxd*h`+xK1|9kfzzPa}Jet7%NGwnJ$w4)<*RRRU%dSP?ailm-#@(n@$vnK|6jg(Y@`vEbW89D73zvcnkUc2x8)O|5z(ac_SE^Lm@I zM!mcIP1jH59uB$H#$7G!J)eXq)!%X=81C|| zT6s^BL7~xbas3)T27v;tZSU{b-`!zm?Z|l7;=p{R=!CGw_(fL?m?a9Vc7A;w`}%^} z?uK*U824`cCtd1%z3HO$VbME!8o5`iK7M%o*=6bNH;uth&Ua0FUmRM?P$1IE!?IqM zsDCo^7R&dxh0m$LS2E z5-C1R-)cD?^_aA&^md5FZT4a;%?!PuRV>TU<6M4#Bf6LGt-65GF$v={TK6u7Hn2-` zwX_#zTrKI*idk25yq-a0Lt_*3+)c6#9?MoPb6t`-O-#1LGF++U^1>AYayCp8p3Y*I zynKx1gy5G4jO;1_2MX5K)=vS3Ti8&{|XW>ZRj~j9m>q z7IK~wOj>(27CWtyNS{{uZ$94=uDQ}1o;xmG%c*dHprw2PuduF%rbRgWEa`s zm~x5nLeiQGWxp0oiIP1$C$dDsg?$mXjrs+xGOjO;iE<((UH#mW&hG4DB@gP8Wpgc7 zt=rCacj8;uV|OmPNmp1zDamm4Pn z1+TPLOR4b6uu8vZ+|MMr`1rmG4xI_=X%P)C7z*Yr>M~qqquy(>DyG1JT`OLh_h4zr z^a5E~?j>GwD<;Uiy%bj)c75sU9Cszh`r{We!*+V_Gt4|Zqp5QJ`8<&Wubqw`5G-WW z{gpob_>7&66Y7JbpSdv|=G@?T(Y~yp;a@g$M8o!OZkY=oWrbN74luotYq_^t<$1bT z63g2iNr#Ws7#v`EFDlZ`uuZXLIYXsFh}qrJScMYDQiZ71juQ^4oz?U5az4&-TUJ29 z`F4GiL#cELw}H{+1MORPM4slGVpaINx9P<#$vEj{+Y7vYJ~S-#F}TBG%U$BtIx}(J zs@t=6Z*zFFvQGBmx3wR49C*oGyGAosH09mKjuffK2WM8X%@*jJK8<5>B&SA{G|y$r zlp_zrC;S%dVG-EW7;;u8-{ORpQNoO5#sJj_) zYCbKcgq06=PSD={LzLOd?7(VC7QQx12H9H=_Utm@N&c5MkwNZG!rp5p7b+5@4zS&s zu*NJ$z4899`;2Xg6CN`%)Ce9t{C`I=d&q@jOus+!aK2P)dJ~&moaV?kVVQBGjbwrd z=ft+FXTm2KN-V3dXNtTL`N@ElEkvu~ji)HX2MqxkyK@RrCOu5MPAD6QsZ?1Sd908q zn-J`h%*c8fK2eyxctS~Tk_$4LR3hLcR&4>o7BENBmYc)~z5fVDWGK2pGK=25!HC5RcHeV~& zI6X4CZaaS&JA=i7xh#x}a_Fs%O{vP8=e1GIi8Kz4%=Plr!_2`P0 z9%ln{&I9IIMh_hdJokLJ;H{s>vQde_BtgK^MWc`>@~G`ZO#zvkK^7%9XJ(%Ym0+88 zqLTT6?3qhK?1yCn6|T*?=!kh7su=#kfRm5 zuk+YlmAt5@GrJl61WhljShIG)&Z&CqAM(7@eIO~y`z9bNRIYL6N=w_~SxkEM9~c+) zPKla$`7EQ}14gSAO0#8jIOg$eW~?e)Z}#4jjXTjx;E)o((wrrynXV~YZk{2)pRV=q zfNa@9=^INdzTsH^zsr^@ z78Qrw|HZ$&=ODum&6D9JE8jWH%WT}Vb8G!NCXX1|d+sZF*QE1z99o<3{Pg7M_m+3f zvh+~R2xbtGZLVgT(7ZF_@`nFz8T?GGdV8a~FJ?6>a`LX96m}J%{|b*r^+>i=Xgy?#r-^+4|BxtPT3c6k2B|`lYgVdxoN74g+=1K zlA0@Sq@~zx`qxDu%`V#24M0Or6Gb33J44mRh^X9@W|M_B#CM)@E2=dHVPk!3-~ zQOC0j*q(1{{J$ckdcBRJ#>O4bUe4eToip{x%m-_f4H5(E`wFYh8P>Hja%Qb!P?X`Q zaDSp~$>G3w{-{{U+#46~cb+zoUEnsYJa;m0*5-5zE2U#18?^Q$IVAWTd*sR(u&3pj zLCik4;0Vj^-ljP}W^*a#r%2RTTQ#c{e{%`><9Cs9&9p1-T*f>z*qfZ4|7YF(_IEbB z_pVjK%|H3rCIsy;sP`40I;nEXDvjr&%{8gbb1aT-3R!7-%VEu9hba!SZ`bsimNK}0 z{`E+w(xB(|_NBow*^eJA;cfrN?v%XQM4{Q@kM6Q<9&fVdWjwM-VyL@KN z`svJ6Vwrbs=9 z^(DnSyNtezEvmM=BjH&3N@z{x@xF~mxj4>96`t5$TVmY6)xcT&_VVLp2ItDB&3U~k z`VNEKiwA7{5ebZ(9@n~THfUu!MJQZ4&@d-9We&@}9gQN7awK-PpQ@~%t8gu28pDRU z6NJUh7q{;@wu-T!swu#^pW7ny!kYSRtXJ%EvsK=`$c=c zOLTH`oVIyUQ{>^kpG#-0PN)o=Alz~$p>0WM?7uu6o{|H+%P;r^yj2OV|MvHfx~31~ zz2&R>cG=f472aZK>q~K28lm7jS85;sVqF(ig=V9xRX*2bJ}oZQY>C=GDUn4{M!KB6 zo;6*MB|(hsf%55P#Xr&|`b-3TTDTrh616*Q%V6%WeneUAOTwY2#xJ&bZQ8=9RK|OH zLW8@D)C0!KJDaU8i>iN8_K@VL`NddSwLEBMxcHLxI+qiIv!B*^+z33ekp1?>oPB9^ zO+l3t+#Oj?$j!f+x-YHPrpLdSx+EdqUv3_>4dm`~))dKUZall-;gTw>y>Ui6tD<+nlk5%;fe%O1Cq8C8v_0t6HGwS*v#~i zt#qOKL`9Fs#sXDa^1QEC_5~NFsf8|Y@=FL~Z!1jUV05{(B5VJrZsx@9M^DoZ8=78I zs8qh>7iTWZQOaBOp<~gHeu0Os3{Tkd1lVIsxQ;Cl7x$>|obWv;;EGQAjM%N^VNDSN zH_FqmTs7P_Bb~*N=ld1=2}KOM7YImf>(~2apJ1A+93=ZQqvpDT$F=YOCOvi+Xj;Nh zy|G7I)9F~E);{xztG2n8bM$mvVo>%JkoXqDx-pAOBDmDq!{Soa8;RbY3N_7R#cP&l zA3oa4uyZQ+!TiPB>jg|r7@`)I&N)`LgtcnM#wezZJm-Qtd8SSJ!{%ti!N99ve}2g{ zCdbfQTLc_R7>;(dEm){>kIj2=fm;8u1gT(wsxKK;DU+EDZ31rE&A3=}OWCx7*)wj1 zL)*nvhY*HOX;Thm2%J5{@ToYNK_P)nF)_(fKv5vX^|8h3NP!uNrS&n9vw02{3uYFq z+LTdZ$ezkxVtBoBwLs&6%GwKC+;Mt1~R>Q2c>vjq+nsw6@mR|I`f3iw0*_3NR4d0S-JxiYbN`c%5gT9yZ%H5p3 zXs6Qe3a-Kj-7$SuXY>k%@`;(VShyBE z`J`MaH2eM~29_^!7daU|l?pgL>to*-w|in0OJn$yZ`%E3ylFe+?T?w-R;oy}1<&$m zpLIE(tub6PEJf{<-1#RnI1Aa|JNwK%X=k)GFyyf9gBNojhMF*Ib)K0xn|s#+>G~;i z*&7WX3%4-43v8=MIUgV<%rO6!u}qd*lHz6GwT=CzFLhUbtvvpLab06M_rc=3omMtR zj7m&tOJ0=yOWh<}Tg7{}C}qisdGtk&4lS(ODpSd&SJjc6CJg>&_dQGOW>y=qtzzak1Lcb znOx5mh<*=^`kLsydY3GhhuDITg{zx*E289>Kk}S+$)7PvODLf*EJMfU7f+spwBQD= z$t}_GLh8$zJ&nC4t`oI9c9B7pX_2s3PW}TaUWKC0WS=w3RJu1$DN2-JQ!w$0VyIM5 zn)s`JhRq^|>yzTx6?qejEn23{OyN@N%rp@wl7GBtLqMta8A}1tMMXah)sOdHHg z0`)2ibd?NLTsFzdZjfKmz__lE(bZC~ZCRCqXk4doz3u*2snV|tRZY26%^7o_nXoZ1 zIdL;c8aSqX%nUr1V{6>0mcrxub>Tz7)Qn=@D-r6)4lB2*O*nI{iK&rGTwtsGBa=%r zJh&&Q3s-XqC`Hdml2KOXU9q5C$bFukm+5sTCuT+VErD*T*{kDB8u=1aw=N1}{k^E> zaaXy4IOl@}^|M)xR|Rmo9yMlO!BFskao0ohuSb-1ig=o=Q!hQV-lNPQabcEn5c_v! z!v?C)ySwrh&s4Xc3mNW|u%9tx$SVjG6JT$i&EQ;~TrXP?d2%}Qb1@Mz`N>0 zB&Pv;pShC3B9~jc1WM}{Fw{6RtP^D5N?==eYhthTD%@in{p#C)Q69om%`L?0}8+r01cMnA3#N=YJ$|D+4Jxiw7J1u`fu*m6CAxAcK~bEIo1|1crU-=Ur9LouUKY62P|q%xa9Y-Z{obeZ$qyKd4{$y7StiSHNb~~R8ipMK zU(bjaFy5bTv`Cm;R)Oi1tG=WVlUVNgMT_<29Cqw zS3~BiE#JTxv~6qX-m5XSvd0UyG9@skH}%EFUQ6qh$_|k(T~HWWb1m=hwY>OcKg^D@y3w`whV#QxxeDG}>Zf{aZ%$b& zoDt%r`q-v3_U4?sHw`|vwODoAJ-N9g_LjlIP4)G)E3akTT66c7x}uWg4V{&5Z*7Ua zE&H(g`=%V7jN5ze-WFAymmX8J_2RXCv3HK~RtjulSjC=jq~y-Iw|5>dN;&&4Xvz85 zyVu^jI&=HhXWqRNd;6*t4^-|6w;8aA+X+l~z%2Vus3U+yGf!x%0e8>?W(GTf zZ3f&~8<=&^30^SZUTDDL8}P`bPx!O}OM8OAl?5!p41y7r0{->ys)9wIGA(3t6nM<+ z_>_0yQ?5jg@H~P34a_?X1clB%y}p3O=fM-#eb1CPKC;yl*nEMR^PIpn2hM;6EWQ^W zTwlQRFEfFA@&y(j2F}QR92I#S=5@SN3|PGuu%sn$ch+zO3b2@8UD#sOMyIk*4Jz!qDkGXH3z~&9io_YeA6PQoe zaeGf->kweIZurN++Q_m`PoQ@Kv+TbQO9P(THN10fU}?Yi#>`%D^8@DDb^?b4Sb8rA zY@Wb;d){=WL~e5hmcDg7mK)fv3)FL23UC$7W1g%a;P1y}uJ9rB-_yu-EP)HMuS|G- zrH(fvfw@OPAmhVRp7$Tj4Y-BmSxof>CLDOo3-lg% z#H7e&{o#|N{)_7u-gXy!?$H-aYha1$<8b=$jU$mmCttwr|L4v-969|TCOL2|G2pCs zI{$fz0%ykt=IMD)Piw!iY+zf;@GI~G^Avx93=?)DIb_C@BetPU*HG> z%dGqNT^F$NCBBQuV%4*1J8o=@?p2a!gQ`&Wg_pS?ATmzUp>UpygelryMKG+&* zT_fUX;nKOOk(YgzB$Ka#lKhc%x}OeykXkCcSxSm&)0u~+9@aU%E-T-(&&&?&3J}il z_7qU{E)tojaUtq#TW`?|A&D&amDyQYJdP159a2-K&&*s!e!sn^y`yw#W?X&P-Q#Tz2*^5j5_r9hzc8F8&y9ZaI3duAL~Iw_sU z+Vn5PdPB;(mFZ1qJ~euzPf^&mB5-!o=7p2gc;%le)cOV;&+aJN5%=wlq|fG~@XJKz z+PAO!8Y#F;xqi0GLM{v6bLoaJ`<|T0c(O!l$+|%65avq-=;Zhn#`0BjuMS4G@CkSv`l#GsFEe!q3pHp;!+N2o1hO9 zUbv}jbP@J8!kfKTR6xpQ-BvS^m42=Tl5Rb!u8~bU zLLUqC<{T6iN)ou)Bjt6ap@}Qg`lxw4=rWP}-npDk$J&IhUW#w#ce6;WZxv75@o?=F z&ek1m^AuAJ+x3rGB=?#>+mYOF&t{o2(Oqq4%4B~x%hajiX**M=$G2Ig%}iegx=rMm zW%}ImXFJp9*Z&jao@o(Qm^am;kI^b~>GZT&mX-`R4(#M+=vbV&di^o0*Q@+?F5r9q zYR3bSwa3+V=PV74OcmWSQSQX7(E0$!))#Fdj;^AaY*xo+WWTs3t(AF+?a#ZNPtA50 z9OiewIfF|mLxGX~!2#qDRt~?=9=SZ}+s1>6XNaUZyt=(xM0LH5B;5UOf2oj*n%+1HKTE4GtfcEorR( zEn>lT;_z1%HiNrm@AtFsk5A@%5W9e1W|%QHP)d5i0tcNP4)rUa=vT`fN#rZF5KFdbXkcFG##MQ| zi^;)H;cc}%k9Nhul{YRZmM&=iQfA?*6?U;yanCW$utc8ZD~SvfCbzK)O<+%cqR1%y zp<5_5W4~HffxxT(#y9L6 zea`ZhwbZAm{9WFqv`>(~e8*wUB|CcVaONvyR6qW+B&eNfNq=q8loYMd%x!yOnWf(v zKP~KQG|7x{V3aU%lUY!{KlIzB>0Y~;nRWgJG&0pNNT14N{-RdEU}e(6Cz`>`R&VK> z_3Dj8A;UrGPYOpLuVLboD`?hWKXf*0+T}UVUDBG`<8T@rrVf=Z{?CaJ~n}ge{BB-_G!KekE!pqL9V1 zwSl3mYeT3;1LHjJ`aZv#;b;6Oom*zns&#CN)--;G1jg@&on>3FJXWzfiTpmE9a1dMP)3z}+mWItKREVSZ)v_VJLLQ5C^k{$h8b_R`{H4H12C%VZ#vKILF`_m_p!itS8 zyf%#d0=mcK1ss?jIke00KUu%*$U2SihgTXW+?aByqnTB0L*qK9>5H!=u(nM!npM&q?wo)-aMQvEYQGI zGPfaE!kLkYp@G56H?94KDc^=X?c08Z4NN8eQdz395wkO&wsAccYp9-WxWSP(>|csx z!6lcIlahBFVq|zQ@!8^84j~)&TG%*?27h*Nwqe-H+!CyyR+<^A@8IX9=5YIK-&Th^ z3GeG2nj=@CQ1k!&BCCn>u12N=72-ql4d7M6Rk$#`C1K#oYs zwBrYw*{v9-Cd&w{ER=A#$nJD|TlcTYcj^o`a^DkJx-5XPnEe|Qmx8&zQkjCs`+Kr1 zx&k><{$1Er%GSX2M6LIBSfs-032~vv=elmNid8UmfAF_xp@*NbR3CH2$0MuRdYBas zIL=tTW&O>t@Os9M$*=0{4j6n$`@|UHu(3h(#N~7UBGNCsKhxBle45>;VB6)t^OdeU z$Zcrk&GuOQzSjPjtP4Z?SsT_bOfMO}+=;4C^J2c))3W)d@-~(O3eQ&04lTC*!PxNb zV*|?p2BtH6m>gE=a~ogMRy=f&?Go3HMven3e{9;E%$hNKZ}tO|`jAyym?W&WURs^K zgW*6BE4#SypgaMC{Jq&{ofNpyBmI*<=UDgFlVbboMfCSjWTCAh>4LCt*Fm+YYxT z?`~UR$>G8|U zjq!VHYa5f53tllilIrl%*pltg#!}I|e$}k?S%+0~q%UW8?BAtW6YSFN(8@ny6N`oM zWN)*$L(N+!>6;5Qa$Yb!F-wzU$Lz!ZlANqnS+d{ zH`@|58Z-;otYyqYHXQ#YWcA47NEUO$k>Z8RD-LpQU=!Qb{E>4jC%1EPNwXR z`E!mKE?LR*W2YI*+J)JN)MYxXI~KE87|e>=$9ZE<_KoJG!?Vp2wz4!d_crZ%s=ZJ; ziB_8l`&L%4u@&st z9m1NO&@kf-1M`ge>t``ku`s;;Ez@dak!I4M5~IOsQO}TagZX3f#_SIaEj&jWC5|{v zIn}t})Wi>4E;-Ix&&61ovieuip|*(Di=EA^McdM+*#1y-X^&vtHfPI|Zma!HC$bf` zt@^FPopdx5suu5Ptwd$Z0r8mwfPy3o4CaNVMfu9Mv#E-_>{(9pKwu%SXJ;{ z4ez8mZ91&aH1Co!(JX8-{*%KI^1y7TrQY%lZTr9ISl`*Fl)}np(6I2xe&;2UrW#D* zxh)C;XV-q{4433MARxBJfkk0Li%?+O6^p)OGn!&9um=9^3aFSkk)u_?fMuCwtIY&v zo(~MR9nIV?7_3&b=rwmus9(a&k+9|U#b%Zh4XGC$&t`RWTJK(E6w>L!nl8-X?aFC+ zVFy=*lU0WT>jST%Ee8ya9$w%T`o<)o+~kY?UV)gJd~(J`$X}fGtCy?UW49$`9SwIU?H|+U8_PhgDACObyKlxH#?T znbeOrSKi>~>^10A?0e|YIc=_XRs+j-jmRZS*WG}Nvzbqz(RPAejzz24 z0fzP^U8z@;HDp^EA2cw|IJWZO`CUx)3|ZBevY2&jB^p>BY;C(?Ea=ftZN274=8^0I zuf`c|To2A}`?>nA*5%SO2W6i)F#Paqtgvi9(fm<{L$Kp;qrv9%J#0K04dxOJJvm$! z(h>hmML0xrv|3WH7tYpPC({{fvs<;>F-e&5;L4bFCT#vuGu;@PPKdC|PY9S2!DbRr z&-H49L~1~@sz#H-0p7+8QMG_BX@|)6gcgkr5*{5)-3=_N5AFqtwrP4yQnFx~BN}Hi zgT-+r>xbI@R0EclimRO&ERT3uT_i4M9=z)6(BV8`MnJ`+n6xPM%c<-P zW`-9x>XQ#JY|7!tmz6yf**fL0%-P$CO;asa?3B*DFefr(uohiF~!%?~9VRjx;wG#JboW^-8t zNv}3vw`UvYie~EoZM6~(+jowPKN{AqW%#6Ry#BPl#bJhnAM5w`-ATN0cAKv>gTg*G ze{D7EhRoMD=-j54H?A1p>^S7?2k(pq7P%Qr z6E!%Pt?^i|=i+DS(4tF5vDOcO7($^@`9E|~b>Z4RR(Cr9Cn#)c-v zh@QJExII=dntteBBrDDTLGxweY2|sd#ay;5FXOmx>6&$eAx)aYcoIXC%DgS_WJRW^ z*;q6j2yLA&ZL8F)dfzbQ`KN{|=?31}4Q4T{=Q=lpvqWr>dBhmOaO_ZaeW}>X17~Hz zCT}}8(LeK7Llw7C$cvS$gmuEYxAEN23F0~x{AUldz|wiUw(pH>;My_Yte}BcV9sur zEn9CroHVmZHQ=K2hIcC?+EQ*ln6RTwl|ghq!#}PLhJ^EFT+SJBrWyjrB=Xt=*t{ZI zTphS3JdI3sWLoy%jp>O-*BLAxA3E!eceK6U(PmoF>A8aA3g0u+?~UmKZ88&tJr3O4 zq0#w$L7V3a`{fP~0%f@#ZhNkkE*fLougDil=YydAMxP&WCY#Gy==@0={QNl+U$Z!MxcNnZ=O%4VK=#hRts?hxCaz}o+%^e0bgNJH}%CbQ%Ti+S(rp;WY8%>pOBy7VTWoCtkc}U^=>>P4VB1rp64GLwQUp5n@Nn zQcv>nWC=9&rS>SFc$zKHsu)m`k(axiLD*wMn|}TNHqC&hY=dSghbEygrmF^1O!b+v z3qD_FW9psyIdum2ERBb12_4IivaSyJ)TYoXJ>&T?jgnKxZp0kDQRUw0R{v#n@0Z4i zs}}4P(;8ZoBPyFtFg8k_eEPwj^GugRsH#GFpoc=v%7os>-pmRUI+Peh4b^!i)cRZ} z#I4xSrWR1&bl5F2=0xNEb(4PzaA;I;wy`s{xBt+bAh6@Yh0g*Vz3IjM=Q~n4el`|x zW(%|_2k>Uih-^GjvO1wrbT>-kmsh!}NgjPliY@jmZ-$+UALO{7V;Ln)6&B z%(rIo`|nH4yJvnnzxu;r)u}3iso&W%nQUfqsUG0Wn$c=7vA$z>0q^{bIJX;&`HHLx z9Mvl-qFN`+n6#GlLfFkzfhLiwy`9fKWh=1BPpCFn&&wLfJh9`J$??g1&2ufjckd1B z-N?^$YE9&%AG}A8cegoIUp>KU-TB9I=AX_8p~LZP-I^W8HEwPbyr{Y0W;O$diDg=B z^)j{gwb_%49_%Vx8`4)Fz^5LxCgY>hu^uV&qBk!-Dxa7Dx=keWQ;G~juGc&%1IJq@ zXBeelTBBJssXs<6{j0*)!i#(=K5ZhLo8Cz2DLPK!F?{TNeQT;mjRxnVE6W>#r6qBFIaAN7`tW#7V-2xdVFzfjHQ(2m0inBr|k7^ zTTtea>(#dO?VwOMyo;_r#GmYCLe+l@eY<&bBGu%BI_{bx2JTSTWgTfO~jCv(1fyx(W`+`nAa-_!fCHMjuXd{Y?qGR% z$K@1Hqs;tPsVa>{om#sz7E9hecz`Ka=5Z`LXGnqj;+b;0dUUTvxb*5eWm##hTso^t zYgLY%ai-^urN6Y+Y&>P9y>{!ZD(!VUU+vOfzjwNg10#2Rwa%uKTDx^NpSAj}v*qHf z=P!-dA5ziXb~9`DTGwM+F3MJ}K9G3E{rG{2=|0O39DL<^tz=T8mhjd??m8PkT=eo> z`{N<)BEZo9!>nGTBGvVYrpW?B*tBLto|4rId+Kg0Nc}xh7N~iRu(bH7#$6C z*dwua5d+&*t1IoCO%YA?PV#)5kKE0K1rHrJkzy5M=283O7^rR0AJFO^+H-+RQA5CJ zqM@jRfzJ_N>%U*tuC8csuPlA=bD|b&iOggfh2)mAY&-_G7v)tVE}i1Ajt@S{xyQ$) znaea^#G6w$d`b_OL-~>892;4ToD@XXPIBM~kgl_M)HAP%>+y;SyDw_hAMbJ5$UhxWXG(M`8RR3|sx6WO__=u^t{1Kp}=;VkZq zA>muNv@WUdv-|z_c1aH_r^bW>48`?1D!r`IITIR~IcK~-=q>Z8jqOfe-RIjfyljAf<6aEVHPnh65Adg9F(Q-bvkB+3-~F07Lp6U4fe? z+!XGV?Rgi=oM-5Lj3;P8lgNdJO1_1&@2;6{-sN+cU)|#%XNW>a=Z{>elLd*c6DBs) zTLwOn5Ef{VyR+Q2f6by&NlP|4qwTI8fy~9L99$X0771pDI53Dg9Mu#vXw1q@V7#7n zm{D!3A-@E($ zbBa4IpJO^w!JDjdfalx+HuqHlOx{NhiEga#Xyi&_+a7jcL*9QY$FFLWc;$kg@RvSr z)lMmBil|r;bYjIL7Pf|!hDM*2#046D8Z@yp#yFIny%VN%b%tPOhy!DC^I-;~@Z;8U z4Kb@V9N2HLdN5x&s8}K4V4^>1YnSB{rm`g*W_=qQxGkRW-r0EK_&b9}&Vmii%qyHt z19l45+s|0QqF%6qbDI11S4R_Ai*~aK=uYZYv`UfE?r7Yz;<@0b&P$5BcB^@*CowV{ zxvW&aAk9mD+S%Ws4fFXf9=1RJQou&;vQ++yc=itky4Epg|1CJ}B70nosmUhpu|(kx z2UaZuhS^aLjMsV&Gl&IT>Ab@@&r!QkAxbe!QpaCFxxT@X=TcOY$d7_WVmsr$RTMJW z`LL{$TdA@mY1Q?rO(Dva4KL%ing;hKEM9hLv$Nm(N?x0&cOvo$4XUzEAtei)W=fsB zb#2{6MpmCy%zQr>WM52Rm>qXu6@zawv;X&VI%P|^PE<$V(J^F_`m%6aEyod8 zRQrX5$_*P--R|s)e)ICvVqwntA1#{P69SG%l@v5vE!}O$;}EP|UZ0@1%1^O@E2F~d z%HB2+Mu+=v!V(x43xqSiaX-X(XE@lIUvdV}w&f5tLlIh`0Vgd8rZn!y1M+Jqdq!Wp0}D;8tH zQYY4Sm{@qO<2RQowb^HWK!4Hhrm!axYb;#%%1)YFYyITn-?nm}O=9g`63L>k9;dN| zZS3Ole*Azj{(_#wcCK@>&Z5`3EDmWd+Fd^}JVj!80IO+V;?6g(Za@9@Y=OzYj38E% za^;&2-%Tee9=71;zk70pxc;lFdlz3{{YqqFv5ubC<-q78d`uDM#}+2HbKPiEy7c1! ztA$7VTMh?C>E-`CWVHnRLn01b5VmwrIZaaTzo??%VQ!*L(>BTLPn@*JIwI{k#9kvA6TgaoWOU@#&oGrf-Z}Y(F-n zR6kVQ-(a1(faxf&wMUd5Z{`-oo8McXEPxdjg1p@t6J zE;8Q@IhU|%OxpS(u9r|CxyR_Vw7QE zpDFLUVE(#Lmx>FsOwPnH+wf^Ih?z4UxXpXc-tvfC2fOQ>hb(WVvvN4d`LO)roXv3a zBx}qZ_1+sx1f&_BJTTmHQTEkj#wS;Qn;uX-8^@XF^K-@mhJx5&-TDJRELnb~T$l7) zAZ+*0>@K6sl^O024z51SqJ4r0DcEd#_8HXOUN;k0q1C zquLvM)9&j&O8gaj#N=Xd_*TYVOBN0WhP6*0*KcL{ZksIQ_sB%+mf;0|&#loP7-uAz zPGyo2GCz2kUGw(u+J{;XZaluSaMRbM-MooMdvDmDQ}I1?%7k^6h@pc*)S^vmo9Y=0 z;`Nz=9Lu<;hMtyIIiM-y@G!!8Y3D^IwR?s#2NV~|n`}G665z6EroV_D7kl{k#QTOK$@8`>WllM_)j=hWr2Xo}6Xhq7_a z9kowP8C2Ys9AR{snziYkhL4L>Ua0-FgtAz{t31ujK8v!-gk|~?b?5c_d{Ql7TfQ)- zfq~(W>4`>$3%3j|_&cgj60>qix^*xq%!PyFfQE-Nv(2SRKQD&djF#4nwr=7MJ+{z0 z;D}d!>oS>DVhNE)j)*Yu>`PZmJ>w;MKrks`;>N)CRNjXN6`1#=msm10Z@C})Z&`uZ zipE8pzh*Y3U0m+$la^@Za&3xm3Ez@ezUc6#hoMa1zL7<<)!xet^#>GP_sq}vlve)6>HnHLhBk){ z6WDz`oLN{LCPyC85_r+*wsMM_yH^^6kq!gPo;fTtUbu8f1O&Y>idylXvw{7EBO^y- z>dAvL90vl|E9NTk$>D^e5G(R`F zORg%jaND9q=&kks~Q zYt0R&E74xZl(+cl91U}klW1T(k}8_}QZAy|BxDkk$u))_a`(1QTpiWI&d|W1u|oHm zlB>>wB_$I=%z8vr)62Ft)`!$CTl7|{uk`p$O$O7SiB@ev!Ao_F)@iL?vwEGV4u_1Z zkkyhy8bY!MT*7VF?DcKfJ#p4URiSwv%@@LSZun_x8ZLPASi$%ta4tG!x(dbMWf+r&6EAUE)^CG55(p%sH~~~rTc&} zg<+vD!%l&O`?)^S`{JceTE~GzyZek5{87nN$eF3R!0xA=}fMD)cEpKplgJ)tceW@CB{0k$U24(}9EeX!1JuGa~4S0@kaNELS zTc352`?LYy^8!0P#ov44tDhPO{C;oPkR-OMfS>sQKl?_Z@HgI!42%Wqeu!HpgCNm*Ly7i{68(mf(>F@aHj{gI`~`c|`=Xp7dw80A|CQqL7$oQYq>b3mP5R5ArTBQrA8xV}3{|qDWb!(P48@mPum}3!{|9XV)`K z!f%R2EKcf}FsiyZ3hqvesOhw(j?`;r1`^0)S^X? zr%}k~kjL`|Rek0N6DHLe2l+HiTmugADg0yCHE&%0#Hsm>gOY!X?vjHl4k!8cw7Fer z;+HX1S+d0-hPht#N&|mDql(KxKATOFEC*GlFy+}84)Tc+wye;H1prC@9lv@Z>;{1CvrsS;%}B*^&cq9gi2MCjP%y=6<1g zh7U`^W)qKqMgf^tDTafSYTEp2+9oeCi}pWaEaE6^!J>J?)U|#^n@+fku*Sjbafd}z zz8Ae=P>ONZxZxmG!DaY^A@+t7U&aX|j)RhS!g=qQD*b4%KW`K-@LelhLRh2mmhalnI|o{9EEwSfuJt7{@(#$i2g^yv9*#N15FDqTm-l5_Wu5KJ6+J-|{_ zYkp4QaEz3w2=Dpn*^*f5!{Zawt|b!U^-Ec_d54?%A%2mvf9@s+1vF0d%C`#LX?5mc z3F+B>^2)a^e-{yjgXuP(YUk9m)oUM=udnL6?Ix(xxGH^TV)!ppjl=vGj;c(kc4gVJ zBIBsPHH%Qg@5%2Q3f)@;HsoZfKIex5Vu^VdPQi6wov^*!k>l2PXk%0TV~PoX@A?nYX{+#P88~j=6Qy^WBmUb~bUa z^lCJVur#V3wmPbJSmmgT=@x_8E$%l1-Dgg3kAEj)7P8|%)9*Te7EOzPpWJKM0!0{u zIob;aj!LmGhUhp8zd0%((Zugkoh{N>&nwVnGKW!6VGF-W>+%<^E{AK+q#rSQ;1a<4uk7fReZth^kexDPaLh>&g@Z?z9^~`bA|!EeW&B~qCk%luj$0+Z#@+Zb^-XoT zx7M#4=R6afIo5k}IJ`AYI4l+(QIYL(V=}v@q>e;zvyj6d7azuo<|8@=hg1ZZ4K3K~ z>t~!anp2kT;iSw`tC3UTdVxumBm+AL+NlqxVw!>zwXa*12#499M9!?Y_q{!L7F z@0WLM6S181#4U40&)TTaAXT&U(lbW_Ljz{bt2fJwNVN%DepcE>eCb-Fva>hlnU(g5 znz%h@p0iNQmSIIP@3R?GCFVZOG{84)OM*jEv7$xrP?3y_yj66j$*j`X6Bm}vDYKnjmV0}9VRA^R*DS-3LRY!j3lgrfGBYvg1eE$5 zW_ZG07ZnrA*ud~wp<%OaLE}}XCk$pRy#@>ppSH4EGju#oY+z(yT^40??clDj+=qFT znm05|{m056r&n}%=PR}i4H~Rs4#yNSbu1QaYWk${fH_Q}{>M3{y*y2e8(uMZFihp% zC!N4xzOHgv6N}VtwtluX)&70mQZY}P86R#wA;HZe5ZJ(LaOUiB`NlmQvpNhGxk+R- z`4p*mB?VtPslKpBXmNUvVVZbCm?Z1W%q5nsqRDNHY%}FdtJ)fwtY$pmvsrQ4r_t)e zhxJT93wRhsZTBobT)!ZcE#d)_;D;5;j0`V!9AL6}7r@XUuEWL1z%90bc`84Pg~HJl ze7&FTcZygXXlAl;c&Zd~E8@Y$#p@)GHL{2-$z)=5(dFQ0G}y49Iq-#rgKhV#6()Q( zw`L?vwQ^8MVBo*?PeOGKD_2I&R2H@j=BXBZ5(@mCS`rVMJpykkSl06_{**8^STEp# zjpjw)@Vlkfr;qk@-RKR!S845Zv^TiV(Jemfk<~J<+1SXiUgw)y3Kuknt)HlNn?1B%x|-;xwqeLf7loOZl`AuYl}eGq+?Q<8zvsh&xm-)z_QKw z(6X0nxUG&|;ni8BXO(Rrps;JfzudZlsl1Pqvz;w?q}&W z{KvsE4P2WJdputr&KmWCu|rPv_(|b7hxOBZk8{jqvNtbfY z0}~9n9vo~sl9(xB$@Z}!QGiM53UQPKo1jt5a}p8w9D6I#X)GN-Bg$)b5$VP73*`ua-o z7&s(f`dqKnEU_*pvGJPht{q&)IbB5zGh*D*mQNA5mB+*^abt~IL+|pp8x_KD92-BI$?MG0rV0>d^fxn?d)hO^4o zCO9xI-QlPm#4mb6@S^U-;De`szRP5{V7R~`ar6S?0Y35inUA*iELGl0g3;v8t2ZS!)bljIQECr1p3ETic*Pk}6=ntnZ=?RJY{q*Mc;qV_|Ma<=*u)jg z+BRG1Vp=L={j#pv*FE~ppE}t*o~zkat+CM2L!#;V!xw!klqbe~yI}G{M5IH-M18`B zz&5cr!UA!(JJe4ou!-$yTAf?^+O?svJ#>Q--?pgBvJne?`#qeQ((7~P=p=TyGWsZ# zi8HQ@?0n>HWR$>g$mcxo{O_yg%QzbtJFan^H&f~6N0SzbN2}#6H5zg*`L$f%aVu26 z=n!+q_Fve`ZCNY&93A&x?)oO8 zszk}znctKuRk;2wGc&tz%8P+bDR=dhX@0_Ln-tEih;sB(Y`A!KQxngoT;AK7_uuH5 z=Us9Lk$qRtE}M2lqA(-L)8=54NYoL@^)Fo1;|#Af)g-MIFKkoy`@?z8P2#&Lb?Q0?DgzQ5{w8hNA9ya|;x?W6esj|$+4mj$uwbXofuN~#Jxn<| z8vdP5u97{>#AUFBAs~AF!5TG*gA6R(c8v8r2^?Rf8ZsOu4jEjN6nEK?W7=VSN`TF< zXV#^23e77FZ668Nd0$vNElAd;LFD*}hs;*zPNb`IF{obl-xhCrjKzjQWde6dI&>h0KU<$X=Mlr3e;jgL1@0Cl2bfvEA7Jl!!(*6oi&b|= ziT(PIT?rLGFV2fA?B)$BoNjS=eglVdSF_=(h1VW3JUsaQk1DUUlep%csy{N`R0IT*~T?*ta2C%BU~4;IPA~<@N=8so;GQg zh7TVOZhorKA8zz_uV9KnEFW_Nvva>7k8#2Srr!Mr*m7b8Jne4@Pg=G`#rq7?BdM07 zV(Yg&(|_G#Fk#_io%$VbivG;2+PSs-kp0tjAv#6usY>a|M)5Nwx|biiCKbR?y`kYE zqXC2IyOSZzQ4Yy1n>~6f7ToCzoO022OC$UBOZ&Y}E=-?!ej)RbSA0)S{@ygje=4t~ z`umNCCo&gS^M;wMWndLxC=Ag*@~^JEe!j~ar8vd4 zVt$`>7Jc^cS>ty8a?`_0Zf_ZE_5W#n$PHlRPkJu$VS)Rs)tzArdG!`Be`4DF;XtFG z(>y(ajbV!XpN{gn9GGXp!zXuM(=C1|LWxMktwkE0n>7CQe$tp|q&c-nbLJ+^xt}x_ z8fh(^-WA6vUvKQk#P@2!`)$k3la5PNWSbm#qw{i;UU9OU)sw?Jj`JQkr{Jf^xNntd zStFyCg5KLt27;4SF1=xR@W8z0MOGXCY^DN}vV-Y7#)gK*#-@+9G`+~mSTSu~y4ks9 zjBC7&eTy~TGw|tsc0ae?Sh?q{+iBB%*{1o-{23oi3O8SkTdG!{&wRJxgz@H{>>Hnq zwKg+mTsHfmZa%em=Ywn}CI!(GAKmAjl;6s35t;TnEm@rFfW>?j%juu3Z?BS?lgPxA za7KqodX2Z#yhMx4M@CB@{*y>LZmxSsYTiPV{I}P*Ufa4m*?S+dTJKn%aNPLbWxK7D zt-T-FE}m>}ekfW)aPtFUn|ei&j!y@8_#7CV9`HVT&Uc4FGE9+s@9Gd6Hol~E(R&FZ zYZj`AJ_u+y#4C0n`GtaB#UVzWkc2;*m_-&anlbEHAP|2`fjO-yBj) z+uqM%Sirl^t$iJ1>9YmQVrkAc4o+Co1gSljSdq-6x4`M?I)w)cf!r#3 zOB#c?8lnz1+wzviJ$DriNMz($z~{%9w&XpN&;h=-M{Oi?f{x68( zQTlR&2PxcTXSEjY&tZw=erf8s`TaSi;)wM|9J$Q@dOSo|G}pNW>(_nz`r^2Yz*)&9 zjC^d|7Ae{{Ry}88((OFQ#21mMTh+?wcTg&9VSVPGp170Sa+hhiURta_-_1L*e?N~y zDc7T|tMqMark&dKdaKcbdw-ORmDobsxSE*qre(1lD&SLImlnEP)8g~AEz6GCH?Ml1 z!u|YQ+UW_3)@iN>UM*U2YjtnKyC$c$h~{H^o7mhZj@{wf^N;fsP z2xNpMO*}ulQ(9wOW~*eY@v+ED zyM*y|>D%(yWf^Be+?4Nq-df-%#KOR2z|ylqv$E3V(7L4J`l(0t7n|ixRxV@e30>{) zDz{X0?;5Ff%L?MTivt}ef8ml?ryp4wW+C{J;Tlt^-YG}fw1W)?83h_{%*ctJzNY_} zPEwefmYqY~&K{xkqY;T3KJU#t7B1<(@XeIFN$OPsv%&&K8HQ}0MQJOJ7QF}d9K+e(Eu(vSb;E0riJ zdmI#Vah6bF^wdj|RB60n=A0y^9i&(|$9^3E*@^JAK)i-9=*EVg+)Jd-Ae zuUhtQ=Hq^m8i%ReO5#lkrcTWDLPZZI={JcKEfBFg%u~T2=(Jd@YypSQPvw$>>{17( zMn29-HE*5#J>{qN^tCq)YucvHQ{+F8rn_vj!ZEc!`%ZU@-c*{hZ07odZMscWi;HK? zUnTsHX+c#lZ?(Hc*Z!pHn>>wv3mNzhOuT!dmCMQc_Rju$KkL{Qckg-;Q?@9x=10Af z%+u71FDG7F&AmK<)8?iUUm}OzE@LT0_Nbc*5><*e&O);s7I-H~E;}G_N=l_fk=<<8 zVpnBmo`hAgPhapXnkaBwYQYVqs2vT4r=z9LlrL4hsiSmoo6pRH=9T*ctBS2=@m}v( z`O|9k_o5>G^qrNfpC&VQsq@X^Ka}AST9G-ozV=y7?0JPfsp(UWueUiQu}s51{blNY z39UDMOvMM;6&RJLC35gRR9@jIo}(!K>6g@+Mu`$e!6F55og~R3#)S`~l&3jL>NH7p zFjg;Ulvwh6=SszY;yDY~S~l$|Jve3U!QJx@iamI`tGIEYYX-9pq#mq-MO+}LY6_L+&om2XBU}o8R1)<8Nb<(~1yO%{yov-M!<;;!E^G{X( z%&yx!J#|~T#Y}$wqOUeC3>&JBui>zWZmdkW^}6ZL<5cUW7LCej6~|KzTBM>*9Sh|b zydb5lc94C|Zsih3&V~c*H48ZV{z#=Ya<(XN6fM}reMoFkeFDdd8uo40$^r{HM1D!_ zvr&>#<#*c{AHo$yQ6VP=sN_ffFs-A9nCA^q7*sW!EGjrZ`#kAp4s?Qbmj$ zix!CF9ONllpfqhE$CL)4tVG@&bCf+EvWYdOwI$r?WK{fdOKF+)(yjfTjx{Wo{-^v_d{FlTkTC~s5Orob*`fBXnH1Y6RwtrS< zxiKt~75(Kg+jDn>rBcI!r3KGB>bI3GWGeB~PrIy8rK>k>Au}86rig`q?Ov%iE|hwv zd~4}JYeS~eeH&kMKVl8C{nz#9ByW;fjf05CA)Xe8C6^R9I&#o;8S5>Ry*L} zc;cF{8-vw?bp{GrT%UN&OpVn}@L0SP;b>r}|IlQ|kaTEcHVe1V5#=rD&z6=G7 z=hzrI!zA}~7%o26D`Q>thhx&>t!jZr^BkRcRn|JEEo0&Q^hRou8msiv3#GYU6Q^8v zda7`>@FHK-^%WeEX$IkaZsO@{7aAR9Kh+;lCdRWhSO}yJ@*di$TVkrq;&m z0lpGC364vfE}8iREWOdo%)lVCXJVRxfAdMUmnI#_ANrd9S+WHh?pPz($7IF!QDcE` zz*JU72Cf3~Vd{+yjFMrECk|L{Zk@sUoQFXn;gFUU z*Bgzz;D)aa&spE=BFw z%9aUo5jY)Sd_=_bZi%n3*9VtV{<2RWH7lO_lW@Xy$CD2oj{Q$A9BFrocp4aL6YK05 z7G3{T;iPHXj|DuAhjd(1czqW%wn=6v1PPe>ez0f2+Ki+=%V&lw7Ce$QnRG+?Z|VN_MU6Tb=2StL_xGyNX8^tGji+>sVqEh%scLIO3>^yOBJu#p^`&hJ{K?4PhB}rd~FfC9P>)e=c`+!cByNX zE;uCDxO{<8PtvY1CC!<~CRI+F&Y~;S5+Sb{$YR2>RM5rCOT%%3Y4C!KV}UGd1DOM4 zUoP?B+ZwZEO562-V3+AEu7*?Ht#~7!?7Uv^bgJ)80Txf*w5yw%cZsi^*eqq4P?>Xx zOaDy4;iXnQh4n{-{Cx_KiVF(2M2g!6yGSYOD!S;MGMLodab024VU<%7a}MvD%(90^ z$?lDUp8J$1514&fb)9{>I|Q0VOk5Qlc?{d%2&{LzBCyz7*!hW*kC$s!>Dk`6!q$In zMw3|*n)=yq}j881;Oxf+c=E&E#i_ZI&->nxkzWu~?%9n)qZFVe% zEkc1Vzr}=A^&3wJSU7IZ6>v2W+U8zx_kpP6l^Gu|@wu}kJ~B09+}F}|Do*8;fa8-5 z%nzcrW^g<12=Ta}sLH?4Ls070q85JVmW(hxXOl*en6BHtH6M@3_t$(nrF?$laS79f z#U497oKD?XE4+nA^Qv=wGPnPgGftgGS8gb+b>DU7QL5h32}a(UOCJPX__Eny@tLpE zy2jrB-k$$2_G{YtM`Br5oP>UFVvSv3$nEKoBxZO}K6Z-Ywx^y2O(JU+uynpLkg=Lj>^`{JYX}7R2Gi9;Nm#zpr>xlLUFl|uHst+JpJ|* zPFRz(RJ*Z)$Lhf=sR9p&4LqMbd~=$(BR(7jt)DgT$P^CWa7dM_h|?gWNqEHMZ>imv%NF)cw+xU17SX$$9t2Cgj?$1gCjsC|%sa>0o4@sSR@pDWKLv}w-V*OBg4 zlgR4Vazs4hfJl3XPipK*}8K4!W5 zy9|gxeM^KjM`DX25*ipQy~>*u^(lP;YU+I-+4L*rgI z<9!oY)Bn{6Es||K%oN8R{V3ze+=vHFxoaC(4I(y6Y|~v6YjW|lb8XpnrRlj~~jc^(-&ny&CmmBZ{tK%~Kn8QlANGntGu)pBB-gePRR ziHGz&*4GFXo@>Hkyp@4XpQp4-(%?X|Q_m9>^M4aXStsarPTd`!v&K{^J9cg3L$#yU zUXiEsZS>8)?6{enQon$4Y3L^2vnA{y6T1A0KM6ZpB&(hCU=FL;v2<=!MUdA$MSexo z&%*3WyFzmwFg&zj&6ckNiM?Utr*8p`EH4h8x7yRpBK729u*U)3!zT_foSDVW zaU@YxSmQuLSYhLzfFnKEXD~Cr37(J~qriN5;;{_&%P)Qg?dn)O;W1;qh(Tuan?wfQ z4n6m07Z_N18Wc}2W|m3YnJqPM5yQF0W>$uPMpMNnOtKOVtU5vL3?&bkn0GW7_I;es zdtl*hz5^n%3P}QCJPu477CL9VaA4;Yd2r%ln3CDOCuv@DIsb`XxaOgHKIB;)|8)s@ zi%*7H3Ji6{5sX|bm{+`GXkgW-Kd@$I6SJ(tRW^nTX`-wi2WGwb+vwwX;L6FBhtov) zKF`=)#LrM*qQ$1rFhyL2zq!!F?a5q5YsWeF6*&%+h6FOOy@-0|lfO&iBLlqS9JZ4I558;!#b6vVL^YKgQ4t+9nu_MUz_s&bNrVl;2@`Q zv+=4ygXnVoeIJv5G_FwZIGp#sXZuH!pEtkPvwyp1*(UWe=!8#F!xjlalWi~S{(R`( z-*hR$fzhe!D3y;>&6$Wb*GR00TzzOf;$wrHYadzn_zxAfqS8V zqtXujQx04^KDeDX;9lrZ&vod7;E@2Xg%@nCn}u&CbLU?%-pWuX{ZKd|Q()JHX*&-@ zY~H~9yF<@?1Bb*!?j;5@bW*rCH?Spc6udHlJI-mAp(4-L1n#9b9k(^GSvqj$YKmQ1 zz!Ie3a8=pz_okU2e~7L5w^MJfr+}H`WVS#R4asTKGdNr?IQ4#DuDdCC#i3qTaTBv$ zgX-x6EcJ`6vz6S1r~=!wl^=CzkOb48Ngg$FU*p)LC<3Wi{3{PB$Am7S*#%$0DQ9r8iY%#icp4Ca6fD(4M2w+7gIESPiMfK&Ap z$IcCGCdItU4;P(Yz|FQwaGQg}5eCkG)(r-|0nF(uxic?YEiEtz?qXrdvnGJ(y!fn$mSC+ANN>jS-PjSHH&lzFpOU3513ZDe6%I7wR3 z#MFq@D#mjdW->dzT3u4H zMADGeyJ4P0{lTdY8z*SYTAXoUveN~lu&mY7f?4JkPk6g?iQK~8|5+A#EA?3y@?1Nh zXQ#j#D8TBKz&!P^;MQM@ST3$>h~k=Bsc89N%4r6cIl`;~4J_6HT-QEq3iDjac9A96 zf#-fEw}O$%qy#5KYEac|dWgNt~>(vUL(+Vu<2~)+p1k*OK^#2QBac$s8yD-@; zd)uO!svaBGUO%vH?XPWr7S*q8f3>6Z^x`?*0uHOTmwK>jD{Z>xBF&4WWn|Xqchz0lO{~=ny`SaaJ%@$)t94N>+7X= z=!CGCG70$>Oq=kaH&1cZlm*-g8#n16<~U@)?H#c6VFq_%mci21o9!>KJXdBly|Az0 zmr=%pX*&(}OMWzRY222(lWj`ysygfbj9s(*lDPFJvjzVVwcfxM(9C`P@YD$j+yM>7 z{}_B!E?aUN2pOzP=GM5(!4@L0WCL@?1n&CcIg9vY*5%ILbLO@c!(_Id3}P?5d1G@7 zCOtS7&|}n-z@75u;G=eq8`%PrA27dvCD>EI+)!-gu|a=F0E?Xhi`R$A7K)r^AIzC+ zY)?0^s9CYJtrAQSWO4eie(q-u|H*=9HqG;G=$Cfnbeu4u;NUz}VV0Smyn!Et_Pw!@ zud=GIXJ&QLJows^RdXXx-~?s|1J>REmTlF7+?<=PJYdl~blUF0>5NR?Y=;GQ4{Ur7 ztjajBMq(pJ=&gwsRlID%EFK%qIV|M%FgT-MxKgdg%3gp)WzPv|k0ol|Q&j|oZd$P> zZ{|twGWg;A&+dxDBpzhC+}l@uHGOTk zqVy)OAX_A-h*{R)>#d2cl8-e~r{(VBasz4wNy zsK)UEuGIxxdpabSU%26aRs5!dz-0s8gr=J_&I(S86_{hoD?9hb;=KkdHZYXB2owes z9d8tzAj-=o=q~@GL+}xo!M_jeHwBnO9RzMZxH*6B&GLynh78OG0rjl=dj;1CFt2qG zSj)iND8OxWfqjYYUA|zCv+myP4C+glaz-BrZP>`QqJSa%oA_D-rqBsI>H^Hy4R}o! z+-5s?uVNx^%LR6=4NQA$1=l(-H8}`0H89l*aH}{lU)FuV6|Bh{nk3T38vYNhz|=B<*XRK|izBl^!kx@M?cx|0iC^E`K3i&F`6FA&+bVqZmVBL#tr@?YG`_t@1Ln2jeeMbzEgGvVgR4G&+a6{Y&UDxIjHT*iA+G$Q}0XTiQG(HVk; z28^5S7)1>jr*a5|E_hgPz!Wo&sl|ZTsD1;}$q&yboa4T(z@a>WY1)T}$_rkwOnkWa zE|=;7c9ulWpMM4O3>f($Ufq2sxT5aCwFj*63hHl7A8+UrT>OCT^}cu7ed09}m~I*{ zYb4y$RN&Y+;RS2q+h23vv~0K?YQQnY?kP(ktGdG*`M!T|v_2>N&X z_q`9M=f(N&2mEdIifUjDTfi#EDq%8Dupl6ZYXXB?|E*F%4)p+51BXu^-f{hqzU^1a&XSSESLW|wU1}v)cDlv+;b8Vcem90Ih(2LKNH-rh`q3$z0}~D zLL#U72Bta#Uc-bJ8z=C#&%1d!;KT8IU-kM0BmD(x1DFEl@faLfZAd1=J)ru!-j?$kFhsT;hkcVIHSz-}_(eYYP|+x$;;0j!$;0+>P{uup!+ zRdJqOn}J#OpWyYh`n%K4e>nC)>cr7nsg0a74IV$zRoi&r-b`6;;{euaxx9@6%-RCX zjUR5Wb6^gryD#$YuknGu(-iL19QfmLPw*xCA2a*h;t200&jpQ^{^8pE@RjX?) zD4Bf4QD%N%^r}V0UavyeL~hM{dh6=z@C}JOm7=%4T5=>kHC&Rp(&w$w#=@uPmQD|> zV|-tKJ^E>%LiZN`Sr&X62eg!D*PNfh%U2&zB&xnT=KT~-wSvVBOV@n4w8vWNg~L>C zk%ZUYCWlu$GxofbXy`L}{N-IA%OeA}sT^7s-hOr)e=lfYKewz#x^!KmS*OL`UbM{vi1)4&d#8# z-hzXJV`8Es!y^Lx{2`aTWu&JU7Z=ym)Kr#N6y@Y6#K$|?Ih>PYxuC{#QAhZazQkn{ z=}U$Z=ao3F+NfN$Q3GB0=52bz%j9N|?OKbf)%AvDx1-$dCi>k=4Z5EbbuTmQL4MqW zg7}9e$&YGs9#y12uFbn&n9y8R&pAnlZ;FBNG*kE$a7=w_+!Hia=7O$((^=@Hxxn3U zv7hPEAj{>Uwksp8SA;vQj`doX;0{(|a{EtukpON*ytm1!u;s32(?YpBUZcCedD0|L{ilw>x znhN%})HgI#9qBDO*ii?*B(Ax+xx1&kqaAcf+?+Xcrq7(wKcOFbN!;?~o40J#D}6G4~6EuB?=p=Zf5QKH3;r)%_J7At&<$}n zRvdn`^TM|K2SInk9faNuclhw((`QZ}KYsl3<;!>O+_`b%`h^P@KG&Z<^5x92ub0k# zyLR#Wt*bxo-gm}>){|5!(DrJ>&L@;-yhsPe&YY_JO3|V{(t_$zt^{)Al(i3 zA8|L_v&X+)KKuRl^_OR_AeY3w{`U6IhxadD{Qvgm<2#gl;sm}R-xK%e`;W!c;DBGIe|AdT(EMcX!2SI}~%J^Hv!i}q9+^5H#-Bo(Z zj#G_&M#1uktHE3hDi%jK+-lj+Tp?_#_OL0t>8Mi1-KevNSgssj>^+}v<1Ohe^@?vA z^*;15FbI15)4n78AfM%(tto?pgGCh^gTMv#smu)yTCaY5etkXdjqL+QsgCdf!;Opv z?U@CCOBDjEQqt<}_Dn^E7$>nMQxDX#KYesPzSbh8OYYNL6Zf(} ztF(wHA(K+~%GVn$1hfplX*`?ZcJ^RuuY^_!W2&=Q2-}2*rdJXe>cv7VgS5Pv791=T z{U>@W=-35`>yD*74GkSBYO7ZGRV8eXo0aviHN$b41w%|U??VX&IqjA1lFQbvohim> zB{b!f%!GF(stk-iRsn|pyybSjShHnYNY8@BO}i$r_()CZU6CnyJ;0Qc$-vR`*pfv$ zTIDszUNMQiunM1Y{K+OAxf}I@6B^~zxt6rYKYutSM{9*cXhN@Wj`;-58-F8T@BYyB zL_T#6-*1N~rYqhTG;gQ|XgRwkd0vXcg}+ z<+zL4Ed7^VlRNrkT3C(6LB^se<~KeK7jBufuV1Z^zSh*ak%`T52G`4jOBr*s78_L@ z6IskIS5@H|u<7Ol#)GU0;?3@C;wKuP{Bt^b=i@QyRabX<11LEQyS{r$a`H`qcCYp;$7-`if#>a{$yL8ki6!Q*m=au{ZukAHX9@)g&~ ziH&n_i9G%x{Yon3l(gU+%LbWc8oPHmTn(Ab#mX6RV28=F4~56~bA=YSzhQbQ_v6|f z@99ccF6nJ~)y%w8!bryZT$}ADaRr6RHOH<@d|p+aGg;tpC7Xk})BV?x6AfQ%j$ps$ zE)X2Ez@eUT0s|xa5{5|L6#jI^15BsVCg>)f^jrN&-ZAW<4uj7s2}y|q*9DT)SU8v! zd$}B*aUGie$G4%1d1FG%1M^1i6z9sO$%&q{O!@mPyR;6jA1z#viYs3JOz z>)P!uS4qB#CZT#SZa!{S)|0ho^BKe~T4$Pt9^`X!;16d!AjY{#i}AoE#rsTWn7&#!H_%tXR|ONo*0FQbm-=Q0H}n$r2D{v|kA$VS-7NWM_G zFTBV>%g~wZt#5?$Gr5F3wb=Gf(G_O!b!f#`ZG`3nCs)TI%sJ zXWkGas!uC(I%8(m~)7(*cGlZ~mS6 zqjF(hLu%`+tskx>1VvwF7T+Q7XxAE(M?cgaqCn#pvxiKB2&o67kg znF_tDUdROrNo)wFp@2BXjohulRor?GB0QCe>p z=om2Z^w&88mEU3<+UGvK_GYTyk`tPD-8e6WaDHgrv+@8}0QV)G0|9H8-wJLJ{_35! zZpGy_0xuc$fiWuA^XC(c-6dsAE~pNU-68A3*Rt91 z+ayD;<@(Rk@^;TKVeQR+rIW_>M8e;VxAVWzv-UGT57(bKJhh+o@ARZqO6F1#LYJR; zT~t`Q^2#LJ6K(1R>q4@sQ{%Q?ncbUc!FckvG!o*tjoPICIf#Wep5bPAYPRiE_aVIo`z0%n=4@uxkhrOv{rLXGZ6*q= zESaY|R!E63@K{FIpUWYNZoCb!-1KfD!RCB%01>W_c*gV$+Lu* z>PFAM-pwuK)t0^ZJfH3C<%w$7W}1qgQm(EzzEG{}={~+=4VA@L?+Gv{oIRNL-6$$+ zXKdh-^?yECu3S{K@#gv<&K-R0Gu8cAnRFzr=Y-B&?G~&ZAiA`VE2w_i1EDzSdCT9= zlD1~PAX?qrvZV5n<)j@(S9~ii8!B%7x;XuGkIbsZ)kTm0Y+KUfd(vr+7?;n+nr~OC z%g?beGXAyuy6jgEv-sSiT#LU)54p{DeD?3c`WtJWu26Q_bWPCz-~1l)$GnOb30;R^#8_JzFO_uKK!snncnD2if|6X}0VkiuCm5Wu1dTz2GS{!RBaCa(cN()e<>16#=0e4A-}Y)*oaLP7hypEvn&Q<6HM^ zZc&N(OL*0v2WUOb`rRbP?7%3oAiF$)q1{cOVX0D8NS)gcq18|GoF)K9LqF}oEsqe14%mqpl3?rHgGB2vc{Sbe$CF38HKy=XrSBXX88fGcajjC84 z`WJP?T85i`GcgWb5$b-U(<4LfbXoCpAqM_>hqTX3sVs*6uaC(eWvbQUu#=u5Dcm5M&*u8sJT5IFmQ#&;ra0cG8dVFFr99X~(Gy;r0rwSZkf!A9hQ+TY1u?1|Ay8Uob`sholnqRR!^ zihcdUjqW+-#gwV_YY4P`lND7^__rj7nbB2zXU)20=>|t)8a4ifEi3Pq+9L2-WYW|S ztD_p-IV=IK?v0Midrp*VikdWkub3iV*!`z=7Ud7uX$)dN*xrs#$EpC}5YiIc-i_2Rmc^^A1_2 zt=+;74e^f{>IFNeEZHgOGF_F2kv-k1%koEM_RER=Geb`V>b#gPV56qUy|B_zO!dn~ z!-?!l|Cblrs>$Euu>SArCO1t?Ccyv2v`Jb`QeK?`VT&26H*;kK&bDWfkofnsBsaD5 ztKgiPZ{pUP(`?1m_CKGn?rN(E$D9iHa@L8wuAADITF#gF*i;|E86Y~D@ur2o_s?oh z1FxIcYo1=7;@!a|QaazPOwDX_Se@alhmp$O7VHiZQw@@%{VWAOD|H$!Y13I^l2zIM ztWYU{lVMHk{Po)xW-jc16|Stgg7;#Af1l)x_AM>72WB=@>Q%q+pS;p*#!TDFM*&r; zj0-d;GHzJ>rE-bXL;2+T=iPlqj5?b#EM{8oxsvjCvHnei?AS#D4#tvSIVSW8S%rO` zuA(xpx0IdrfL5krTS%m(bo0%qLMY`V@UcbBC#R&4D~Po-C!#(u@w|F6aKi*){96vW4= zW4xJb=RyX~MgQh4H(1EEfUAA0TvV8uo2qZ#X7>Av47)BB2P{rVD>kTB(E8xDf-9hY zM(&I5q9yEJ&4K3Jvw7LYPwDk$6P3IRgCPb9VF0t=9 z%w7?)*0F@WAi<5ZLGx-sn$VQs*->&l1|rXw1>6*7pE;31-*}yAr_Dq`@s>vA`&Uz& zw+q-zD_SlvMfgJ1u0*bz3OxA_bexzb*k-oXzul&1vPpW;w~~*qSx-jT=Z04aVLA-MuzzhU6vhK#ihLX zqLszB5=Nb%p!nZSjnjCG{xyioURad4dvA>~hr`5yI4ACnQagA^;DBs{ zC}+XJTMCQ$qj^>YY%EdMa!TSV+~Bof6Z^)E4BQQ}j!(>7jW)WaGcF4#tu1G~b$V|> zPfSrje*HrR@q~(LCY8maj5nROg_L>xQ+iXYwx;U!vf{?3mEPjGO#kVFfL%o-(dImp$6v!#yP?o89D;RA0%B@iPim475iWk zyjZ(jK$^+Hknw=n&Y$kg6TG=U6xXwuiha;uzDn%rMPv76ytgNu{AGVXttoJ;^D5kXi0X8c+EIMj?THk`vC~v`{EFW)zuVKGoT)_<;=Xivt{mJmm`* zxpEl`E|~4gu$F3ISM3m3exQ?e38N4LqtFL7DOH`I)uO?};{9x-GWJJ24ZvcoS44f^L7&xpQjo9T!Ed($G0)Wba=3mn$;Q-1mUevdeSt z-pUnb{5<`{uiLj}?>(wjXMJSc{c6VJx%cW{{S~yD-S9X0vE#_-eX z{;$3Fg%(y+e-e{9exJ$i!OmM@#}vZW`aa;&d$7mpnv?lWZn=jKYiCCo-4LpK_;~HQ zA4ZH~eGldK-K`6`a^ufKm38-*2R_o6_eg8sBb|GX^!`0Ekb7)o_t+%vv02??i+PW& z_C2<__t>uf-(v^4Cr)-xT;iU%)jjc;_rz=86Q6re{Qf-&kb4?r_cSE#X;|IUhP_d)O+183g@j>Q|ETHA3s8*sA~a=R#S z{xeDB?k%{WGLbjr0E>M9%NYlO>;){Y518ZL32y(u;&p*Jpx)uRl^?4=!;7v7EV*{V z*#RuG`-E;z;LT28IqM*>@E?a=0=L3M-g5_7Ci}fKuj6(W;ADHq<9>jHUyx^O0ry@D zo`rSX+a~m0PT=15;U$wH&sGEO!v+Fp8n{CYShh59Zx49IEXZ@}p1`?+7l#eF+w}x4 zJ$Nl5!EEQ0l%J?8|@HE>H#<2`7=%k+?Ey8-uhhWD%wS^OOYE^l}vQo;S! z@68py*W%|m+!Nj~3357Lc)@MR6KcT1cb-kXh}%;$q6Sf1GlOqlSF+mX{*fQ#9Y)763NRspwH0*l)RX8#2rKE7gEU-!XNfQQMD+r8m= zAU~_V{YNJKhi50SbUo1abztQ+!PU zpKjh~-l8WkH}B0^fzQl=tey$)IS#VfDSYcPU|H(-Ygzvy_Zj2OH9E-T1PgiH&!vTn>j>^_H(E`P^Brixj2_tP)NJgQHB^k~gPKT$on(a!u5pZF=;2fY!|= zCuX^3SG>7aHZAX9l&5NZKJB2HYn`}E%#74+ssVEhJA({1i@0@9 z^I3O;WpT~fIX|og8=m}u-u?GWVe zQt4Fe^HAz+te?}_bX(po&{?sn*tRPT~l)LtcBxw1?4ovy|t#V(6SotkqN_)My*e-PH$xM|^`2P#5poFc`S zeHX3I$cJ1XXQ`Sw?VrZy1vv{k^3~F_BvZxSZdw?;G%c-uVak+4t7fu_#2DCyN-uMi zJnH15xiDqg%P_BP3)0@HWXxJMGjZ0U%&eKL?;`tDPfXkSblZfbX;~+uW=9{Iw@k8c zUSDicTl4UdoxnEA_0iP@mnl)Gup9=5CRt9ab+Zddtqy8lY4n{(3b zs$MQ%Znq*>=>YRKJ1v8yRqyw++t+kFV>rNcLx&-O@8k9K{eK_#?o<}N5wi2J#P|2d z?f>8GJ?PB$|7Aq0V~}DyPfh~gh0AV+|DG&hv|O-Aq3VLO;fn>0)(QctT=i3&WuF+d zC&@hFE0UP~&n07NR>TEURTeK(CG$gbB@Z(RbTF{6d}wQ$;l#)_qk%@3a4H5J%6XH>P;Jm* zsK&q;I^*I*_O1qz=1E+?H!fkC^yZ`-i$dcx3FkU?FIPGFmy?oI8hUR{ILvVGf``)D zMGUnXCuG?ST)7n%Ov>_bV2@wa?kwjbbx|VKVDCSPlfewE{456dy;eE;%zwkkAX2Zf z*l~_xBa2U=*;Ee)7A?&)Q>I+vVl{MQ<9NWprC=moDbb*w<-wp7mB4tR+L_7arBIyG zq}ktFc#Z29F*0Z*%&uB7-%+K(bKVO@h6^#Cnv4qVb2%RK@h#z$WBA}UPvkLQ?4Nsv zK9vF?XA&9ru6fR!zLK~6&}GKYIi4Q;N*?t!Zu-&}eJ&U=2Ar9{K#AE!MTmuiAuu;2 zdBL?Oooa%+gluve+N~7lvtqmma=HFF^R3Z_Ht&D=yC_mtT?I39!#YgR~s4_ zD_#XRooiX@q4hKCs(75zL zBGYPbPJQ3iz2-U7HlHy*rrFcj#c)bRwD`aZvu_RU^_61G{EG}aH1!x7xlSa`wmsr( z*t4*aXNti3`*)i;gB#g*c8T-fHd$}_-TQLz1x7~3io-G)UT2c_Ft!yXWGcN5VC0BV z*z-t~fpy8nb`F~bJUcBqoX}qvlPSy7#J7?8tNI|m`y65z`!Up;iYT* z1}27r1C6o;N1H4rGv#YAFmYXYvgOd${WS#+3<3@e3_cI`R(Tw7skCjh6;WVdaxi0h zQr^YF;;@6Up`nknsf*D^>|(W@mSbJiVP^dV#&crFv{vnS$)NJ!&`IZ`&c2R~EdMqH znF_eH%Jp?P*m^K9F0I%5{Gl(fJ7fjZ*#&pqOwulfg)Ctbz4R=DQOsa&Fbf02epL>8 z<=I>;JPCaB<}ffAB~0L%qR&|PVv*fX%SHhq6;YNAsr>8=3`^TY8M^l|Cv0u(vUQor zS5=^pt*X!%DzTWa%B@1W+V`ZTgu_k#E2hlx zMf8M7T$7l3!l6w&uv5q>fkD*dm~>6<)hy@p61)E`*~XY~Hp@qWf!(A{Mx~%9YtEuw zf(;3?`cVfRygIXxG8b`!r`aZ zD;bz-{uS{ta~xpdG76Y=h>=02UZW$-JAOi6{T+n@SABV&1r0l-mq^LCzK~@~VBpkY zt-aP$X|z?0ad+6wS9{KX+P*w`!s?)q7fa1F82mE37$fSXcj$YR`d4;kg-@yx5?JE0 ze`OJegTAz&TkGb7p1;E_#|2%M66ZgL zZFVylYyuW?{IPl7WHh~lnW156Rs{ohLo-vsf)EV`js+Yyy|q7W+|0|sV6nP`!=S5l85rqDHB#qyUccTvQ3}X;q1$fJ2$JvyXbcmEK{yIoRK1* zxr3P}fYsExElHp)cmsn%HD~&*9YK?ro0XJ&g`9#p82EKM_7`mtPO)tMvCsF_7XQFb zF9C+nC)b!~SbWX2u;xDM{%_BrrWFi~9yXo9oU7}#*YTS$%<4MI5wXxaXJ<}^6_aoS z+k$4x10Gft3=AjcB}u3YG!eZb7v;Fh_? z^TR{=L<6?mEv@IdG-f!oGIcQIUSO6GVO!&*YNyf>Ji(CL%jt#Ti7p8bzvQh`1C*Ur z_S$Bs^oV6=rRxUGME12WfJd43lhodvdPV*UL*%oZ8!jky z>@!+D)tMorg`*^<;itD-?gsk;A>&C)nom?7o1NnG-muM9fUWs4v%f`a@D1h(HJr&m z7VgpBdtdq#H%EhB){e-U1!~$Hb(aqPt9Zh|++jBD$KDvL`ei1`hPfvi7$&UVUv%W@ zZ`VeihBTj}VKyDhy!YJSd{*_%)@FtI+vjLD6)a=D&}`dq?s?CGL=n>#;gih)>lqCg zB9g4Lt9Kt<(lAYB6OY4QuN1#oIcL61nHO?{IaGj^w}F9k0`m)%&C_Nu1l>`3zLO!f zx#83$ws5bV+iI3w4sor|{b8s1Y6s7a)!xPo!3@g33m2~{ZrJhr_?%n53L*{8zkR2k zu-IR-yP?O`*@WY|uv6}g6H8mRacD0+C=!rp!(mgf&8*x0eay)@Lg$+wG&5#2EWWg4 zR>*mITe;vH%$5rpcy2UX&S>C%u#ww_!$N?;CZgf4*T1E?*grbh*L8eO*KZIEl;(yGI;qvp^N>(-68l*L5@5_!)(Yv#z> zyiIV*YFh&aPv6eiB`epTxl+a}XFGv8c*BC@Q<`U_aE2-{Fi99s{#SjJ;e+=>X_II5 zKF2rSy5!DtrEfNaXzkHWR&BAnt(z0Vby}R1Bu{uPIJ(-K^K4JpnXFxpk`D3B;Onev z$h8V=+Tp^vLM6~)S=eRM4kL@lImd%9FvMQcVsWqtF<{8Pyx2N-PKaxG@CK$>t+qqI zRZ3!l%Uz@HIxf83#d%i6Gj@_@!P!kchvh6X>dp429EoZ@ofOf)^wpMQ#tQ#iY^!fy zk9g#mTdsSSbgN10bU?++7ZP?^7U z(JTjf)&^$F2M*6IcQRzG`uS?JeD<#3M;htfb7m+rSTJnmJYi8?Wc%nA^J?vj|ITnV z@XTNq^{Kygb*@~Y*Nw|64GpFpNgJ$vn{~KvMeo1U#^=#c&YQYeo zS`oE#u2x&v-7Sm<81|@e7+txU#cwnGk!IPD2 zKR?;B%Bk2MI1!XPC&^&pT%CAMwGg&*o02YUWbxaW^kbv{El+N*2h4NKdaf`FpJHQm zW3^$>@Az@sT{_67;laF1&D}if_w8;DE|3d2>LDA)S(tiSr}?_|j}Y#43+-k!3;*-B z33$X@_V1DUy-Aa%_ST1FJJ#NAFeS>fT;32dA#PrQ#k@wxWI_t_J_Z%_Q$o(70L4ODv?WR|L1Ke5gIhD>uq zi`mJ}=!}*tl5K7oQ)Vq-bz33Ge3H$5!_0*<*gQ4*gd=&=5?bQyo+eM@&0aaFX#s2D z&CW9c{7n+9@)E3b7Bne5kYG-1Q>@^)Xf;KB0+ZH;N3(XcnsKyEDQHo+!Jm@${6<4l zsaZ$8rseF0v<{1&tbhAD10$L<>ic>VC7N>Nx(?syEnLUx#n6eFJN{ z9Y>l5Q%@mhT7`^Uq0I3g0&5*-xh+Tw3GCmzkfXbA_P)fnKo02_Mjg=;+9E3^MbBtG zk;%5sGQH^lYx;rKz!Png*LCH_wPY%^2A+^wwy-5?!b|I!FK5(odI)gnZEf{Wte>?d zVb+0%QdNJrrkG{rO0-3Fh{nxh?aO$%^Q3gskJ*tM1kx*nVmPFm@?LDS>oE0bs;pyC zUXeL%2Wzoqll%%v2hS#D4JP>?69N;MCj4ZSJCHs#p+!-n$JC;!Rba;cX9Br1TB{aH zs70i9B(SL^H0N#XS5WMT3~2gStJ&nPP|u;Yf=N9=P~%7A;t3gA6->%M8eOM9uP!!s|V1{yo@ZB(${r?z0uA7&$;taD1+nnEXf6ROMB`e8# z+Kc+UXF+NX&C?Uwf+}Yz-RQq{BRwsG`PhM0r5R1p32Z!;Z>B6@b^O_-WYKjjFkASc z41+xD{WQ*cKc<m2cdwY3Sy#|;qD^ha)V&oS)cGfONl0-9a@OZH=L9hI ztY}idz}8!TK&*bBxJE$Nku)~XfQ~c?CQXM)$_{g%8gPI1_$<5NMRdcAsVCYNxG{^l zzihPNnRI|voj_Y(+_=i{H39H?2*#JkIf61G!kAV-Yx2q5&a+dZ%$^k{^G!dI#@Vo($-SdR z-Jv_jqlt^Z^w^E>OK*I0JD#JI&>V8{{jQI1nm!1a6|i^&FxB~UrX{>n(iFbFjY~eE z#m(T4+lpts>;nDa9P{UuZu!Qjk{NU3T}$JO`UHW@il$|L%m*$=nHc0uZxDBN_&jx8buP!R(l(}j$KMECXH)B_ z=(*65*50JKL9p$A#qsM>YME^H`JS9-=69ae=ZKRObicv4az|x41BY_gmdxs+C6WhQ zSRB7fEH!wzMI}QhE%=j)^ub7bh0NwJkHroK+Bw+jWPVaPHAO3YQ_jmzPo0xFgqC<)lW;b~nYAP365wp3XB2rHzhGyCFY?W8KeSjWZrkw%ac1*`&I%KFle`e!-PZtg*K@L@w@fm>J5wc=3*H zZiazP0+aY}-!hrB=G8yjKU0qi2&||K;y?f6*Z1{Lf=yCQJzbB=*9fv0C^T|v{SZ=i zpYe5qyTVozFCk|U#iLSwGoJd0I`cTTD*JF;YikeiSad{3JN5I`ES6MfS3%c54laTr z2`-+3|LUDp99=~Nbkc;3z1FC?hG*Z{F;Cb~Y+*}osLM7Ek$l~YK4zgBD_c}JEjPRM z8J2ww6BODd;wf~{=1NDqmq}A!4X0e>~xLv|jXmPu%#lar4 zn>vToMP3C?YH8Ul^YB8`M6W6lCO(eE7tFXGreATss!^YEMr)bK;!FLS3zNEPRV!az zTE#GJ$|=oNTV@5Vyd{w8=y`O;CXpbol_h7iR?942PreXL`Z;rpd_3mRaEbi9j*E-Tu`e4_M58js()&v-ARWRXk z%SKX2|Dv)e};4+gOa9$nd8tnlC~>q?Fpmt?sm3>=t?RYE*jq_$YO zvlM4Hcd-;LQF6S@z2&cfR*dpIGsi;_7rrtGEiq!h%%CH{C}VYd-F)4kj+qw>f|gWR ze>li(Z}ai6ymS02Nrnlgjz7NEyZoEL=Bm1zosl(Rf+G{-iNr}h%nB=dSs60cSujks zS7p4vLSn;#v!+~!co4Ocv9<*_-==XF{ zJlt}Ck>RH@2MeEzzz^4ih^qnf{%{yM)HB8WJLSp|a_fOm5)UiGf}Uj_r#StY4l(xR z@iPY;*sw*Bo#BDkl#iQ}n3Mu0XYFZJU+c7FdEdt=7c&?4iyAzUTe6W?hRuQhYR4_% zX3aB+LYrqCn-U^&d6~_#%;ezNi_degsxxr?(Wp5S!Xf7|Qy@fyfoa|>eny>&E{2NW zKF0bLi&dl@8cd#PF>-iJWA&+EY&yZhxOkPDLgq>?_6V%a9ym}uuxU!!FicmZmeG}sR#)?F$`XHY3ime zOLc7Je9Bh0j)cLr$i)M3+~V6*yYPKAF=WnbhR100V_uQCojnsh6O zDTR?^%4L!2J2H#{0$xo%4mJN&7+wjia5$J5+?yZJ5i~Jt(mJ6K>9swJ%^pl|w3{Qe zn6Dr!{B%Y8rc;Fsp}Y(MzFeZyg|=;Iv(-rwHj$rj>P!FGC!X>*X9zIAOq70h>sXxk zO-*KAjjF}<(obzfFNL06_-KxK$$ZZ#*Udr&68NNFJdZn{wfd8-O4ZiO#~6Nl3N*4Y zO!}|L@o!z_9>yoWp_VUHqqga29<4o5 zBajvUTghPw%Skncid6!OLLVr8&{q8?u;CF0i_nq$vzqyIy%9ZPO zkvX4aUhjF~X|}+@rqyIsB2ThL&Hf$rt_Q4-pS%-hG+p7Lc5>!L&+}gwSuhG19AiZMZBjR;6EX7khiI+$C2d_OQX1#qFn$-c*6s( zNhU{G1P&zFsw{XE9Dnj-$?1DumqMm77OXd8x_NDC!~=&S4hG%T|0bAE`ZmY@QI$`q zXk&qv!bH)C16mvo7JpQ>Y}`Kge5~ru28N!k3nc2_HMofy$;C z;@Tc&$94TeADASUP7e<-b-DQF?;XY0dO?evyk3+pxS;q=BhKNZe9;~!;TBN^4|7f# ze}SF;N7*zyj>$JT>|}J+ZgEghVdhL=47PFR+A}vm#)(scNoPXC_LnX#mePzp_rA|% zInQuqj;VirT?f;}$O)hRt%>(K&@Xdj@_Cc~Ow}U=tbSTGLic-uFHUt~^O0gS=x5s! z#=tW}OCVsCg9w9<$l{3s?45@k1^G^Ew#XUYcmB}7Pn0`#A(Ma~A47)R4;A^Mg!}EgR4F?R(CShU%7BuCW7HA2d`Yp1KDW@ z-!EXfezj2}<^Zd}6oV57SxXqCv|P;Q9Ab+&z^0HGBkJIra#(hcwh%r%}G+Y!SIhap;6U_h51^8Q^Xc=6Od|5ertCl7&Z@LmQZRPRQ~&ur82u-6LpRcv+ln$_iB$*?JZS&xuphdWAJq zTSOTg7;WY|U0`G=VQ@UxD6^)^F3IJKfw*eQlAUPgf7k7NCTfUWVqZxY!g{&BNxS?sIA@S-$w>e88J5zX9ZVvWu; za7r*4t!v;;Xyl&ZU~-I!(_(=cj}wQ>Vlx}&>AB2C2ClOh(-a#V6jfSyZ_G85aN;`B zz`KTlQ{kD;x`vdjX89Qh4EdNiPb@NvY2>_efcJ^oOvS_TlOlse8?1zmL`&66vpu;U zU^jg_57r}K01Na*6Nk{Unc4erQnC;Xf zoS@2WUg=wsc#&zzM8g*Uqptm|PmXB1Fw~uuY4ddE+uOMO1tYTxL($w81BC|01Bs?D z4*K7n+}P9SA3MdYqKU!c0Fz6riAH}t%O4K*371yX@CE!kbiOsr+3# z%R_Qz1f81q?aw6EjL?vEr$YF;gVxTsyLLoo#Z}LOSf(w$dL|6Zb!0eI9h6==GTupb zu)S;bRR8A*ccADdtH*&ba*oH(i)oyJe~~kPNH5XTrNHk zt34_HPo;q+K!|0*IZY7;r$|+q7Jl8gqAN`K8SAI;H>5ILZh6>k%KMMSM}rql_lPweAL zY_Ol!l2E_Pfpf60cpX~}=%VPIO}IB{a4yQYJDNV81JfghUnF6%!vI-NMk67kmg?>~Wy zsSM4Q7i1L~8m!)Sy5`2eV`LF=V9IeYyu!%7CfDf>Ba6U+9a_=y5e%IR53%lHtYcze zmFZ;`abU?%&`NM%YS4YUXa-w}$fRFS_(SjQI^@24-|JvOz7|b^y=n1GEkYYP*WKMW z<7ejKMZ0tr)EHuN>kquia^7NkfQd(b`5aY)i;S|lNp})nIj=Z$;M;944mGX`4m=ZP zYENk3T*B~uQ3KbPN5*Rycru(7e!Of-$=`F(K~Lz2_7MiIJ<=Q(a;7J~Jp1nDf=xNR zH4NX2^e?Pqkr7yFl{e$*QoYa#8Cq*Jgt;7;7e;7>tT7XDW)@D>Qpl^9_BEIkX|USI zfa(8C?SHl(7#Fj!SZ^>)_^>>{fRVkmd(|mt7Y5cfUj1&YY#A|!56#icaA5RkSe|gV z;m7N1zAMd29AqC}Zgtua9(Bih>JgbG$set*E^=C>A;9o{QWy6ThTK>4%@*j0y>QZL z$kD&2#JS}V_YF;Nmbn2Dhq-q+)N9XR&=fnxy@Ekop?TNI{DfOMP7ib(r{wQUY~ z&JG9j?Kul~wfIM_l(Wz`(`>k7RaCP@VAG~z?;FZC))!xC#WU@Ya1nH1JJML0mi5}B zh`Hg4X2b#MD~#VF7~I}GZ0K-e6nN`A;i+`}6h>wT2VV(h7L^0iDGUOlD_KMsZblr) zZH)B|IA1Qr!m7hCJNJgwe3v_C=bGMVVEm-XnQ>b_=Ae|Y%fD3zWD$+jHf&Hl zUmWnGUc_tiSAP?uDE&Y~iQJ6`{yARakc~KZp)-~FS%`!D3rDsYu2-B6Fnch_sGPRG z<*pTTz?%JvY=Q%8NP|?)Rcj}PC#M)=WSQ@Ly8Yq>;|-hFEEguJyDs$F++zCUpp-hZ z*n~&}3Nko;%^7pS5??B)(U6`Z0MQqIMtAjNxUF$t_*qqEYgpOqgH7HF0H%v#Rx- zYeD7S3WAd^dTsP^U^ck%amB%q9o?omD|0usJbIJ-f#JFH2XlX62dS{bJ@<5*`972% zW(oQs_)Dh3TcEc-&d6fxj3$|oLsvBp+@0p4`cHUC^^zvJk{xn$n%WmXuUpXMAQs84 z!XVeNBj5;=(v^mjyN*a}FtEscGZbZhpyjan=)q#|OFf5pTmHM4eraTTa4_P(1y3r& z5~-a{a}F^%#Kf#_X^5U%{otU$+sLWc=Pj9Yh-Jg%8)sJRGILef^S)joC)e}MK{=6~ zh7TQs`{p&Q-(q;jakA#lIp=>SN-}HJ7fWwKFPiG> z=NpO~u3Kn6*WPN0`>rMaR!hToEseKYmcDCQzSZ*bUCZmORg~H$@3&fWeAk-uR%@^CT3fF^(SYT!$sMcp-*>H7Uze!v@$V(aI`u!hHp*A8 z30_slA;MsAfOUn%55?VE{C{)m3pe&$W}0Ep7{Yuh#$s!|^^V2UHyuB&v2k79kDX3u zCMLI9@7`XW)N5Vi;vfI1-8KEUb7X_o&fWWVSDUS9+Qu%tXMg)veGid`Hz&QdK2-l( ztA0+ChR15J(u_&rM-OOs_!LAPinrPAepr*id*=@qtrO2>R~(eN(QXo>B(p%p_HLu- z5ywKG}VV28akbN-ItmMU=88s4mFD~74ymF^f`fQ_>obyWt2N{9d z{l%7?j^0ilhqY=}$n0U9IJ-r2ilXclmiE~K(rxvVv=%t6-P6Z*g|TWGlUBqvxjp|5 zN@v8H-f3jp)2N?lb2oaI)|x{nDw$>$^Rs9;ykv23W1V1F(!j{#u&r;N))RpT><119 zJ!FZQ^l-M87Rw}g)(K7%F7it4V}5bFrb^|3zr(GFE%*0N+;zzDazoZ@n+;4l2f{c* zm=ri#G8;5o>L)avo-V^O@u70VGqnYJ6Us$(*!=i(>Ollqn9&q+EGZd@c z<8(;qn`bT%@bIQXfa@>7RGt!JPi`gAIueG%Sc#poT-8J7+=_#hErEq zSXX)+n`%8hFLrnN$7fgTcTdlc-(SzjE@m^MAn|a!pn6zL`D}HIt$niEWox3g<{VQI zH)c&=ayN^gLBTX5i=mNqZlI;Yf>#Q148p4;1296_JPkJ!g@@Oq%{FtY_pz&@`WA;XN#h!peoSJJc9O5=S z6L7dW>^A~Y2C|pqBWZ4inJ4`B@xPw7A=35O}o z9?=auf|()=*7XSm7-=zmc%8vu_;!uv>>iC3LJaT13?J<0<LtCI{bE2BwHP@6I(Z2~1$P zR^QdU(Se1npkUd@Ei0KBEO@%umRh~~_h^%~{=v@|6#`j)_*pRt+{oo)(3@~tg5}W@ z53N5woDbG?3Z2TE-Lt~x1efww!DCBfqZboSir>JL?kb3N6& zrSn*@?9-rau}n+u8t(a+*37V%Df6E1ev2)+3vT~fX7qyZzsICW`=#yYdYmfRuBqJ= zyyeLCSF1Oki+a6QU8jvN)IiuxG}Lcq^Ml>nDi1Kk@cz2$|4xgOp@H$mvgmguv9jA8 zrgJ>I__*0(MMb?E<1VYxce~gp>}GDB^D^+v4A%2E7+L=9yJL8!dCr=I=RKMKj24!7 z8o6ayiZ8gVa9vH|<*l6ZGaS#BTP`tV;F5cO>)ZZ0fhp5=Y>I3VI+PZ9c;=40NaYy^ z+#DZIyFD{M&N=yuhTDvou*jz(fs3wd&z7^lb}TqS((J{Q4ATnd-g@&3+ZP#!i!yw; z!t!fd=$QlUHXX+f%{=v>#`K*2;)zN7r|K|#d8lx7M$FSyhMSrvcrxAASm0gudFO(& z$D@}$?(I?Aw5!=efnmM$HJ2Vkc7Iie#B;`pu__;%pH55>bLL=8lv#LaN6#Ym#T-1M zO&dDa@-}mAv3SU@s?uY-B1yEQegy;jkAP0wE9+e4G-mx}Dp(fEsTY&A=pT39muu@- zEEeS7vG&-hc4?(l=HiqMi@HsiJj7>8PAEEiD3ZbC`vI08Z<_O^=5C)?v4vv-3*YaX z4c zBvrz-f+a3bvD4ipX%d?xo2pVHo8&EFk%{#IEvm1Ry1k`ZBo}NrtE=J28DP+?vaRFD zKV^-Lo_lT_68vK0VeB@Mw=3w7nfTNe<+P2K(Kno=Hy0dn*zCyd;jl%Ljgw7PY-6*T z$`p~=#+fPwg%fgm7D=8vknVR;GUVozMy4zSSJR$@?A$&Md^w+eDt0~JmM?T6tz|Yx z>Z(cgr~9^@X5@2t!1QmLHU~q8FOS5%Ne=GE*2blaGS!^lc1B~i(cVC&cg+i8L<>&* z;OXsIdicCyMeB08-gG8ene-_2pa?att7VxLDKTP!EN!=rig{`r66#85Da}%r?$>Y< zn)IN#Ht5hM&mWBZY+BP@|11z=cRVa8@rvX0Cj}wl`kAeQeG^&~MH0*BWF5}yHeiv> zVis{ua2EX6_kdZmq(scigGsopp>1y9LeA_TZ}{81IhAA*Ih`X8eUd3;QD#ZxaMx%O zX*1_F`*UEEb3==F_ks>JnT314ro7=_y|JC=4rB67k5(Cz3t@W>Y^uIrecSO-!@(X$ z1!imJpt$}k^{0QZD$HO|Xy`Lru-djG+x+T=29|v;3EPjgxH+$KV-xy*%<*GR-?hL7 zhF8nAO!yoQ)NWO9W%$t6{6Ud{|G*3jX3uj;cN#4+dS2J&Uq4sQ7sQ!;pxZd@U{B^9 zB~D+5^BNm&2fLm4Aa*R(%}j|Gnw1urB_$VvFZ-d8_^!#M3?PtKJlj-EB# zDs>+?(oL9oZEwh`mi;qe@v=B9XuD#q$rOfGeeXr=dDqxP%MP?ycsFt!=4R8Kv+=UL zg{8FJTSk>{HP^1X9g?(}l4wx(pxM-*S!}kOkw$MIkB8cFiFHf3SA(R`Jila8p=1cu%hUT4qA zK8fNy(5(6FLF23`t<1|Bu9wsot;QMB6P!U~HQj!Buyd~6YcT1!}Fhu>c(=sMwr zi-uv#wXA%p42?r3a%)*SvYjX0N;o2*7Jc%{DON5|i8z&p2~p919_-yyU(6<=;x|3V z}jsI9QB~rMYBNA0+6%^!p9G2{~^H8^6`Ap?Tr1Z8I z2mj}NWVTLk=JJ#Kah1L2^$Mlp>x*wWGchDE?0mWGhJ-d7Q{K!uCXXceg*12>m;^T6 zUZBEI6n)_Ml8+6)Rk)7{dmeT0YOZJS;anhemeYY*K4R^R5SDjh@6O0|J;|0Xf6wRW zHD|r-4##!b&J$KMoLzlpQ^cD4+Rww(J4F^4yxv(N#^n=mh`(z>rmD|F1<~nELS<}R zhL=@^Y%3C9D@vBSOS?#QXEeR8{cvNa#bS{4h7*6gi|aQv zCeeEdOa=`6d@H5CFhs0+D3Y*D<=1x|(lmHnB!H4M3F@b-!>_7W}H`$b8K7U@KYo4`?E!o zT?@Dt<(=en`k|J@Th}0{ktj0D;m@@GXC+#ks~n_r@_sGoe^ikmsPd3sb>a3y{$E!- zV3$f1aZs%1ocG{`O{P*?B8SAoMQsPp1n}}s{UBs$C~RsN81ToZKkG zepqbL1eF;NIoi1OmpousNfcRefIX@IQB}gSc?URBIz(y~aJeON^&R;Bu1TW&0bf7g zvWf*<8j0m1D>;O?xT+j}K0EYm*@F4=vMU(Y@_Hx=O*z2X=036QfnZvqm`Y;nk_VFP zoLk%+h2|x&uj&8epeP%j?D{)aCH^*?F1DP3pCu)cGF?pU+Z~c_{Yp>mjjO z2RJ4%@JcXpDdJ zc7P+pZ&6z#rwXHnYO#@~@atPb?0lU1Iq zF`E0?a^dBc97bL(b*YO952qOLFRm}P-nrR&Z?KHxL-u{2tWR#XIs4gW=5k2~MyZRN zZSQ{mXZz6D?rE{z%guIgKihpYw*Oje|8ukb-^((a7hW@3BBAt5VGX0?8b#>|ijrDS z9F$cgC8ik6W0c(T&|$5kQ)8lJOn~0DL`j=3PRz`rE{V+lH@o z{UL#X1p;x7tbY;=OB9{>lLTTKoa9-!vlv`h5Az2c5KY)3z@jX5E`euCh}bJ9u_;qn zSsV@SF@$=(a9R7s>n#)itVd2l9GVPA1nd$7ViZ|6I2e{Fva&U*{A*yTC^1Ysz}jG9 z@P~mVW}$%B0T0GxX_keoHjZL;iIT4#N&cBq&w9?mV3nh&nA7?VC4rKnt|FyhZ%xwo zYvuDeB;>^)nDoz)C2NYxqc8e#jVw%#zU~WrMU&aW76ku)#P6ga#-qr>qiC=wk%!Av zZ(E`>Z%EklMPXl=_*XRt)?W2m>d0($fJ1kI*UKbPEry7HheF+4rQ;5=Mkz`rF!*m> zD7t~6o-O78Thu{?HH-p$2L)0X*q9hSq7SmgG_Y|!bc$ZcmcYOgwty{*fm`AWzuN-Q zbqdkR2OXFh*%A)$-@3xj^H4PB0V@Ne`}0S>`X-VL2lRAsAWO^xt^@^^tSeFJ3@kAW>^Tp(o|&?QJYd~$fF*&!<@Gl% z21eGH2FJArS?l+hvE?YRtUI75U?!P$faQaUSl9v9e+$?=9`J8bl#~*8(N$zo+2*uT z%pk>4;9Cig&2?d`55gx76rXJHS7(wAn-+bNp@j7zkDX%Lc?K`mM4mGXnE8|V3#Ro5 zG|Z`)rn1UW_h;BJ3 z)fJ_Ek5JRZ?Bj1S+*?bNpZ9T{q(%`<4fmP!Qzf(f=Rz`Neh7k6{ z!ZF)eBNn8bU65vcUMi=)Tq&e1jF(9wV7iLkLe`{k>7=~hX;IHe(?QR(CMwjB;>%H zldCsrp(szHfX9M@wT!Ge4;11U*tQ%LW%;2HrO5K(OR#gP5>q2f$-#OBE=3l*Yy2Ju z1fmZ1crNhyFXqR4Na)yBJ%I`~ABNhMW~?dy8boyt#yK~L&bi8R%0x1Nfn6k7(kV>X8WHGTcoRm0)-$^XWyyfHp*6bKLDULTi{F%n&{t`cEW(ndhUBD-ZN8IPaK32aIxk|76H)!&wKkKQVf^&sT)B8ekE6&5)z_S{+8m?*vG zU}|VZsXCK{O(UyalysW7#G;3iixj0EeGysl-Pc1z<9z}j+i%BjDW7Mw&zSAZP$6X) zbJW+!h5r>p+@8xbKRfYrENBT~yrGsRx@)KRqA9N2SH z`pv83dQWDn1pVTfB(gvA2T#zffb$EOEr0QNY-43P*tkY<>DdRR=M%&;3d&b2Do3Ol zS+^eIV4XJSRsELQ>%uIpw%mu8yIUKo-LbxVbeV1QZ1%+x9ZLFfjNC~F_+u0W4*k0& z^^ZZYXv(~`rfeG?B&#b)GA(3FJHWqeo2W!s&H4uSwF?Cb9N01r#9L|$7>Vn1HO^yy z$n~i->2CuY%k-$NjiL?-wObxjo0tg3Qcl(XraflVP2*1TE*k0vic#6Oq(*| zUMMhD+>kJ7VA!`^{ksEi{egE(j~GI}G4ORciW&u2`7tpnIPh&@5q+>gXcZ&Bf&-(< z0>)lPzJFp2j7kjrNssx=>==w1j4wQ4+HjpI>$u3H10p>Sd6gLSe3(RM)iEYW={9V8 zrt7dw{g6hB<706LMhgYbuc@b&Hu4qyPwJ;HwZ5?U7@&a)|7H$SZQdeAymL9(e{U2i2rS{4e%By=^PJ*-_|}!WQud zjH`;B7O62lc(8J#o|u&_%eCKnPa2+E*9H1G@(C?ir}ju>-@Ui>LPr@A@|YS*)fkRt zq|6Ff=)PsUN1Ijo##BBZ<~ITll5OhG=%_6yf0!VxaeyIfe%`mYA_w{yB^06>Ty5_; z*b6Y|&3ne=qwJw~;Gcw!!XM|wos!3xgcg*DD4Dq(5e}&?Ue%d!scw0wfAX&7N-LH~ z2_^kK*w@MEG}|GOPrySsg4c;5n29xxp<($#vtTYJod|&g2UoToRbpr`Xmn`k5ZYRQ zQc{7Tp^;H=Q|9Vzjtq<(oD2~w!i<)mn`=}3>kp^N3;$q25seKEUMnumKWe0NVS~x4 zD=R}vrMx~anh+GSyeIVUDv@)|+$+7rE-Uk_xwSQ?d6`w~$G(-DZt1YhXkhS<>?-OB zz5G~#F*di_&TU7qt|$vbfz&-lgM-;x+|^t5)`uE6zSFQS-ZFb4n93_V9C}@27~1fKTfmK zWY}@p;2}fXF|CLbTYaaxPnyQ5pfI;!;gR+yy_IVohx;{LT*H`hATx`}dGl%&gE-gg zvWyxVyiDs?=(xE@bLn}6njSSdt`Knbfk_V0kfd z@nq|Lj0_>xw$mL7Z`r80J5N>Eo?^(NvSFsf`BKdbnoKVB4vC&?BO~uIEs?#vOwP=7 z3Kt{q0``MtLVvHhJ6E$9s5r^7YzQ<}es}!wKR^Dj-zH7uoom!EM=`D|bJ?uCQ<=-> z)$MxF;gHAKu+(~H*kZHef(8;=Qzv~};dk|i#SQ0+rY7tR;wCAx=JTHX7&!ZY)`dIC zvLC+4%-(V9`h=d7g-7b=bTceic~+CrWy9pHr-YWh_N&aBt-g^%^N7aECmYo-&SY|Z zu-bnkS4&sr*`>=>SA4tIoxktbyVL8Jb+0?VX3en~Z0V{@Got1(rJCJjY~lDB@n{Xx zm26!W5xZ>;CPJn=UvIK7tCrftkfU%hSvH*ez-DIE2@b`tmR07?7Lr`du)3ZpaHW#d zu?3S3Fo`^?ytm_(tLLP$)gCEPY)pTbHJ<7F#P(?$pX2rXt6}lI|4Oe#Rj<0RB4%31 zSy@?|3k;0P{;y`athBgrz>sO_qK52p2aDGXC6bd5^b76ma+tZS_K!A0zQ>f;CvV;0 ztnfR(RO-pxV{31!IkHcAd1p&p-0l?5vih&b-mO@k!qCWMnrbs)UX4_M-Y#vW1P8XP z6(5gDUrSV&pqb{sq5ZPz-qpVA#HP4BeGtv>54vA2e$OHmrZq{X;w%mhED|9FWj&eB z-3_<5_P>x?Tsl3%hso@*X5GyGzj}e$ho*}a^ccox?o94m?X|+?xJ!20pR4=U2d~Ro zbEAH<+1Z5*j1>;-Rv%VvpZQ!tzmeh9KNi8p7JpUd6$@B1#TOstNMLF{dD8iZz(0$n zOV`()&|b*t-*HI9NP~%AWtK|=tMvDYJ_=JgBu)B8zeX_bi5{flKrr1$sq@>q6sZBOIFO7F3Ta(5LmM! zZtI#K+gMWc)vsCz&f2FgFl+0EGG>AB$2{pm2NiicuW3*5i&GOwj`ho0p}{b7iK}kz z%Xf(>i<%jhEverhqSC;~Bht1<;M4jxABCnlA1_|4E9yD=CZjySdnvEOb#Emy=*k;%t9BgW;-9QBUYzHgw}g#3M8!cm-d{@@yJE& z=x5U-B04K4Gi;h+pXIAwtopN8&cLDJDn|-a$F20G8c)1gGJK@#udO(6M2NG&AyZlU zU*i=2B2)hc$FBMFYC7F*s?JVXRkBnk*4yB&$3D-zEA|CJ!H*iI9agQ?oVz8@ z1gky5Qw}7>tUFe*BfIlW*g2Q^W7` zd`HlJyCge9frHZWAFIsvoT%S7!7bC>BzpxD>*Y&(K=;dCjd2sy+;Z=OBO{Z<;<+1+ zPAn>NW9Agn)ZQG%z=$NG;O(IM*Y0(G{*q6ci(k*#>FV5(D{nRh@DY^fv+Ir02^1qrr;R=#>qacOl$`jZBh~# zI6f#IiPN}uL(zeu=W@Ex^U9FwKH)9DgmZT>7~K1GY#}4x0vWB;lftfy4h(X!uJ?=_ z*e5tBWITQN!G%qrf%}3Zlh6;}WY$Ub*H|(Rm@zc0eamqnmb)XZ->m5#+l7#xqdpFN zWsV07H*-Hx;Ev2bzTiO5h48rkuz!zvl@uHJLKqvr2C}S_y_h^pM2Vq$$JR*#FA_{2 zB$%lmbWE%A@b&!Az_3injj_kNm1#nhkmZx3^SEZDYpG0_#FTMBLbie7>5BynpVl-n z*2^elcs^@r;0Vy0%E7_l9W=3#W5TjiM$EMU8_pv9t=CREC9mnnYK27MZd7`4f^Q3>@rzxvzp6cZ9JRQ&XdB*9QXC~`+ zp3U$3JSTh3oqDVHJI{Nc<1y(`Qok9|ta8PuOUpo6efx?g-BnJU8fTbv&Msh5t~fV& z760GoG4FSI$vU<~KS>d>zws+v<|FgQ=_(?&2D?Kp2(-91w2E0XtV-^t$H# zZ-vblTeM!ZaQPqD6?9=;S!d57_Pl;BJ*A608&aBug5$aL+BVde@6WFLd|djdfR_Hm zXdXo&`;%;%QWx7?uPjp8R&YdV#e{EdcbJ5_J)Cb>8*zE+WPba1Z_80-8Ntp(4;AUf z5iZhF6D#JWFbnk+wA^l28i1ay?@6)WeLIBMw7#W3-b4Vwe0`* zCBBQx*T6)1Qo;9mHI%N}ZcF6w$~eTIw4S#wfyMIzi}L~I-f*Gr3(O1L zS=|LHCoEv`+`zo#y1D+vOpILa z6Idj7FyCFyyG@`mAb`cMf%}#MucSuV;SWt8m)ALJv~V|ZyD)HCKICz)U%=sD$h&<* z)7b+oJ`aSZJYeqI(9|tZz4Zfg*M_D^1=Ti%-1ZyTm;`y84cerq@^1dX{I5?z@LU16 zo*|Dr1M5iWPpNTHRfvEtSSHn)QEl=cSI z#HM>sI2vvUY}?RgX~=uHfji&;OT`P}5QQdQM^2jqjkf~0Z4Wd~`oO$;Id9^P+HDt@ z`xJQ3J>UtNz#?*}C&+;1=k(4WMgI3Yiq1`7@s1F>`GF-Up@R1zPtO7t?}GYeGwON0 z9awoccCA<;(=FaD==!X|%6pMxSW2$W7RqX5o9go(ivXb|ZMU#N$#9Iy% z=W_JkGT^d3z_HnYYl#8(xgS057nnUKG;4Eesjn11xE|_31 z*ea3KynF_Wb_e%&^|I^_%!i)y1Z-e-(i8xl({-bByTycC4t>^~GkrF&1X!{jp3yGw zlevD$^H%5Syg33acf;G#BZST+)Gr8N33!lOv{UodREwu#j4Ta7!5i5H76h(Y8NTHM z^KlKq!~X(Uj5tI>9x(4`XSGY{y7izn^Z|zt!wmhO%mEKL{3ozDG|V{vgW38*$B`Et z*$0?|K5)o%^f^D^=)b^X+c49*k-Pr`ho=Ec_XCc4@9X{NG)J?oPz1R8#!Dr%&>3d=3T+k z^?@Vgf$z-=9ACC`ELLDWw48UMKx4K6chH9tyTB43hN?9ySOQP5cpYHVdpJdX2S;}U zTbnqSU%}$Q`WGzz=G^`Z%C>)CS)w4Y_yS9_1$Rh6&!r0-eiK+cAF#+oaQklH(3{BH zb%8}sbD_+lY2r)^|0SOaO68cttH|qJu)y&l%)=Nj4%>|Jtl{adwID3J|d($i{iRl@;MAGXg=35r}@7Tu9_e*Fp zmwxpE_Geqn7tIpWXVmdkHvZlwHciW8`vH#U<+VKp)7EtrmperGO=5he!o}dgxNL!d z#-g;_8yE!w^o|+CPhZAxdI|5v1&k~cgg6b@3j&2%7BF~wF5;ubEYu- zZsb~CwM=iJ_t#MC%{MpbzTOnCs4RKg`m?g~^@D=FVKVQn7(VU_Jj|lGb3#1>U%{&L zf_{rbg1>&=A8ik$v;m5dN)O zQnR-?8Tx1?@$fD%f26WmT-z(3b-ms}|GI0r#}at#R`VWGaN#OVV@P1-b&O*Az-Cgm zEj(G_%`)Cq7uahJ)(SClZ(P8;>jPK4lOVU0lHkb?T-QGEY-rdyr;)wbfIZD5r66_X z&4QrZ9}H{a6h@my`OwSm6bI)nm?_$1x zU&5{(D{b49Y)5NzoY~MBx{^ky%An0oXE)fKx$ss zo>GeCNLRK;I&-9WcTLqtq(k^iM-bqa9i4N zC_dm?%fJ-HXcKT-?8XD`3k4c1K`_ z!?7a{JbM?&Wc=a2aezCffRpJXccR1oU2BdqZREUhhI_k@=bFrVZJ~qPA1ABxZG5o-!|A2kz8s0Sq%qIl6jW2MWZ#}}z#2Y)|tnEea*$lk11+1poH|o#WVjDFlsPdt zC?y&+?P^=Yd%S_cSw--no2?~tTvD`9%N@O6HTqW#*z*P0r3@JK=P)Sm5w>(-(n?@% zNMO=Gu=nH#_PPcpy@ZRmAGkjG#YE|_Gy@zNXtk+~CC_bCY0UwFVe zQ{dA5I|6$*u*Tgv6X(EF^oBd8;pVLioG}-;RULWb1lX7^UfRpRyDC=b&y&!iOlz&# z_60$kuly6z=d!*kY_oOtQAzQF*$0dmcO@I$e7OD62ZqPW*M1AxZ4mW8a9Y?bfa&pS z-o^)~gczCiHi+bZxM;bMi@Sm0{@=Tko(b3I^03{InXVCg%=$0ujytSpVs4t;6__=F z)tiTH&IP3#A5I^czCvo}^~&j!}H8!r3qITE*l(>sW_#31e28ttP2yhnatIV;4# z!N9oafx_Vu#-dkQHq{o)6Bw!=K>DNEGV_nF+SVv&30MjO)K;s41y*{$3ZWZ37$mRKtb9q9RmEh6o0mr*|MSAAm z+jD_+&jQ{FzBic+FTb1n^xvKX`;sQGGT9yfl6ySn!42Mr+{=75`%90M#YA)neUUblWaw^vbY5oV>zbwg`RR2VZ{i37>6XU7{d)OEl z`M#)_oYQ}}_*(m3Vbcvvc5k>81CH<(-WB^Re5-dKM}%l7+IQNT@n*sWfg=a@?VG?E_u)wRo@2a%Z1D?ZCfHt@#+A8<`OwVC zT=^T=k1k;3ZD8;)%ux=i*T34pE;xZ9|JllF1;$BF-flH!}0?+q1oV~OsaNC|UU3Ua@C-Ke|cpx!}_re42lQGBkeqfC& zIDO&6*INg;BMTnfUU0fJj;D?9wWsyf88<%HUtjXl;@nHCL}vL1OokhnG(Wt*mB8WV z&!qBzNk3qxL*SE@cA|3yK9%yYW%8Yiy6{0c{&>s+*4PKER%`b=|Jxgwaffw9{w=*m z&c)|hXD*Oglz%*-;i+}*Z`Qo~Hw~UAPB=4tgUS+ChP=parNKWs{e4*uS{U5~#g#AHDxOZ~xtdgWS^#IA;_b=bV@;$|9sEXokzYp|Ae z?Nf=o^u!Z!y_{B{phtiX?0UJ&&;1wJ*MApz@HoKFcdBVv#Ot4KjT;vPE?u>zO^b5Euek@^QU=UkV6m#=a>Y128-wFZ8<_&$-3N8%{>`&!&Y6_RlVqiSf znl-atSKL`N`djXuz=MxY&bs|Q|H1a&n_`h?e{7qws#wZg?#|ER7Z;cMFOR$XtMtvy zt@+RI-Thtu;o;GK_4s>xuHWF@oUVM&u0Wm zu8qqkI7}(-IpDa)P-Q|2-yvltE@!I~GkCNnBs9hFWj(Fuk0|-MSoF*UPL`RIbQ%TJ zS!81_F0fTuP|&ye%IWuRGQ}?5d<<3wSq!`nE<9e45>TKxQ{1QHgHd)!grcOR$3KUQ z3xXe1G&h*b7^&%5Jh6DTz`@Jl$Rz%M5o-?g=`c1PnYbp>@yzTsg^aB!IUEnCHv2Rx z_p#_r=$h_rRmgFn-oR+1hr5e#=oIx(y&H!WttPzkU=?4}+30uX&YCT3s@6tsjJz^d zY>bz!q*z$IqZkz@9GVo!*lyyyVaXDQ4G~6a5+NJdxP_7m-)~(}_0fsjV8Z2Pll2a9 zEaui<5cwrCW3eiyXz(i2RD;~US7#M0lP{#{D@7YFnHoL0(RFsXPW{2l3sZCqTSP_H zRz98C7Z-U+D*Q?*hh+T3i{F*R6D}NM6A}4ia++JP!+D95N5;{q0$hbBW`*f|ys8j; z%~V4&{9nlF?a4~Nx3Z+v7D2O&)2-G{X%kZBNxFz1PIPc&75S6#f?qhs@&tdq=!Y%O zxP*fo8rw9vBNYY2{S+9vb4vmnE1LQKAD+73k%N(Sf9m#@7VTehake@S`sSY4mFm#Q zBChAw#wK#7ZePK_!mSr$4rVo^YD!D{K3c*Zcc36jC1cl)BZ@Xm6B_K+u?95U^<>ow zSjet3Q8!!F(M>U?k!LC=Pm#PwqhehB#MKYdUb-lKb4MSUXng#S=v*>qci%PE05LP3e8 ze%j%=sy^&Y4mR&p+?;251}L&STx#Si`f$W^!NbyvJ_ z`IVLe5$8lzH0C%;9aGB{;bimK=*HDEv$tWZVS(n!Huhf;LUuL|^MA`kdu}T1)VDZY zr*zUyVpgi@n%JO)+-v;|g*KeD^3YP9wxN+H;lnl##X?Ws`++>%^Mp1fOKw5GPaWHmYA$m8*WX&H}G7;~^=OPphq$c2Wb znlGlBu{koCWhF1WRdI}qr7UD`peXD8ev@i(4EDIKWnB#dkMl$(j1LNz0!p2pl*(#qBKT)#e>c z0@@soSz8KO#ed|nhVMAUJ&%J)`iJ9|x(jJ0u|)>$BF>4Hx{P9OuiFnPGP9aF9OHau z=_k?ijbFQJ)iIez>?@Q6OQpRT!*w5qMl^g?kWqat5V|v{`Om@D;#G|&eJ#$cZoDh z>^Q(`$nk1^Y{h!#ppR`{C&Et!$8jf$t`L%#vp{scfijnqXH)Mz&AG~_Z}22&x(Q8i zh*jfgln<%A==4HKY@LLjnAOvSfKIOEnx4nFv{rD(ZfVL`>#>=Ix2e@~pObjPoevT2 zLCpd!4TsnYSF*+mDw=N8+*yC?&mt*i$LA%}zV5vD>ND3r0}iRzh5g@Hx;7q**2&Fb z7LMd#R?j)hEq#`e!GB@V`r5sszv3zv)dw^3t_}?N8BGtwPsH3zjo+MJszf^-2G>?QM*+$!wK24aYj!`bS*i zJqlGxE{wBR=x$6o<5_V*c;U*Osc)Qj2b8PKIJo`j?`tbHUMoF$>vVMIh1MpC6g3u) zqw8(|eVn(XiJ`=Ri^;}wQcBKEsq;H#>~#6V_4UZ2r0HcII&HIi42ry;Y2Ck35N*_B z<2*z4Q`XUG)=kCI-0MWwocL*6b9>^HRS`$(*WD;`ezJ5{rRsap==;AWB^7GNE_fjt zwB;Db($nvDY>LvlP%zE0<0AKt<9FSzMjT+;z*@BD`CpY|8f}H^rikxSS@8JQNjHOk zd;x5>>6$Oo7e;XPJrOlk)z}rccb$nsoP=$J0^`H0)z59;Pq0;BVB+>z5Xi*P$i?x( zO1R5`;YhvgbWR>S-5P1fAEzeubnjAN(=%XH5aX}n;#Jt4Zg`AU$6(2M_5Yub?Qov% zm-yKJl%vOul|iyEF32~BJmxE%z%2VNZ(8^t$IkT1Hbs};FQ=?w;wxRj{9x+;x*yN~ ze*d_<{_orV6+iFC|Ns5G{{P?q^$a`?j4}>PIu6V>4lF(n^{g=tY&j0>H4Yp-4xDow zxYjsu?{VNcocZS{d&g1kjidY@M+F`yMHwe09VcZQClwzj)fgwW94GY}CygE_%{fk5Yn-(A zIO&{m(!JxP_r^(B|BsUakF%kSvyqOov5m8dkF)9I$W8x-@>WsXl=(Png_+jfI~k&1iBik3u!4yyu&o6*M$r?7Db*d|vna4vAK z3SnjAU~TSbW~>mgsZ()J?r5;qU^Cs&-L%9#@Bsr?M}yskV{LDaW=ZsQo$=_smLX&CM+$A|fpyAxqX=&-{>6tuv@|-zymMmGaX3d(-n?bkZHXfhca$;KhsTtj;XHPggf6}={ z(=IHXadG*a%c~Y%UAN@=#^pD*th~8xZSd`#o9^!22EN;N_rs(6ADuXITMBeR}rn%ga~a-a@XS{qp6@=U-o^+h1e0 zuV??)kki!M(%RPE(b?7A)7#fSVdA98Q>IRvK4a#r*>mR3o4;V;qQy&=E?d50<*LVdJLFTefc7zGLUE-Fx=#+kfETp~FXxZb){t=Hsz)%sh7C;-$-1u3o#oD2$Jd zk>MT#BVY23Cr_U}fAR9w(g;50`ycM{oPYiG+xH(oe;u%|XZy&&D)Xg6f#CpiOwxx-x`&hzKMIDxXk_m549ZzF)weIy)SfHPlka-@kuwGoka> zTZdGa*8OW!p9b(u)4uh9*I~io_e*y&aLkFn`uHx>trtH8W-%>U(%4!Z-qA9V$xeXj zmif_E^@n*4o=3x!_~VYA;%6zbIFR;VAt7GXdWHE6ExQ<#*|wTh%?u553<_>D$p2&R z<7@75lw;tzlH|(FQDOdY!rmBhhx)v(n16+V3@RI&SeeY4lo@(iu1xI|UC5ZwP_!)J zr?21Fij@mB>>R%NGnkxPE>PETmdRzBhmhuTz2qN5trG8iuQ@YwnG`5W+rD9VZ1Gp*f`Vd_je&-AX2?Zmf%*!* zNvrsHUu@7++<35g@oIYxOHMJzC%3c|LrqqO&VLcgxOz?dl8p^(xBN56o@8UN-~hAw zJAvg2;cpfka5WDrR9ITK%#e+lWyi9+q7D|nJr?=13bJf$iE*4)SA1>u>4N(L1xZRT z84I!%lfM)kaNS`VlvGw}B`}NOKT}Rbc~?jM!o!PM{)s%j#&DiX=m?`qV{`}eKcS?f zOsuV!vjjLBEE<-#vM?$IHir~WW?b&}Nty93%L0e9Z6|iCN+*42aA0ILIZ%9h&C2D> znR&Is4O7GJgdEs6S+hql+Ua7n$K`u#B0A!@dzx8uGZ_{#q!|A_kEdWbc{V)JmFZt^6lY z!6Cq^YT&^iX;%01I?F*}2S=WO)a~Xqn?5d{dCqeZ8-JRT`}X16%Xe3pNGC_I z^fR!w#+ti5&S2iHWN&lpj$cXb-ZfESLWkx&Ztu9r&`~d-*Tm}oFF4V=;zZ{aNr|gf z%l9jGu-(b?5LlcoQ?+kS4?p4QYSA8Rq}t zNw{isYPM64hQDCT-S|G5=p{r%ve84DTa^MxuazlZ}0)g-oL9@9&E~)2W zNDsckm%vgWrr^@bz;WXYGk;=hH_wCeSKi6aH8YNSvLx2^G9N17nqV06_NZ%8fdd1_ zhGxSD+zk3!F8mHH=FTF5a%qA`Hti6#U)NhGV5QM5F)g)0K4eL~&61r9t1A9|;923| zGcl0qL|Ot{r^y;VIgTAn{uLD*M=X71nhso-+-hOt$E2&ZB&C_n*TU=f!mg$d5e})B z1dgeOt`7@xoUgb4qT5Ff1G$TeaewT#OCJ2vP{HRhL2{}l$DcDny$@_$+gdU>D_JM2 zGYdG27C6oJ_?M>7WpTQ&e%CRHeN)>bY#zwzIIf)c>I-+!l8sF>#TGO$Eb+6kzI5l~ zKEsC7jETn6tCMY*8W?g{F7N9qNK6pBz`H|dwYF{Y9P?>r9P%~Iop-1ByO;~Bck;bw zu%0o`eO{~3<%uGp=X=g9ko(o!rr8&*ANQd(Yv;$wDro4<9ld`?GQVbwP(Y zQ%ZxJ{+KfIK5!IGV^?CGptkXW#*)B#&E*s7xA|M2*LkgQEo4Ca z(_XxvQ6Rju>guDWM|}?juBrUvV0f_OovhuDgXXKYGv}GUTb6X{{Jsy@V;FW`lAg*s zt#q@+`I%x(%V+mUZs#&sp>b&Ogcnbh6u(WH z|JU(5EC=IxVQ8-B(nl68>|;`V*`TQyQ3Sas% zbFuZ(%&9#xty2scrtfBY%=Tce%>11KQgb%XmkYc9`|DffmI&X6Z>&`lCh7CC^|XIX z>hxep)MU{7^Q6Z-w)1M0^TNpvdh;^3+6stnWmo#^R-t;vZq*IrO)keytUP6%we}5% zY15XK>5e4~t4t#5cdxU0`r?H*|GIx%3A65T-_1@w#{1+$7vnWspYsZnz1KZW4_?-C zeCvzdLg%{p66{0*6=hb>d$mw}$sta)WFww?P9GT73P>>v9J{`CR)^%pTajYy)hA!p z`8zG(UdFOh)LZ+CSVAJ_io4UI|M2pshhAK2{MZ!3b=Qd= zdw47K{F0f9Q)aEd5D>EDXY2|a0YjM{&6S(~o!g~+tm~^=$U@`IZ=XLllZw*jxpeIJ zBg=DzzkSoRi+dIyRu+*vE0Z3wf6tQ6U>Q08lE}mAlb7Bz zTFiA{w4unA=Z(x<)(1BwE84f7`|VmFE0c1~&+&E8<8?}loLbo9?uVRvS~UN=$*!o^ zo9a0a-q{iV=LsKI?2~-WvR8+h%|kypIx@b#nQcE~p+soQtI6KSx@GRJpJLmxRsVR* zodfxQvUX0(G%(|M^693)auJW#2Pw6oig95jJg%lcK6*5Na8I6+D(F;vW|A`Z1h0Ug z_$r}-z1th3i=|$MbJUw^F@I0Ke67?b+_|ZsX^CQeu*MAK$&VA~r&kvJOHW?jRPMhe z?AmdExkm4g1`OAe{Qf89);{ISy2qXrAFOyL zz39slS^mu}%3_CI>NN@v<{tYRXmP%2nAMFEF2TlKOe1-eH^a&$hZ(OS2rp`oC*YY{I>SsuQW5E0ls?onZUtZrU|1y4|5; z@{EiYVS7o7py?6epH(~BJ`@`Ku#+#+eSN%P`SfN6XStx4=^HnPU6&~I`y$S^lcV8r zJdc{&w}ZukZ4HGkt`j!4G$o{YTloFwsP9d-kW!t%zr06YQldoMs<1viD1GOoIm-fl zIdvk1{#EL^^hh7m6t4e&x$1F3W}w z2EGvoEaEoHPM$es&0?9D;s)1xPdf*W8Ij?Yx;t8Xgc~KxoGLGw?^qF7f09jkM#^JF zsTifS-P32h-`cA1(=1ZcOz5iQsCSv4ovfz%TwU~2-Tv)U>puC|sfGkytdDbG zwFzo=yOJ4Neq>tHzXaBv!znjD@v#WVBr61Oa_2BI^^G|^_rT{uw-ZTrPbO8F*=)Wv z`QC%X?4yfkKU~aqD`a&$$G1#9v+EZ34o2jqa}*!!z292=*u;QUKxTz$ZxVxQ!k50F zQ^K4H@_H=`?@w(vG`3&--S+iOBX3ce3(55iF%M<4Lp|!BlXoH6)tzWW&UV8K-iZULM?Vpl+WU<)nAXm-=^|uymkUQvzavyjAch}SX>QW!m@>ff!#^dEUEc{ucLt5rHTGC)#n8isql); zXY6;a1a7!$PWgjjwoPgQ=T>OGn5@GFxd(`JT*S&~Igq8EAj9;ill zu9CZ`k@+(kunWY)O)+gHBqU8^1*Enr!|e6nix zms|NM*7;GEVQ!lM7TWzvrqMT#qKaLYqeH{-3e*eXzH-#Zgf$b89fJ$H` z#{p*E2lD&}gXJ4}WDgpIImq!&P-xrD5V)`{?&XSCUjpM;Q@kA++F3Pt1*Bv)bNnz8 z3O~TS(2+rBcf4UB!`m*wtB0Yh7} z5UZi;^1}@3L2CDp8|8Y|hiNZSjXQWy&hVgJfoBAV>&Aaqc^3uw^Ixd4EM~A-a6mNB z=y!CN*%Ich#td`4TR(cZTzppaVvz{kL%ZOG;&W2jQXz`lV&s*xk&0khQu27ZO84^D1Y8&2{woR~a8msdeRvUuk5 zMZD}E6rBrQzX;Yud|+OE=Tzv2Q}vxPr@1fi_%NSr`($c=fMMDmhJSVoWbWK%n4@#@ z>?4Nmnur&IEUVWrcl?=juwBdH0t06Q1NQ-Dn`WMkYZy2;Fz|mkQxbE2^#*%h!2^>U z&R+~D*X+?s3T6Ga`}m#%=MOG8zar^8*WL@g1u1%`E(pk8+~eNyU+1D&?ZsnHr5n31 z*2~a^E4U7Q- zoY@;#gdJFVVsAw-vdR`*Z#}>&`++6Rm&K%kxjC23%YoUPfi?9nt5*P-h8wIe$8*oH6FgrQ0T(srzbzqHGU@ITf&2iQ^%Fv&i6 zDD^La+3zijQ~{In0Vb&lOtHSqnhO{u3z&2!Fny0@QTo87f8gQuw=6mdOu`FTS|%_l z88E3QFiAK($w^={U|=$O@W@?(BYpv+kph#Z0h82%2OSSs6dJB66fmV8U^7=>QfFXN zo4};Pz?Ax-{((xuGnEZbau`^39GHX~o@zQU$I3G42t3NUaI@Z*BQ4>XaNG;Ei>zyN zIZ_3fTrY5h{$onMceP1@CHfp&b^yz~vuu6_jOqs0JsTLy_p)VuU{c#~Gdq@T_TT3c z22Yz0uu2_xGVL6bZ~)7qJSKGo4)+U;Q3@Ou7Z@-8WtCXKSpWAgt8@c%mjIhW0rS7L zjJ&o1>fAlzf0~ka1v(EJ6$UeX%tj{Wb z;lYo;jLCLirq%O%KVZD>%Mr4H@zq)mONV!@32X`zzBC1}DI~n{ZD0(Y&nngMwYvA0 z&H>ic53K+FI70be=M+3{c3>8+&ws1-fi*_qPyB|P2iE=WUcjP~|M9T>b#sA-ULP3K zK78Vj`;k+?B9-vD+nD%=DJ6x{yv{*&td$4aq9c~4GjyA9CK@JboRKh)X-zau}PCWjFXPJUH&+A#*fze zjZ1!V?phkiQkA@D+ml4KRa@PZoHNQM{aduGqmd;`Y!cI?&ymwYxvhL+a%y_!tl4ws z&YM3xvbwguvAMOqbJy-YTRZpaMAlzV4{llWt%=b&rFrwQX-6G{N-i4)ziv6`I-`_v zYRCFT9TN%?Y9gxGF<+l!^CmcXoZ=QXTJoU4Nu%9W zOiYr=cS$`<`vyHzza_FKm!09(I& znJB{`ThGp|AX?Z zB?X6#{3}F48o2aMBsBBcaV)GzUD19 zCz87L_HiWl7}d>i6HS_MompVkmw=-^cKe0y)xzNWt@1$q{>}tP2j-SP0R>8&DjPPag-iVA6tnU8S#bWJ-TyoB zM})_-!SJ0a$>Q#N{+xz0Zac%oZPiX`S!WrYK9}~_d}iwM-ik+E*SBp`t1o7j z+Bh*MC7hMfU--fkMz>eK9vjumEzK5jXdF1qU?V(;P`sbrfV7;@Z?fLc#&E%0aXVju1JkU{fj^%Hw%79rlU?A-%;K0E2W4#Xp!yFw!X=^c! zec%3ZDy8Ps@YI}_kbA&zb7LPPTh4>(E;9?JZwo4Sax-13y0FTSLDAn~N1(uxEzFD` z8rW4?j*8Z7Xs)(g89X^?3ZsQbhkK|&`R1s(tkM!Kf_0C$tSX|J>l7TdMFJV`NwrBd zDAXVEk5DW-(jl?OWTSxs!-1;3o`?A*CN!|VQK$}WSR{E?!p1COVQbp#%lvE$7Uu-; zwx2j~jlndrHBZ-vhdm(T+=T6i<;@Io7%gO_>jWGaSQr?hk0ibnIqAV@vmnhb;>iV} zjVA9T*JWL|c96Nbz*X;^8xL2)6D39m1{Jx6iOcF!RMjOJ8XT;2IJhbpu8S!g%q-B8 zOupdA#HL{R@9o1g0Xzl{t7VoqFrNsT@K`v6VMq8H27?DJ@1z>kss$PtDpqryU_PLF z(?NwnosA@~nbFtdsR)&ako;hb^87F<`Y}5;0?6Ou?%;=PKpV*{! zIn`s#LSe=&x(oqaEvwYTE?n^~GU#R~c%ECr&@e$Pna95VtehHq)Riqw>oY?gR^?rp zxn$efE1l0b&lX`dVA%X`-4;fUh*b;YqFiTQy0~o78DD0%GM-ILUsq*>u1*#WS2m0| zxaPFSVbQ*mR@yo_Jhm^=rA!wZv%h(;DEY0%`CHSjCp{@y=jYVG5ZYxYx5ikop;XB# zJdM?E>*X~6$C@mu8TCAdUk)(xcf1gYetMMMhGE%!hX}S#$FOCrTQ~NveRp$%!qVfW z%-owF1s~;TxT(FPjNx|K65NEvL{Xywr1kcT16LY%jZC?kh<$mO~ zG?6DsOX|5nbC-Q2_^kf8o<)rVFVkCldVPTEeCyu8v} zw(Z24?UxK?ua*9_eICOvegE#K?5S)utC&_LtXe0uIO*7~L;UB=4{YE(z{tViG%eJf zXBy*!os)iPrg17>5jbrb75d;{mv2q|3d4kjN5UR7))%WWNG#T2IKHKc;X==HhHBw$ zaaUQ~84IlLUOmsgdb7S^N_WPeL;4II>vT1KeSLCWsOdn?1{1}+u!c9BUJOfATSWcD zTNny1Ze_Q~WsHdB$@#ST;QHdvCH6MY6T)9|9TAn7^XH3Nl6AxN1r;01`4t{3h|Kgc zsyEHPE%xJajHD2E1g`^A0@vw$wMXm>76;}`y0iT5+tdFpNBOc$$^E68GjC;ex1B`N zL_tG0NiD|2t1g=ETwSUQg%-~LW}4in`=*8cCD%5WyajGCt!z)sC9l_+E%euIV7_3u zT)bFl%gnbgLJx(+J&(>;I%K<{=)C9U2Uj+EZCM?>%|K6C93Dd6?6G`o>buX3d?V4Js<3 zisAKjb2I1uXvmTJup#L$%d+#m`~HhDtnl5IyCQR*72}ce3!jc`65SKtV^VQ}kyqk? z&+aLqEu6IySL&_qZ;;6?;5V=R6eiR>_pu6_j!ACw=>tv+bmii%pZZnuZ&T=!Ch?h{ za}LJ{D|wq9SoXJ5`LJ1SLaEs9aQ6?bkgIkq9_gSeqATROKz zt?&ya|B^_%4WN#&F&xgYxLdn?VOG!noYsaEC4St2h^}$}#zcgG>Z#=CrQPwG`M_v6iL)hLTR^AN^ zY@N-F3z(;~dLInYk=g9FgM&+2+0*d?Gh>RwR22q+ueyv=?DRMLZ(w5KH(Flw@$8b@;A+2kig1pz+m6NYF)s<5zysUF=5k}jHlu(_5oh& z%6kMd848%qc?^1mJE!R%>gy882-{#{lgzqWg~4??gN#bSisj69ExK#2gx<#`a+5tOE=Or*~@3n6|M~DT1NYO2NSQu==5^3~!aJy^b*O3$War zIEky$Wpy*_+^LOGGmLFOyOo&NvRUs@V{;5(6=Jo&y3;6RigoCRw1@(y^^ci(FEGqW zSL1PP@V9MZz40_9L0#>n$=nwhYz!hif{cSDSbj#bUU?a|Y5E#|Mv3|^vrC3N z0&pO+8^z$VFCt1}239 zrqmBSz6wl+w-)&?WPA5Q|gT?W`cn;Se6gY8^>Dom3wh2r81=)PEL}M;+UJYPd>>z5+ zz!Yc2Bg(a`@)VnMm(;8YtkMtoPdc!g9AGkHkZ7I2Ty~1p++lIL0!#D-G2IO;TQ{(| zGO(^X$mE)^JpCY(xr4N;18d+1rqn?000m}E14c~+W+Mj4qYkXDA6P9Dr1C$qnjffN zoZ7%#ypSa@fW`0ttKSEve;bxe<6_qTz%uIstJwi2lMTW-8(5tJ*t`N(oQ>j13t-Xt zz~t_r7&L(~Gm9t6VTGB2_^b`fmTZt~Qe-|ZCFweW)ue$r@q>WPDmJeVO!@&V@q(-4 z75<4CZ4h=~^TN88L}rOa%WY59GwB-e=sPa$3}BH;U^4l@wDusI%K}En zF8*HvY;qHrloXhC8W^7n$g4RpwMH>Mvs$9Bz@oyyRJ@Q)QGrRxfLXJF(f0t`vMMIw z0w$*0tBwe4R4HIGagbWt#b~{eRf0i6$AC#w06aG0z?8LNiMbZD`UFOc*K2k=u;^T1 ztbcWiMe4v769Fbgfh9)**faz9jTE*`J;36wz%1;*>>j}KDvBqNfk~&DNq)kT!~=}a zyg0PIn4AQdi+-`nJBZ0nVA9#Z7`2Mc>;a>B1GDS_rmYiLB^0)r3NXz$!1j-8gZ_q9 z?Ov>1|7J6rJ20ou-eCKSw{e%8d;|B11FTXG%=KkjJT4a)rMel5H!hK4kT{$uyC{&+ zBY<1Gfa`D|bE7nq@c}l&)r{VTGM@uEBpSp|7O)gWa|_Pq3@F&r@?crRMJA~atS$zO z0S{Q@3Kq&bP7!IKUw5)RUx3A=Zk-YA>E+_`~eo`5``4@W=& z%f)DxmH$e<}AhL z{ffJ#fLT6)E!&HE!Y)?h1&nHYSVS+#ra7>A?2IP-q3 zh}yua!@%?^kWJtXhjIav_Ze2#1F{Jh7=1UeDK&6>J;gSen{@>JDU`>8sa?%gAW` z;q+->oZPrU|4#ja)DMjAe>fL?JbcoCS-xRc%Z9@(8#Ye7$k;HO<0IqV{|1Z-229Ei zHcge@eB7I3=|qk;gS{sTj;h@`8nb4vb)b+pH@Bq&Q_ckz*@9#83_C0fcIVwzSk!wyG2?4*9?; z^MPfy57#`I?Mez;l@BbLzFQ6RSiwccU@azoS!q*;C6RBJwiR3ypTpAWuzY)55#SRX4b#SfvjfoqvEeKAX=>K+x<1levSC ztOApn!d5pyN$CKY6ANz|uVGYgV763X{#XCua_5EPEd^|v6Bvygm@OTa3T9uqoy{il zS4f57Sn8`Qse2gHWfq$yFtg-bkyc zugfg5kj3c3Ed_4Lcm^i<4G*~YvBfj2FkHP<|GKnoCPdT1z2|+U~P%xFlS&k zm~d^@0#*xyRmK7>_LZpz*yl<^b0B1r2bABS5?!)C~515W=-C2BV<&|4c*>ADRH5}?(aB%5d z>9!iV8-1d;-pO41uwm=rx##<&6Cbc#NM!TdaOcswFoy|+?^nKiZ@1w3rGNAFo4wxg zz5lK^d-b%L3uh?*cvt_PMJsLUkN3>$3sjyte{ABZX5vcx-09c!;cURfBOBNR)O^?Ly8OWPH{ZttKdmNoeB4{e`h2sdPlZpt##8&R$sP$u znPZZtGB8Y#FZC+URN1vzk5j;5UpcD{hsJJZ7ES|g*Xw1!oa6p&)?1$Jnx7KnyI*;Y z1g}d_#Dxb8kDjZ{YWh-PFZw~mu_=7!cDKyT30)0JMnxK`VFh-&`ahW%Slo~5bADjR z_@@-d_`$O+t*0fxkLv(~Ig@ey{1fhs7gT!Y8=Nv^Gcq-v<@$qV3d7=)JYf?Uoa=e= zx0G*7VhA?h*DJkk;lb zo6o;yNd8d?ONvPN*jF5BJin6LI7!tlsdo}vgu}m-MWzcFjQ8GGXOjPOGvN<+{r~(m z>iwHoIoLCES{xX-TXHfvn8G{zTf&$+CNed3@-XoB^E23Vax*yg^D)@BB(pK_Prz8P zyFQtd^$?5g=1dzlRu;Cfme7+dYdRed9p+4K3FkV*vAENYIdok&XY-PO%=7oXdj00@ zyZ0YHe%dng=!E)Y*53X$&Q2Q!9ywOV1qy+)n14krl?--u*qJl!%tp@C{tJ8z)&Y_d z3ePSc?djrTVK7?1TBNeZ)gG&Xb|W02gXd_c`C zNkC;qP^$Da7cK#hmMzH*i`}`xR^B_rv+g+ZY`#f43$L8S zhZ6Z_W>z+aiW6>^8r>KAsqWI4%qzykBxMuvhoSM>Ts9UHX78Pwo}S)yL_kBPyPYAQ zi=ScdbcRO1g30R_IEOx1v08!YgxaA`%DT^P?-0A@x$op1A*TlTP@7G(;#a<7TUtRh-!Z{hT_k>9>+J{ zfr-2v%Wg)mjWBFzGIi5@I%Qvrk&4Q!h3Wzf96ui4RSrFJRYo~{stvtQ zE>8ClRCuhN`DCix)QV>-FZCW~3|#2w$TQ)-5MrgURb~K)LnapjTbp5>q(|O-_F2(hihH(i&-+;*d!br zn8NEnD)=xki6lr#+cFq9n4T88)NI5qQQ$CBe$h`4t=6*R(+_AYf8%#>o(RVg1wS!^ zo9$PtPOhKP6*1F;S;DpH!XCzw%=feBn7SNDInZ_b)*>x)-_?;XzeFySaQJb-S>RjZ z!%Npfd6bS_i%yUI${*&zvhd%f2_FQ`<#$@X{dRlDpLzuc1}+PO>!H)d7Bn+6voz%G zN_ceUm@BJ=!IH@g?-CrC**B!RmO1lpTfL7#;6VeklIvWq%LV249ym$yGi0VV7FBC( z&t%!iP(N?`yIn)n9)$K9(vm{fw93i`ny8b}O~X%DiM3+`=Pp zX)>FqBU6bm&q5A&k3&MUKD21~EaVD5aY*dnt`DsSJqvl#Jq}CVs{hbtab_W3`H91F zzdp1(@GKH&_c)>?^|8alXOYnK6GzmnK6VE5ED~Anaa1enV^_qPMPl1e9M!A(*qy+$ zSmL@| zAoXd&r^k2iH-*@^SQWJ-X)KYh=bU^%+vC&38DC_?Rt0RcQc|D1Kt_>q?FWbGn%~)uLJZR07+&8TE=h z`vROL4hXQB7O3*PTGAu6??bE6n@2o}94}N0Ee@C@EOajncCC>Mg&MRtob}eP9R~ikgVi=v#5p@f=rTniVkO|6f@jpO<-Kg zbE@9Vi)WRL0!OH%CX>Lb4p{+*GE>9ZO!XoPZR{)!4#@|uxlMlF(;Kmd;chas0MCT= z)90BmFfW+vz;l4vP{W~&VV0L@R@ZJ8fvIir0*s)R_7nb}}vwgwK%+|PI zrc?bftriZEjLk+-p^A$cZBKL+CVbSBwVA@ctBOHD=Q{K8IX%2fEg1NFUTx2=e9mxD z;>f~NkDJ$Q>G!j7cHrNj+OYp4PjTDnQ%Bf>W#kkVr+VLRWDqFms`m&lEZB62DI}1A z)ntLP9fO0irdY$-2Vwhub1*PVG%(27B;;*6=ww%4#?bP=sJqQlpwV7&Aq)S9P}Qu2 zgK^b~Y>UhZ#vKP(LVh@jy_wlf782iFHXD(ATVy|ehT(f{V z^^}ROsJCB@v}RjPh4TTXhO4t~ub%9;qis^_jd-5Z0!*UzNxbS481=4Q=rW$LLo78z zN5$jJOZOEIFZXL4W-n^s4msa+L`Bb;J>*T6(-kYh?QKWb)^BcLRNGQDS7yVOm9dVm z!d5K2a?H(4F^7Rkyx;12@FpkbiUwX*sSmeAa~S#*8`D@lSS~GH;Zd`+@!90qC%QJy z(gg=!b3LDxEZ7nvI?L-~=-fyZn@x@rc4>dx@RD=f}Jb@E=-Q z?5DzD`|nqZlGe2oKZ5EX-RpJPJbMnKrEzXeyLUl>_KF3KIwu}+TT~q4EIQCCe&E3T zEDa|vj|3(eod{0-7fgyL1e#SgB=S0WFmk7CNHEiI|yn!bU#AGY7ip_Yy+U?IG(Zt)Sf9AnEuMO#v1q`hV z%N^NtDmF+?iu-Xas*c-fhxLQ24b8$849w~Yj$H4&I5c)Nu&5|lEsZ$DAX}0$>-w=K zJ_&*S;W4L{GB5nsa?m}PYtxeY45{{v&o!#|^2+>Eik5mDcZ~bW(dFIuK;-b1$1P?3 zCltQO_ddD#neXtH&0g<+^0f1-%(DMD@2dS@h7YmFFXlvT7O=Tv(~>#s8kb1{(*-w< z$PE!j8zPJ^FxrK)=@&4&H!w?mVET51Rdxc?TM=gI4XiC2SX>I2Bt9hM1Tf2fsAp0a zVAB4;B>%wQ?*Nla0gFxpqyGnvvaM`@HbnE%H->#l z4u_jq`4;4Eoxo|A5NVSrt7XKnxm189Kzv(9%kdN_|HTTkTQdnoew2MM0%f%_kMo%#_p**K$9K(T*; z1j8W^J|un04-MlN8C`xl-y#f-V$ETeRD0gKQC<~eOF;+8G0Cs@TNlod^DV+$OHy(8jOEDpA0)<~x&$0prHw zOilvaX$DLt3E73;IT8gT`W=|L+&EkoFeZLrUH&3bC4o)%15-{xV)yavebZQl4=}w| znci7nzC( zcT4=^g0KliYI73m4lDwwMO zV4C>`MxPCfyc!rKk7d_(OtW+6sCt=`Ka){?1Ixcm?aT?nM~srqAF6lUlxE)$60?e7 z9f$1C<)LdAEsfn3Ql(Zf(=vX-ftjZ>xXyA2-Z(Mq5aYkh7J+)M=%{5$tepMH3|UtT zZIq327WA|y%BHSjNNE%Ju58Y{AUgEJ@~_uJPt4$AEU}!^G$SHiZY-Dh15?T8V}1OpjNVO9U`}MpiRfwQN7dDxA4s)--0718m$9XtEd(?p&m zrL-_?5@ebEot^vL^<_%Mn&(#ZCR{2k$x>q|P-PB{x=>NTv|OQ6ldtudiC~Gq`9On> zg8KVA_4^<6$uKcoGG;4ET3I68|NV#KgAbBsE_1JWa&WIIUVe))=0Tb70XEa)Y)%D? zAqoCo3m9W&hbvxS)NNqfQ8lrp-hp{f7t21bNofL1?kCx@7#4LVu&K>l^Y`a`ISE$b zfEG{9wJF|A*&7yE?M&=E(DG>sqss!e^a8dthor}+wyrNLSDCimYyyXK#iI2N3p@+5 zrgvw>XJ)1wFzG+Y%$l&X?L@oPsYJ$XW?2Td71dds-HbsF9K5rqS7+wL7BK%4tyhSg zTEyy@z-qIA;mKhJI|i1cF5DWwxn?EGa5^x23*5Wz!3xdUJu2QDw?8iPn8;tAR3L4% zdG3RtjSD2_B->n6FNmGW^{XKLgOmEiK(+qIxw&m>jnlTws;pHCjyhDhvU9@9Q#ZL@ zggZxeuIVpWu=PNHj6!ze?YZ19{NpDu6?xY;h8VOgo5kT#!1%h7X>S!9=Z~#Y4_2wn zV$7>t&&R|4XJ~c{ybpu8t%e873cJOfRpx~Ep$P74^j z+gYSGZ0MNIxZj#PjbWW@dsZsLw9W)(>3|luGwTC3uqh?%&a-Se;hp5>#o;lF!)*d% zT+YAxY?ZcY`fJofFEIZOl@8y)%>95t&V-wLj>7~4n=1$Qzqyegd~mO5af08mEjr%& z8ec8zyudlfaI=`XXzP?2cO3I`%L+3Wtt^e&+)yLGRB4VA+sOkrYnRk$es10O>_To( zc9h}ilZIQiuAR_OTd_)N!Ya7~tJZN%RA*pTGGN-gi=|#7VUk14gw1 zrb_qiITKhEKFm|dT%c3Kq+HO{vZ2iK4Wp(5v)FHrKaxw0-!!HdFo{|$zIcks@BrJD zTRYMs*^~}2>Mdyb($%2Az@%@$tg|5L$ebga0@z;ZR7-rzTpZ0EaDh=lfZ52Px+Q?6 zP<*{+0`s>otZMcDE->mmI4|~>Rhog-N-HAwCZ(mbkGU#u4z|2#iZnGdh`5VWige%9IgL9`X z+n|s(H}lk#$@>2dq$Y7`8=tOI*vxS8iR!w*jPIw}Y@E}-mlb}jcRlfB(sHM0wZ)ZM zeo3dis;@BG%z7}LGcY)By^hS;NgQnpmKm@dT${kGQqZunjU{&lOU+i6;;n1}3CtD( ztnm#jZ;!CJZ|F)ZU`ep3a&lmCQDCu5C<>WS9y6gbwSeVc2%D<|v+D;|?Wk%?fm>M? zPEvz-&HYasPxnCJxL_0WG!9 z7i~!Zuk|fBeW049UXnZZ!z~jBmbmXMTXk<)E?`kw$zpE6JZJktj{}`*=C^COSuGWq zOIP@%Cb0CDvbj$1@9JX@3An~JNmF?t=6T-Gu>{7ngq(Q8Wemt z-W-)@I8l({({~R01>z?gQobKHwrXHtX%LWI7pkrr{FPPeTeZDigY}82432SvI>rp_ zA4JOMs_pt@z#JCK z9vE5+IED(mThtgZ$18Wj2j;+wZzDD^bA-O*xWI5jV8-I)*T;nHMOBQB2Ru3}7{%7W zVDI;u<-hKnquh5&Bjo~M?^+x|De@bcjB%{w}Yj9Be<%Vke(t91t$Hq7A-TK~09-{pWpaL2)Y zYdDf%BQArDdpMi;BknVB#;_)e zicXrQ+5KNif8RTQBQ^2#kWxkSqk8*p+z`LH|L?E)&Uf!~*)@nYB)A5ch8;M3EbQrq z1r7lQZ6~$~8w7~fS9YHK=In5QVM?2%iog`j8w{t^+!794s8UEcdCjP{Eu&+DxnS3J?W)JGofXnTHN!3(erCL3!{x~i44oF138FPiKcCvrr{Ptl+19Y2 zTf?luq1{2&`qx*14|&s@nf|V^tl=m_=ENH)t_3 zvm}?zay^pVU=f!rV4;=3ab<=Z3roSLS!#`iesf*y3sM>!n!R}>Zhcx9p3cOu+rIig z-@fTF36IOC^7q@-y6Q0VJzYJigh$M*K672eu1$Xbd<3*JpIqK=G(U*pSCgxN1B>D0 z#Ma0}SNodCg$WJStQ+HPb2ujXhB-`K?#!@p1$$CQ#NUPk{D=NbXz1M2vGIVW(msx4 zzx+X>YPmI~vTw-y|BW2>nFXbos7*aTTCi&d@#P99q=ebnZVM8ec zV?93)CoeyT3WM5=-zK7gQamyN=hdv^n)vu*!Z_3C?CsfjAZwyVW|Tq2H=(7iMgKG( zN!SULTy}Qk*m9VUMe~=UOR|WT+hQ9gugs;pHypn^*PH8civAnV%*+*w`nS*&xX4@w*O*qNMFSz(px(e5XwJ%HJh&B}#)g!Wl^OgDZRwL_UU;2c z`*QM(FB39%@_g=KVA#mAuJi4kLu%_@pR?z;4XHKVaDegD^w;wy)oeCo6W})piu7lT zkIUO6{%V3=xR&-y(bC!V%IlvnIh^4?V#eelQTy-L`~Ly_EG!$i*4brK#~Gq4ms-NC@PkYVDRi0ZtBKJ^ikbR<>W%WF8# z6?{6K&#^#&NsK|$P)$j(^* z`-1Gr2uWEMMe~1A!poiIU#&5`VA#UB;SgiT%nj%7W(zB-H1L-_aQkI)$h|I5Qml)8 z16zpVg8V<+j*cs4*T`IU+RUKHz`jPF!U7?c@>Bste8KJquS< zCu)5^^lY;H2ZrdcnI|L;m1)SHdF%c|S(ab!LOrwar;;@(x~n74cU{}Es&s8m?&|3K zT-SG;5|xbCXx4poO47I>kvnF?>zMysH&)~@vIL!Qk#t$Wa?XK~MRo;)phggz)(XW9 zQ`YM6c_g&?$S|@bKIoA;G@+I6NrRFrLu0&l_pKdmj4bXaTBLjum=k9#4t)PHH#4xAnVhdB4mO%t%Wv5h0lNoYz#GpCK?O`nKn&b$L{ zl1mzREe|*d>cp||zM07_RiD75bm&5(QpxQtGdOhradd2GWtv|7TvKP$X~V!affF_o z2?rcGOcI(tuS#Tb(OA3OSAoTBN+WAt+d)n>g#sQ2MIoIAQ~hlQjDi~)STz$IdHh!A zn9YB9G)4Y*TleikVVejx_T>jz{0z!A70>3DwAi{S`wUzD_SxJ^D^YYXegc#7oC9o18C!+6^l@Zz$1q2yAHEgeP{4a)&$a`+X0vZ5 zFx41u-)4~CbX;EN(*fssJ3Auu?$363zwq_GyGLA^*y7gzc;bAX$E55n=Qo)i;~!Uf z)IRK*>B`WiB=K*L%Y_4#f4fVgk{4Xfs<&Wzd317S$|FdmqHodZqW7#_0 zlEWVwcQo64k34aJ*Jw9ex9lz3X*B$D>`vqEE3mo;OaLSkAfdYv%q9 zEQ$*fl^K{=J6Hr8s#=yYKHkPEJ0Y2K8e`;jM)d?HIfa@%6IfL?H0d}nIft_-nK4Q^ zFxBfb#HM{<^0;2Azkp4qyjsz`D0@OtQaO`)K$6b$a`qW%>I<4x0+QX9Cn_i~MGG`W zpRmgMP_xaU{N*$5#04xa6PP_58dG+pWG7^9y~^q?kePOYrEF=cNkNe+8&B#578eH= zFM-O)1uR}0SQ>w@tPy8*bzqrzj4k^E%Un@b)%t0yliadB6VT92BTj;+|VdTbRs#U$n7FVhv>o zJ-op?+=SCyRr5#^TYNx5dPC2a4o3fi?uAS&91Dze7s@DxFjzg%R#9SLE@rr`EXCWv zpj^xuRzHE^a))S`fWAQxtIT7~se)k#S9rz?FjxHOnexb7qE(iGLBvMHdd3Ash60AG z!bVmK;;jY-lakC9mWU=N*xp|v7yiNi`zG#26SuD!6a5SORSt{Z=-_y=!`6O+(S!$j zOactIKMN~NaZj1zD;mgp{gOVfq+GIsfG6Wbj?3J$9@kG0Upe{c2DZ!%Y)KJ3lAIp@ z7#e)O9MnDf*xGB7RCHpmF{8DFsbF2Q-M$3Y`2upQ7_@H*@kmbzwthMF@1t%9PoBDB z>*UAQGZq-^4Dl&_BFt*QaQmZg8uL^kLz9B0sk=FNVs?gYoye2P&>w$tvVarEDTOIH z3taYYa1`zIJ@Ta9y|u;1|0j1+f_Oj^YuFRv#)+KA4k^1O&zulAQ@ct2k)iOUn==;~ z&YZa+B*{R|xMlj!f>}wME&nvJ@+(Y~Xk_I&(C4@`;J^olM;tTGZ(vIfV9jn|4O5tQ z$YI)zB{QrNZDS*?eOdTe3RssE3U63EVTQuwyqlatMXWplGHe@|>x&fG_#UX)B``1v z1gt1v?ZG?8~ zO2Na03~M=TGL)rk7cg)XEUKS=!6f+S?BgFM*F{RyMY?qVnC!T7l8(yU>7VSQzba1^ zRA@C|Xfj%&-DzFo!oc)W?vTrrs~7vXv@rZz%&;VIlCI!FW@iQ?MNWnz43dWpZ+}$e zddzUXP=tST=&ypMS3)KxA7);%kYVda*H@clPj_-83-@seFr-c4au8k=lei$WzQNDH zm7)EE@Uj$R_74nAS#CT3IXW?4U^vk1S#GJbIkIQF5l4X2Yzt-C|DMaXUkI?w;)w`g zZDmwY{Wy8et5u;5i}p^K`x z#J{Q+W_MU&CCIXM)vDEAo{K|6y~p z$GzJgn5VB4nVw*ld}LO1;D!Uq+j9)ew2Z9H7pgq7sMlW1DD%I0@r|GJ*&gh8ufQ+% zi9vHAf8PPlluyjpIb@g~FnCUsRx^>ACe2V5ZS`!1v&(qNJ~ML(=v#AbNxr}w z@MU_fvd78`47W2FEJIlt7_^OdTl&A|UCcaln}ejlZ_$8X8x{&r>{L-q$QJ2p;b{J> zn8v&@+`whU0)zU6E)JXxzTPh#4_@XzFnQAM0IO?J|2P<EghGZ})=f9SbaXZE~Hj zrColJ*W)+$lK|IGj9mW~b1&S-&6_CxOwpvo6DPZ3$1%@{slFyv^ zOn2{k#>m3`K+VpYEm?uh<^ku{?A_Nr-I_m(PjqlNaeB&+155rYtf*I0n(icMxJ_W| zoku>|lTC#m``9trSZK+IJNOqbUN$ko?8Fz%6$!@oTUePA7*;H>lvrxOp%6CH!J#Zk z?voTu}ahD|dktXqF&TCwCT@i*L#^%I=$6pOEU#jur=M{AX^tWZ#%^4=N$Hf-H;*!Ik2 zAqD}F;A+|QWNw~r&f6Q6KNoSXH!v^l<_x>Q!1CH;%Ad6^F%F)EM>;k*inHpyyyWz{ zVeK6w3zh}U7Q2P{A2WFD5_!pB$Z)-wm9lHE=khav-pZm29G4qfg}7A1O)0O zS@gBo9%S;Tzmn#=V!~-?d06@E>B*D+W-$ck7|c*P@%NCi+#iL|$XR<1oUn3qe^RsL z*zMI*|G4vX3LKry8JW$!^HuN8RZ5GJ6|H4l)+X`)pUl9&f%)7Q#Vg)NPW{$eF=6%T zgEA}!_&>~c{P%!?sX2I$pbGzDBjJ=~RujaJt*Jl0^UDgMAYr~@-wiW^OI)}br%X;i zbNb&C#}kpkA`cEQ_XL>g9bwZu2$~vL8p8c#f`Gl_Io1cutLC`tFdZvC$n`dcr$5Og z>;khx0xO%*(Srr6cYip#E5RUVCTH4Z7u`G747qD&$Slo}7;rt^P@@)U@H&3xyC$qj$SJkq3^3^GvJKu26>f$KbqSnV^aiZtuY#Yy{Gi={_ z8GKE2GIAz}?(7q|Wb*d1f5v6S&0h@d1^nkL-|j4Ay?EoI+>%4b@7Q(iGVr*{Y^NZ; zxmN$c;%SF_57`^6v<{eBf8{W~S_e%QuHXhIa#>f+}B_!rB+J_*fh6oLFUWLC|=5!1};Aj<@xT`I#q} zMmDdR7+_nsX)CMuBQq~Ad#RAk|6VgBp537*Wd7)O_lyf`Z8phju2flGeEdZ8dZj7H z({s137ZS3s3&?Re^+?yfQN{i1EZMbpgoIY#d;P#{=M{0@i8m6v4{fpw*}x;Pz(MNu zFY}{U9=~2K;<=E^?8?p9pA1PVn~yk2^40GQaSol+eo%SUOa89`@(~ZF|Gi-1kRbka zqmag~t-F$Le9KueW@}=QpmrH?0*W zu^+to$42-hqf_zD3+w^h-WP>SOpGEP_yla;X2s)}_Sq{;fPu|GzC>uD@Y*M?y(jm@ zF?dd_U(LtBdDv0p#u6hTQzPLc7p8w;_)_4}W^DHFZ7^#ti}~ZtYWi;-c^WoopSyCJ?W-Azd#Vb;qAS5?>lVd^S&y-!(so74Pu3j(->6myj#a(D`1qcsW*8F+kXpx zhh*!=55<42U^r*8Yv)|<{My~SYJ%M_e)F$4(=PnB`Ck29fhT@~ml<|BxU(||oBUeS z#LSR(`ib~mGlf(0l+S;%3$)?i>nhW4y;G|1ijUBe&-Pp!1o#RVe0e-s8C>sNKKe!Q z2mgfK-u7P}FicSL(Y*X*N3WKk&t2~I3zgOj{_dX5`9MQY*knr#KX2v%WCACp zXJ+9`vf|6^O5$c_w#mul<4NjFwrXkX=(6Ps?dsxY;9CVgbhjRS>h6wAM_aqFod>og zIV5ilKRSEQzMT>C51xmex_jg1wxqDoh)tOhp<(A9gg>6L@#TYUkHTMfW`>8|f3^NY zSMu>y5fLvx{4hJnwIefbZ}r9v5tZTH(ub?hrnP=v&N1IPWfg}R!w2Wt$NLqWyJS2! zftT>EiaEKde(CA{OaY!9pEfN!JKLi8)t!@@m!F^S&>U;%V(@Rp#l;?zwPH_gS$TP` z4a19yTPD7NbCZI2_ek+1>lTF^?vnN1wq}iCXq||}htqFP7i_g+m7VOsxX*+~KxWFa zZS7jMVSAQEPB^go_Tdg;?KDXjh6V;}vGson7sTkWax__KT=-U>zxdpx3YLlm8XQba z%zO-isjUvo>n0_ip66?QZ7Lg|)iu47$p_*hW+d+CF*=a%H0$ammcHu^j#Cxbx!!zL zO!)fl^^MKh_v^Gdm|3~Y0zO@2aBN`ZllrmZNHZfd6X&(N*VcOVF#Af@>M-0l6ek;<81k$ork$4HU-J9_bJRvdH!FJvhQ^upE46iSyrYPCAXmxAkJ1H++vdUz^6YcPnPhJ9CYriK?3%(j;F_Vqmm+GnJv9InzhGji1%R*v)*wq-k!9JQ|x0ugy7Nb$aJU zJLP|=n^zt2$W}@cak#bN$FtS%_sQ7>G$?9qTDV3j{nsyr1s4LkPBP`1E@%+V{=0#B zQFjC9vy9mi7aBB~6pk-x?ONe|cFp=f1_x9&^aLI__GjChPp5UdJ~A^gO;Iw~)j20K zW?TIQuVz+$7Kslhk639OIKafWxsjETJHhbSrAJ~9yp$GQ*?gGcZBVbV#-Y8NO!nmb z`M}}m?fY=LGJQ(zg}4^HC)KY zuW(@L{b;KK`KwH8{{2)w^ir%cWzy4tR}CsGH&T}|822VJFw}J>GA!r*qn$Tfy6L9m zvf$%QmeP(a4i?6{v|a(0w4QU2qGh3q^Iexecq`?cOIP>$1bXe{|K+wl&6?VHsd zK6Vk^OCKJ$dlwnJ^jah9%7csI*cc@LqxO;2+kTD{zp#2acclQ;7-GvB@rcF{$yq9qp=YE}g*+0SXMKY8YxgFK5P`$O-R z{X!0hA|ebprbJHFtqQixn z!N&GVnUHNKG`i&$^aw{AH86V%w`_4t_vX%c?2uQ^ub`kkX_6-c!>$Nkb`d3pd)jda zN}M!3HT@a(SGtC1baHFguMlE5VB@bBEOcPs!XQogq$JlP3T%>xPG-(-equP=s4YdS z$**?FF}H>*3^I%jKDLf29R8+0u5XMa1bz$it8BA*oVa-Afe*nv%RSFm*|EBRKb&S} zmgKEuS*Y%KA;Kyz@|=spr0H81a5G3W2V23d_}je` zX4rB{jG?Dfc+1nn3~h6cS{65|EZlo&*7XVhF4+_(Uh28^WtpWRe}<4iLyljva-;Gj z*LtUO&T2tX3=VVMQ?z{NSbbfoS$T`Gip$^Zji6xI3rBvJNY=HRgv9=c#AwG&yectqnI8oCPJPx~`cF+JF7cV#s)8Gd@0!@7YZDDq!U9&z+BT10!hvC*rmNWp z6OO%%YK&=?ZES14&7L;PH6rw(x>3>z!~RSLqjRpS4HX_Re0{)Dz^rhmONC*l^vxOd zf7m`q$XYJuda|m6ktLv&^^O^1wPl7|$%YvJfOQ@lb~63*Z|qca&CpzZh4lbK$>g;^ zl9FsWlo$*c6B>51HZq7U?T+hW^QR4Gi4#BI)lxN>;Ew@a3%OM2rNqyv!2n@>av(AOn8yA z&I+$i4yK;1vv)K9Sa8(YWP1F~h7-&iBBqMDK6#Rnc&C+#F~hqgjG^SfN_m5Z{R?h4 zma|S+8q#y_MBG1Nx40O+fGsZ>*lj+LY9PHX$lQ*AGdd|hNW9pPUDO?P9w8J+G=Pdg-xtf77!${8N zs+ZKcTYDvTOES!P7{geV<+oq2m*GUFV&d;7FQZ&kPbSX(XtghgA-*^9h*|V3#%qRc zaw_5TI}>D^ayZs~*HVOOh1!J&+m=_pTYjpueiKt(omTL+4B75p5eLQ@ z3-y@(DaX0iM4GQJ)n`}}{NCk`wVbjWgVB`stq~kIuS!a6-%lU3c;l7>= zJx`=Xp1r)_#%7F|ayt!r;`b(W(mhMQe^O@I_*1sjm zqV7__tKWt-4O=I@ub;N>B=hUxGV(^J1rgO-D1oME@6xcPldu+Z)jh9v3toEEEeK$FBUq@TN_Zv7pJ2!+hy6^|Q|sm>JC3%Y!sS%U=ZLe=U+Tv`{?OsIsS? znVXq||MoOKX+tHhh>E^zQcNEh91lb=3N)&*7wmqPAEBP&yQzhDfoQ~n4BxMfc^o>5 zD>znNarHiKInmT({f6j0X@OsZS~d!Z&RU@R<&!?^(c%s>0UHH|7e+0!%I%#6owQ9G zH#=z6?a)3Xrk{9%?b!CJ+v;pN>G>+^DG3tw4adLPrmT>@d)auKV|DJ2wsjgBkJXw= zJSu8m)HteZE;jZ%;?DiA`WSTDqP_D$g=C>F1>Kq8oi(-?RT8U=TQ3dvk`ls(a?_ z3!HHm8Fn6yUG*VJrhGDwD8C7_lw*TnT~gzh?V7xvO7%t8^UE(K@^4^x`oQM)cFuQ> zoIL4)I}c@cHuTOt*3NohDoeY}#LxeFm)s~`wV|`_P&=1{+p~^I1)cgl&%1k#nnD&= zoZFoG_dvk`waMZqC(Aub_-0&b{7lqCh(U3AK=V%KR?dR<9UROT82&M6{WqyPup^e^ z0>haj1+vS^l%A&7+b_>AA%8W0KN=Uwm`Fm0aU6``_B=`YFBY##G++*fmGvYl>go90hh z9QBu-fqTN_qVEo&no`d+BThFGpMkHpJw0=|G=RAOWNT9bDSZYje=TcguKSA zQu_^Al@Dch1TBhNyy&a47ju1(lFcVI?k0v`#Y!DV`Q@efZ8xZ8Nlg7Vna%!!;%z1= z(^sOgU)3A~*6 z4Xm9D*diCOxIbX|UA5Nl1B?HKHJu+=zjCqOzO^>z0IR3N+Eos$i3x0{xYqBN+GOC& ztd_8`Gk`^L!-g#mtjZS{l`b$EIjqwSSlxMmMZtkdXy@m=qjXIzO=FdNWBWFn#c1RT5wlE?{2Oz^wFv$-SG=bpeN0!Dh7! zjLoOn(iE7C4=^b(FwN51H0iW{!UM+RzqryInCdMGxKkOJ)EL(NSjCm)u=?UHM(fpV zt^zy7rP;C;u(<^=9{$B7Jb@{`fK5k$X{i-=>IT-OzgQJMFl{y1CFj7Jp1>9_uqtE$ zqe}u?dI5{X1{U#dM%f1}Sr=F&3RWELW|sZHnwG$Jfr~9hVav=@+dB)`5*e7D%;vBV zVAKiN-B2IBD!O6ET5lGq3#-!vm_!|zQw7)*4=_#sz5hqkCN1ghvJ9KHG_XhrY~Aqh z!is(>wh0;|LU7U$oL2?3jRChXp_fGsV6O($TJb~NMk)m%mmyIHN7 zbPG00PS}yqu%k8!(&NaO*p4HZovTNnlcQU=nrM7pcH($IT>Euye_5XD4s& zv;Y?M2b(1v4sC8Yz;=c$tANRB4u`%2linMa&H%P$w+}?F;YyvrtZu-h6u_vHu-1Fd zzMKin3KMpFF&xQZsAm@aa5T||v0(QRyO<4X(nlAaQS!gQ$nu*j@&e<;DsJvUk2y1?=;AmDUB!ODHJnF1!T`h3{qoXvEgfZ1~nYvcqb6@gQ$Hn2z-tXN;bq`rVl z^TU~#35>oII1&{OcNVN>{=+2eus+g&sd~*0#SbT6S)c3-I5}O5S=OQc^tPIn^K4Fi zu+h*JIM-Fcta9Plwhb(z0cSTIIMCU^B6;A25UkR4(<0@m-lD;)9f=R)^LdF zuxz++>g+F8*$K?zs~H<=);7=Ka8EedrEp^Yo*fTs_D|?xes+fK#TmAh)yH!_ockzq zS?3VzDjx2+*(^H)*whwm4lr0>Cd^jvdw@lmfyw&=%Tg(}l+`RD4y;}iRdIK99XMkR~hJDo-|js z-ok-NZViX$1I9!Ko-X#XT>=l^*gl$ck<~2WaB2W^tivOndyn+=cFy|x$jI*TfdW?6 zh8UB1kFDZL8|qJr7=7-smU|MQYCrpkh|{*YPV=7V)jd(Ri#(qYe&$N!bpe*RtZuJ) z!apLiU|d=d zK0$frvH0(k{bstU^%e+-o|y1qlgZtP)_6C=bd|6AbFfnpCieruEWvd73#jH2h1}z zCQBAFc*t>c#e+aN}It2aV6Xv`2FFx}5{Fe`G z?r*lxb8T~d5zBZv|3n-g&vBiqgzvs{curutd~y-ZXzHR-RBC zx^!Zv59|3EL4~TpS`Qe$?0T+sWntEQ`%pJ8Xe%(?i-DdKJ=RDh* zdIP1POTSXrSETPR*m?iAV3YZu6Vc3C#Sbg(CwAnl+VH_~TC@7p)WDiQ+XQSI433%o z^RSqab|7F!00WE25#AuGBQ)GTB(wtVX>Duo z={M=ld>R&BKbsi|_ zFf*`N)MuGA>@{I$3ehalxV0tg`jOn%-*P9|I7u=}_^$fWu%PVyBgP3+0%jU8#Z8q9 zz2$#-|3B^4NrEZDDh$khnI$5s8=4=VKiI-8ZRh$x>H3-$2@#3iT`!NDaPxIYHdp#+ z$WL@)l$?;Mrro=49nTDQ(e4L_*F^8GyE{wr?m}jcKOFT<*5iCo9IDfDD-w8qWdIfoX?hP;2a;r4~*Gih20-xPMw`?7A=rv)zxZ@js^J3m!W ziK)Qn&X}vnx#J2~ z#iNai8gcA9H!&ft_7a zR?3Q@A(pcx)KXP7_m)R03R#C+T$pf{dBUxNi|axkHt^d@G&F1wd1t^-$}dn~@Xof| zX2YzDQTcm?gBd5hI>%`9rGa7heX$G8{2VF?k5!miE-(o2DG2nns2i0PDcUluYUV$w z!f^BSeWNUX#S2mfWj9UkJ$^ImYgSUjB-@TaekOYc$FnnI^6yO+<&;QpV0Ma{ag48g z>BojynIVQ&&)4nWcbbW9f|lFlTvLS`^%6W9tPD({4CTryafU)H35x4@Z}M%M8B`VM zrdqI=kHsSS?WdL>348Kct5hABCj_P)=neiCTrbZsV?o@NKrREe>faWb&+7hsIxnyE zJ0>)-XI@*)C+4&Rvy)imUU-R2w`Bc&OrdSf-qY+h98I$YG-jBrVAEo4;rdqT+xo{j8V$jDs4ux?SOZ&Y6*Ba?$C^M|Qt z3)X!S(n#z&bfoiK@HrpG&2ml(yQSsg^V0zK>&h|KvJ>Z1S4L&4!aJIeuCH+!y=CSMj9@fS#Gc=&gD z=r1Z+s*}6YJD%(Ej8i4cOxCXS&F{KA=T*saZf+K&3qbY#goTBrrKOdXl_58OT3cH? zJ3D)Odj|&x$Hc@WCnx9Rn z^lPwB(Bhh;JH0=MMXKIibAh|gLNCL`ekMx;EtiK{uLwt62f7}59cakroQN&?(c6mS zca(uI0C;CtN~pcx_kHTGtFzyb*w+% zx$#2ZmP?biU75D?+MK=6yF^dU=srDX(s?WwiLSc2ZQbpio9^ztwdC-fRmbkFJ9%LL zf%_XzKiGQq(T?+v_gsS9FS_U9(f!Exi^ku%^X$;I=SOe6IDYHZnY)LdoH_CA{K@AR z&%V5J0e0Ew+bfUW-+21r_VbVTUP3M&ee&eVn>TO1Jb4Shd-VJ3k3ZghdH4Op`yU^_ zeEIV0)3-0bzW)C9bGrRC=7*C5m_k@M{xO(N7pP$Kub0*~bUL+V<>lo8i@oMX3HA%K zaq#I(__X1Yl1<1Wi_8rUjLq!9)1>x%cF?`Lz2Nbwx!%(?MOm2{UR;%a;HcU-^%KXr z;`Xj7>U?4f8VU*r?j2_ox}$l5gOOofsd4tbGdnjw?=BbPsPMVf>7dEN#v^cH#+K~s z>|%l?i@qOBTR*?P`1QTBv$d4fD`Uky3K$MFoUG*76US%S@L7ZTJWM{c%cmN%3oKx0+8nSfU}y62zFS@ozs@>mv(!-ZJp-G@g9e$v z#D;7RkB`$GPD-}7JA^4Nn8m;>QLrG6TW3>(Q=rAMdm=M+lO!1~)C*=j>eN`aqEqDH zThj*NJWiIQajHz;MCB?C9vz7Lt-0kyD}%%Y+1M>FTW5B8sI5#%5A6ANgYm!U7v+A= zn-5hO6!b!t)XnrmqVY3tqa_ZW3Sa zHPz!`%iPXot5(HKb#!~-_;2mI)_abXI;*Z1at9VJWz5}o^h83%4Z}rotQrEY3&jnY zo-pYeUTR1VSfllJOK@(a^d{!OS4lJ2-tGuz=6?A7hH#;!!-1V^_qxTpO+B+Ryq@XC zv=C3`>WS7DWqB16*th=q_WF|StHc)?&5Y~`>m7??Rz7zMD*2TjvqD$=0K-b#H5YrT zB6nR9o_mesqR1=P*Y8iLOn$O9ZjV~ZTBeCIA)YH@w2pWb*7SA>DhFFUbcy2CO_C60 zmTzf4JN1sC>w4Bm)mzE@HyV#CRWA6oLO8X4u9ko@zf0zXps6#u87?seeq5<$;e2rI znIM}B3?f0adE6Y@c|-?%KDm4uD7!1zV4KE(T_jM{jX)#*D6bgd$V5fGwchW z@c8ZV$hk}oj0`6h{CTs~kjX;gW?Q=S98HI!pUNGZ^1jyFy{i1s%(gM?3)>=F1{Hoq ziR$T}O%inrGN14r)^-qiw_(K%j&q#rl*3YPsR=ML9WeXXeISH^?}Pb+mtJAL&JU7# z48#~_JoT21VL59OHbJ@SRBo{p19Jn5jqiaEhRhWVavG`)$`2iV`3nv)3Z2-~a_6Au zf98cU&sT8Hc$ueIU(3~ScAeX1e%&RGm9G*)e{nFd*l_UsO;X^FPiFYQkihuy6!U~R z4eX~C6m;M1N^(pHvuM^iR8yI#n%Pd)Q}cjF78=`05)t8s4Hu}>s{!T;Zn(+~G(syfLz z1l>Dy+hNXuV~jcvIO`A3dl}`zASd*B;gwzT)mxsq$@#qudnFuoK;+iFs9&|g)7vuSS2rU zx^(f|-1eWYp*cybz{5=R0F#_R>k7*Y33}Y=nu@2c*10}3)S26{HK23C}q3JnyqHendIln_r;KjW6oB#4|aY(IV00TAN*L8T7NdX zDX>n@pB)XK3_gF$TB1Y;%r3_-!S{G3e2eOXGa{W1Rn zR)1>U^yW@tM73hWwT@q^UAIE?)lE7?)`>LuA1uo!R%<#OHKu(3i z6Q++J82;@w@tf-UJZ|5~1^XEnFrF~d*?3^vd8cC@F*`%$1B}BaOwG;M)mZYpv5Lju z$U_qw?gdRxTDt?wfdMQwIhOOM@JjQ#=y=OHU2eVWL&t*tH!^71QblmYt+_#KJ zM#`CW4XqRZIVZfno;UT%Y2i$@iKd1YJdA3S6La++Njzv+?ycVuR>wE9VYcdU;y>Yed3^I6bjO|C!I4NYQ; zPW@7Sa{H-*>bNQd*)lOj>UPj_ut7OVG-xph~pG~beg z#nZm*e)75Hp{dcO8A+OLb0w7BbRL|T7SpA7Gy7E${|mlTsppw2!teSCTC}LD8oHM3 zOno>hSh$;8Z)tINy@_>|&jpid(SrPkF5ltWbnwih?BzPMPrWV{tMX>C zsp3(KrVld5UVpxP;7nKXrmq_(GtJy^j9aPoxWS*mxlzjwRUWZwvpe8d@A7tH#>rKj zPqS$@qGc!;w|qb zS<7-YKAW%1wn{j({BFj1HlKCOLLXSX_muhmlSsZ)yDt6c?zT%!)FSGazYDA_77*Now4 zJ#(Vq^t$&!0+kn(eqZ!@@~u`XLu9jy6jy@}?|0QH#>G3P3kXk3-|r+}(GbPCu;y*M zK-mR5Q*noIC)Z11C7N3rST@GSe2LZ?ZVWoHsop|z1*dpwP)`DTzy$`*1P11UDy9O4 zfD5%Z#eH;lXs|udHNEb2pw&cqd*#IG1?SsSSuZAb1Z({B{iM?RscbuwS$IZ`=r-}D z6AJ83g=HNAzCkf3g3=wCG#o7)-X3$b6fKC3=<;b~e<>yz(xAIms4;R|0#9Nx=YeFQ z<~lR;`ZT@6c3n$tHAQ6|oETmi7u)VoU7_MD>Xf)CL?(ZQ_>pO9j2leY)x5Vn5sPJR zm>Awu+>~+PitFdk$!v@vdeb{LbHwBY`pz%WT{ff7W1-80i41E*Oe+moe_m|9cd40O z(C@XQ&daT0uNo^`IpSt3E9-xi?`B}VV6GLS(A1{fS+61@$Lvsf=7reLR3|nk9q&NS zfDdhc2clnJYCV>y&AvgQ`$6Ekbb-=z-%0^F%VW{W&x;>AGNf$#r_^5VTlvwnQzNKe zP@APd_RT|vk`;Xpox;HnTH~D^)Afv`SPa@7BWJlDpox7oVD1r`+?r`MR}7in#%n%l44rG z@U4*{EY0GTq2Zf}43eT!ewUCT$sJAa=vRIXUGSJ?uAk; z1q?g~%(x5Lr&bC$rZ8~TKVS(-m@U(2%zuC(ZKLr^)){;s80sUV-m7{0Enwg{*Vhv5RxDyx{PR*NW#>&5eA+VC2dr=$nFNWL>2HppYqKnxBJ}`(% zv1VNtHPBi-g+)7wc_F7kXwZiKA3vAaeAKr1G+F3ilb_>K;XuxaTLMwL>X#~f6p!Ot znq;*sC2Cn()v}CP%d&PY%el2I@7J;dspUmh%S+Iv5`QgkkXq4Xwc=k()QYyM6&o?EN;{aSrMYRw_5HAkY>9IIM$ zV%D1Jyd6x2^Sl536tJ*6G8-1GH#6k$ z{=lSlfhl1D=gbW(1_I0i+#5X|IA=AmxifI;JY-E|5d7E0n0a7*?JPFs2kdN$9Lf!B zmWCW^4NP7S{;|40VCCUvGcRCK{=jJVVbl9lEb33xd{U^ zi?)FG0w$N;0{s)%k_y-w90VpzU`uIf@F{N-k_k@@6Ya*fwhcM}xw))P}7*ui2HjnM(q8xNvhOS8x4p z#nJkjUBp_T;RA>N?fR`O54V?E3rud<8Z(>CcQt2o09(ogHk;@z(ixl569oDTm<&z} zlq_J<&So+(5UAV0q@2JcFTiXg&8FkPyxn`V`UDQ1)hx;znAA2fCCnD^`oMTRT43gZ zZF$yAi(d<5HZX0qW{UZzATS|;S-yZtxq+!jK_F%UlY0V_+66{#>v|3?119MUj8CeW zR918D%iir3u-+?yN%;cf`_-Hi7BHDzVA|Hrly!Q8$!aE*3rq>K*;E+Vj#Te<;bv1Q zVA4on;`ZJpC9!X=wm^~r(}B|hdK;L!CUEv|IQaWDQ!@i+#s@}^1)PZs7`+47WE_}F z44CAl*^K6JwrpV1o3MrTA$z@i0#o7wj&HB_uzcKh@w7mL0h1vE#{>fo#yu=XJe*Aj znA8t!j%i?I`@><9!1VhUM@s^e=>v|w4+ohZvNt(!PB_5wLt9`n182&FV>haqWDc2?uuV~5lWo}4{DINifpg{q4soA@Dbsh=ua4fS z$FPN0kXemk2XiA^9?yPN2F|1pjGY1Oat7>O229I$Gu8fCm-vCPX@fxN2PWBsy;a%* zPBsED222ib1Wcq4FhAr_*}%fA$S(U~V?Ot`)jk|qHB1cE0y8IYmR?|7E`3I3!u|;f zOojs6R;<~tQNVI`4rkm4Mu$0UG8=aF)jwcLUBKD$fzhPlOy8QuR0F0rJ_4l%Or;M5 z>J~7`9$-o^*tK0|Z_)$C76mpn2F}lWwyOW;P&Q!F+i;;^&VEkCZDto34HLE-ZeYse z-p)IbQ}@C)Rz;2rHUcmAZ16E)a=Cqs@y+HbKK}$78dzj&n4}BNF;8ThZNsUyfQ9)Y z)Ajl_9JYHd=q2n9p3NrbaQ5r0gRgqntnQq9I*n5=ftfv#+47G-e*&Ay14f+<>&xey zp2fiSKqxqXk+Dm~<4_N(9)-d$7flZ>D&9PUY z`2nl$1xB;pD=FfKOA-WH446_31d}!}%CA0|vzGImG@IImtI7r(OKW!Z*IwauWS3rW zJ@@RzZ9M1rC+<1DnzJu~$>;6$nYNcy=Wa_peVp~;vG?BWo&RLd80Rv1KDcq+hqGqQ z;qJ8pGXt0}aM#~bFK70T6^JWf+Wh8j3O7ex0n4e?`*jkS(jTyARNvab%Ngf;d)XS! z+!~g;1NRpHy^xe}qttq+v!c(|A2_q2Uss@GEz5sj z_V=q#^63h+II!97W8#Wi9U--B*~(3Oe79-^9OwJUVHmLcX!Z4m2}kc%-SS|5P~ho@=*OxJe{lrS)V%VzqwXD(;V zhUcCM+u|NDxm2@hHC%0RV6NZ#df&n7XTNlw{rb)HBpNjDe%+f>PvE4v^tL#GgHNg- zueH82>jC?f>SvxktAi34B)RMZ9!Yj5EWKTL&s9et-GFJ)I)Nz@I2s%{`mF`JV-D@> z+o;g9_xmhPpEn#k-oEZr;Ar~5VYTPj8SR~y=DnHvnxkdHJ#U?3iP_s<{(ZfDIK*1?NC0vb~hCju+3uIXn7`PuS zvRrJ;@}I@;1B-VeyWfGll7lS1egcUHSg+{aoAWU^i!(meqhb0&$;t#t#)7%?K6R{b z)V7}V@1uzRvd^ae7K@Xnvu5%we82tVV%z$}V2%w7ih~(A(%6F(SOYg`_-*)X6Z}d2 z|FS@ZISW4b7`kby=?i?>^q$Ai;^K7S@(&;1Z*G#>;wGv3#rb?_cfnMXgTc%zEcEUR z7{m)sO<-VB@G*DPT))#aB3>YB|5yG}_Ad*c$TEI2bd&y(*Cg$q9$CepdQ-ScUN3)r zy0?D)ch$>Zdje()f0X7lm|dO3u0GW($RV&iAhh4;=TwHpj0p^Z7nZyWvF0pTQsk)- zw1Hvq`fsx?eCcjj9Nnl}sqjmh(~2!~y73l{Ab}nguk@+$$(#5cR;*;;e84azS;A}M zLN13{AB20$#VsTM)yHZwz4pIobSTQC@`0%QtSHV4^>W!$>}Cag)4n8^XE-Br6NBLK z=r@k_@lWRP7r#H?$k6w&pTkk#e*%NZW10DvTIJWvT>tiWk}w0q!v}o~EK^M~SG6!4 znA|+;4TncUfbcwK1`Yv+0tSC)-)<2WiGTx2qJ3N}0f`0-$_(lC+O=y|=gI`(fZs`oq^?!Wk&D;H(zcBAIFU2o(;@F%hs%& zlJG84oyXLcaRNi*6xU!5mVXX!COaNusgQ6LRA|t2Vr7uisXw)Oa-*Y75En;<(a{n{ zCJ)o62X8D`7{|`8yxUG|_TzJ`m12&GJmHt!**LExO?&zI2h&Rv?Yl9x1?i_ZK0V8y zI;CNczx9Ii=DmCV?GfXM?r?jw@Y&zGe}Dh}XWyWyDYs*>klQPx69dF8p@c&$1y&thSM0W2JgUibW8>o69EX)v*tIitw;W-C#B&GF;`BXZ8j+0EOgjwt032c zHvt+AtQ^9^HgnH}T)AK~C%}P`jiLVV;zm{$g9b)6nHfb~rR^euit17qN-WrREM>aa z_MxC*gR5M?f<}Y41rCj@W<9xgnWPdHG|Dg3xZcS*e}a-3>zn{XepZ1GzWqvF22K2Z z*8&y`D7TzoTJ6*&z|7elG`?SCHF)namXl(ux_5MopyM#>(TNqYMS3a}i>XAe9-6r#2RuHsG zFxdM2SKhnkq|(WZECJ3umzfl-54iXJQp$JJOI&o#;B?rO_3Cc(1XeZ}9Ov;D4(sJB zn8?gi@qm%d!|Qrtxpct?My7kN3Jq0_%m-f8w<(xhK5<;$z^0#>ub}D1@r54*9^L#D zF#Yc3^i?g5SEUsmFgy{oU|=j}EeM-zT^66qKSS|C(_%%v7mgiDN(Y=KPfwm#`NYkF z;f?RW0|ar^rD3(67%S^Fo6i!S>%S%bxa!S8|Cx_^(vS>-Jkn9p*a zU3lb~fLgt$OP*7(cOm|U#nLd@GuH>?96xdtAA!V>CLr}h7*B_*{((X zg_Fz{K4dwYbHVt8(ydl)W`(6fyc!HaA2wL+Si$KeeTAhyYfV}^;|@R) zMI0DoY&euyp6>ni!;`~$!x2ZR#74(h-tr0-u7Z|i+dBm+T-+z_2%GNobk$YjVsG+| zT4B)2_-~1jp9Djj!!I+UJq4@xn{|}`_QmI#%-F(K@l0r29*{S zhmP3E9HJjMY<7K73Fy7jB2e`~-8Vv!-E8-YvWDvnq8DBIJseZ(nQre4n%33LwQx?8 z!%BzNNo=hAD@u4*F)7SpnUbLpa6rWQ=*r76_a;m)Up?=(jfcx-(a+}085c#CSY4IB z+S{#mvRSlvQ$u*-u`JoHS0PKeX0)&z;7pqODvRf^YP{G|TYi&1#w(g~W!tuBmo0e8 z5ODpUfSGF^BTugXtyxTSB$hDQSsDO?z%xYi`c{W_Ifbja$oa3QU!mVVB`{7?DD`-$-0Vh!mMd(wSN`|?AzR+`Q&p}|J?kpP@N=e zpT-#ef{#ox3a$T^rlzWgd3!Mak({-z-ZfECX66HjB1_q2-;9>?GA_&L%Q@U_lfN!} zbu?4*Rcpm*KlHxqtWKEvbl*H3h3*N)r}WfW?w6h_Kk66gP~ThJpk|xRV7btPW$Ous zw{{1+)ubAjrremonsQu~zp#OIzs8Za55^{8TX@oHjV>Lp`lcZ9E!f?2b*IOZ1P+sp zEcLG0w}d~aIjqoEVwis3CM)Rn(b%8{pZ#WSj~0G8T01LsUbD;%hEgx@b0R8R)P7C6 zqZD?YZ|2O<i_Cgw37&n~o{fvmaw{+rr7P=B>azlLv9H6*ZWy zTxBrTRb%9v5aBN5(7XfhEmv-WD+s_(p!&dbbS0)D}nEFomwzz){o0VLXH)H6e^*Q!mZ%svXq~)WxYu=wTKVZ3H%eOT#xu>r) zvPbl~&)|G_=Is+kKVt#+WWUMQCJcvyoYh4n67tx;#xj0%S#a}R>m$#^3$u7n-0>Ap z(97hDj-4WOc?s9FulI6&to$Fm$(*k+v8(^z8V-s7m!+g6+jZ(QW?T|g-+6Y4!qM7a zug^2x_~y~c}~9Td49>MMyZeNgmLB=)+FWWuM2BMs^n z3zZ_auiKS8@u-r6?rqz@FYEU*%XE2ls0IcfV860A*lS;k6T`xfbF{g5-gU`5GlQ8)hu9OWKd@oSmXL(li;0|?>dYhYj0tkv2VR31M>z; zHU{3~8=(<&{Qe+&%G2XvEXE}kLfX2E@f zsD=Pu|4ha3$}IT}`SG`!_#eZ-WbkxPz7Z8;i!&5qp?qp#(g;&&vGn5 z1Z~uV4m!FtU$#5 z*P@Nt6Su23P5xWZz%;|nc_VlBlY=2|x}M)K>D+9`u(4(4&n}N2jItdJF8`#CH;9~I z*IZX`-YM@Z#i8@3t8|UKYo`$Vla7d{<7*QZbS~l4OF8uK1WWB7F7F8~N*5TfOP`o% z;^uaMdGm$^rmy5zI4rlhVd(kiu+4@kyJpDlSa5P_u(QpKBL^M`%v{rHqhY9d$kXtn z$mN30rOq3dE6SNBueZ75Tw-n8OgmSiBdDywAf^LOqz0L@8l+CjfT@MJk|yc=LH&0U+JhkEP2nugDY~!8P9o) z6J-Bsb&7Qy6s@nneTFNiL&Kt>JD}kK*S^veWj;>d9u8hNhs9SO>0F%1#G=5!%)!fM z(!j(Z`*KE;-k#pY&MR0y*fURPYP~%n*z4S*l8H77_D>TnL}yw&u4py}cN2KJmY~ zkclNi=T^@dyO)hhA69VvV05wQ@Cj&^*})*A!NhIbVS0m+dj*3c!|^r-&xt7u6h*q! zGb|Wc*Ry6EKRG4P@XBiI9nG3EIM=2uV3kmvwMgK_!i`5a2t5k27yY$yhnF6QF^7IO zk7mT&y%)8uC;Ve#wqP)QRDYgj!A>u){$l|>3>&2WUFsF%;XP}_pdJyBn7m*Xvz+mUFROCvr8oU&b5IfQvxN0I(l7)2!!{LjkGz}VRo9EXvRWND2 zIOJm5aBEBRO%sQO6IkRr7~~?D%~midS#;>GV9jdM9iGiN8rDYe~n!q>PBZ%|zW~qnz%O=k25NhD< zob=VF<57abG7tB)g@Us+M5F#~meQEOS${oh>cNFVPRSnMv>I-HFmbDB@IR~`+c~K{ zTVwq~fvb^c9v-+-pD8$fgZh1jc`UP5&dV_LzPOk*S;2v6_Qsuu^n*fqEjg~-;7}Hv z=-7L0{s&>X6O8;@o47JqJWnvj|GmIrASwTWvF}nd#|kcCUeA4p=k1W_QJvUix+*kh z>a82~Ni35s_SC#wy(0P4w*Ze|s|J<36Z<)DEEf#er_>8-TlU2KxH(r>^l+~L4Ifz`pZ z??AZW%au1m%$6@;`j>LW^F`RyNgj_kFu(lK_fK(hq(=Q&POD8kCPl~QPhjc0!eZ9Z z;AFwVWfApxA%p3J7H$ps&3hWO9&n^D<$Sm0+I)o=b=_{2Ik%q18oDv;pRhqF@2T;D zU&~h*gg*|r^m2m1*~H^~k^DZL6E#kruvrv$q@k}Va|hdoo>EnjCXf4U6}<0xZ&b0| zi4^K%*XUT4YH_i${`&GqI>)ZEsK+vhI7_{=Vz8+^k+*PK#H^bOBs88&J$Pub%Hq_W zw?Uyy1rszYHd}Va*h<(i zP2He@;aI|o)O&JahD#?zs4raJbam^+Hyt4?uB?1L%nspAssD~MMc1!8`zd}_fb9JS z`6C*JwV!S;<`JE%-C&i-!uHnIkSpe40mFLD1s5tfDvlm#$q+i*a(3PZrL4|L7iOy} zS}AW>a?13irALGOIVWD8R}pU=7(&-B6*}E%_sU-V#FBndu00|Tn^!Q&OlWa<8SC58 z%yFUF=R~8&vDm*3QFemDAwib)ey0=FV|OujM9HV6{yFFw&?9H+$six&-27p=dcnQ( z8zy~GV7ROzruoWv^9(^nq3Dk{l$)GPZ9I&Zc--ce6jvbs+g2wH8QL^vRB3g%E?9arNX{&6 z`e~VXw+M~<4EkEC40~Q&dlcipmyeSrAuDg8a(*f2qhCf^lCSQ>?Ef-nN!Jq2`n|p9 z{`mYmRev(!WZ$H7dpOqTtx{&~@=<8wI?*U|fKgc>)#V4{^=%CD7u>wGnXd0^kiF5| z{Gj>zvIdTdT-yiTi}JQIb38D4^e}44S_#&yyO%GTyBIF$X|lR#f-3MkgEx-G2c~OJr0;b9}EO{?`G#Z%XRi|j~cz09tgSCuH`w5lT53khEWcsc> zVfD`Do5C}AwlAFN^ie9BK2JD3CQIwr+6n=@E? zUSPJp(QK^6T`oH9=C{Dzp4U)mrQEr;#&5RZ^0az8-R93_;$UE(-cx_oGFgn1 ze`yD2`N}zG4)R29yz@FsJv{TSce|xnE(5#6jy7SA*QHGV>W=y>V7mBmyW#Jm2>C9> zizU*#cx_&GpLgk4p&8!FvGKk^&sUu-f>Uz(B!pt0_j@h)DxteTR^(eg`}e3bB?}uS z_-)^=^mXt0gF5~_XQPM8j@DQK^-5j zcJDmKV`pnsx&6fV10vP;zqhylFcyA4v-ZqRmla#Dwp`OJ<9hhzBVR-HtIoz1OHF_F zTy24D3Bj&!rfwc9$(wP(0*dUGZgO(&El*6*BRc1b@x^HDAI{JSCKS z(VQzD4QCe4nEWKTDWaEMVv<4-!|I*PNsOJj6U|*hBFHgxdFR{> z^6^~Bn)+20XZ|?r`|X&}-Tu+2F>bl~2a`D`Id(WG7Xq;Ev+uu6?1C#a{U<( z3^wV6^M1(|XRlKd;2U?MmmmB31c-+fd7JvcWxWn+JMf-^=};i;IW6 zm?yy-r@bg9OZ&`vwIoxJS#uVj z5{EJ9z*H_~$GBlZ(mY01KAVUoD=#rJmWkb}3=&kD zteYrV|3&l4ilF76_N+X~*q|w}ltJL%f>OnBR)M!H1`mo9MHm><{-uN{Fv!gbU}3OO zIJ#;XD}&Ly5+()4Ba`?|o+<_$NM6dq==SbO7sLCjdj%v-Q&zuZY+x!BPkOfcq%NbI z#oA?GbpmxrNXkfZl!6uX7TmRMk!-GTZ!uolCEIvIs)xB&k zui55&YbLqLEDspcPaSo*n|0jNwX}g%PEl*Z9%J27U)7&UbLU1dB+reobzYOgV0Z4E zfT8|`?73!)>2Fm6nFZ#yP0spa%HSZveb7X}k0)j81tpdfY=K^EKeoxV%U1nR>`?5o zQ0lz>w6HyXUTb}+upE<2fMD7=%Zvk24!TA6)Baf)GPyD`C>X@WJ$o4z&_3%M>|Rc#5dKWj`?SydlGbDcpvW*yRFS(iQT|cP_gyH9%)d5M#PzOK5Y8 z;DsmN>ns@~J1bx9RG(k_>*w?QN(+Sm21bsPSEmVV{qe|2=-A8p1xeGsZaESC@o7tY z7Eg#uVqsY-X-&8*$J+YdgSsKw;xuyH{bL&>fS zi`GnSS99r#JT*C*Y0j=y>*{lUUcK+f9mlTa5}NhuonOzL?|T0xF)neR+;0%KW9rTr zzh%=I`E4E^nZZ3bEp5Ye-IyE(R*{4Q$L0B>BN(OKOtkW1%XS-`*4_QbXaToffMEF3 zZ>v1J*+Q0FU#xHHvcYf4sn?U^&J`Zb@atqWSX1Q`WOYE+hlw}%8283iihjZMf0k}o zv!yE1p`mf+k*JM7vMwESnW;0ybIDKL+)@ViCkHw1mM(U2$gm1^YRxu3{Kx!3Be&g; z;3?C10yBB;@5yj|`_g0a5}Qzq68~Qh*JvNqyr?PRr|EU}@=U9xB4zs-zH~`m-aIQ# zdr8TptFKqD$UIcWkh{Znlb2d@`}TL)*WBtYJ{;t>|MNgst>AKvK<3^Z-J(;E{HwXj z_h`%Q&32v|$(3J1%lF)f6k09RXQMj5WYwg;^@Z1Y>wR|}Sdu;Inx~k5%f=-usy&r2 zh&;PDxn+ake|rXI4F{pOY}xFV2Ns4c*ASoR%aGgD5x=W>vW5(Um-}iC`HzZ#gkVOyMA-(Z)`{8l{jG%O-ePG`gA1j{7VVGH<3JHzP|&oF|{abekP& z-T^Z@WVHf2ZCMh}m)L>f=wDs6F4?^sr^X2N;WXNAY{8%x%QdnHeA zdFQfp#*BZxI(a$1$KJRL3)n3YN~%gp{KPhm`M@zgW&>^!XU$WAlQtPLN*rJk31Cp? zNQhsxJ91-{u^6{%0wYVpffY)}1sDVv7;P{0EDCw7#NxA>;eC`#WsHchyyNQ3TdP|P zK8vr-lx>(H8_99BKH#Rn#2srV%w;~nAY>pt!RN>{KMjY8N=>tWZP9HLc;m%1!-V1g zL?4Gh0R}DU4@a*|-8BE-pXVPI6g0$nB?|IZT#=QSVAZU3$${fQIOBXT9ajW}-L3Up;}vK*^-ap=hUOOKsAnCHDo(j_ zvsluNSKqqIrO#<{gHs}kfpcXFlfV>)K4q4Rky1Sj0zQmKl&3uAknTCaqUPaTDEIL8 zT$zW=B?-DEi+^u&>2ct(YHZ<}W-!%wMuNcplPtV(tA#&IO4#Yi$in$#fsATRLp@LP z2j`5=VixfkV(K$34sp!WzWeu+c=W$G2gicqqBg-7W*ReB=m(tm!1y_9+vaTN4Qd*U z4}EqhunEMSP!6)b$Nl*Tzr2I9zl9Aa-}yfE2{Sfu8412(Dc2}qO{P*U%| zV9cFyAYty3#IsTkjy!P%EjQI3aWn`tb4NL_b#x@2)wXCVH#OvNFK%SjFZlH41Ou~~ z{=)iw6AT)KN}SpyA|iQ~u^tiR5WFou$5FWdUx3p>!`fyEkq90m3!`PGhMmd>9x%&Q zIL@6b)5djK;j)0^;aSN6uUjh=d5R)F3#HwDoLhWblUZ(y8iOHI!0#4rvk!;reJ`ZD z_b8k`6n2o;WFni|fd*!?ghN877Hl)=QDBSP;K*Jdr2EdhpW&qPhbA?JKxUPOM$Qtu z4dT-R?x-3xa-KG27Eij+X#e1dV3FOS{f>8p?Pttpj!0vYxbp0w*qR1zlNSeyH4B@S zO=?(l1EgiG3Yf$z8d;TJY*st)fl;-C@ov`SW}!ZYrZ;+x+y`wBv;W~OC|}OVqL;uZ z{=|mEeTqXp>kn6>Rjsuwvx*l!5aMe-;_gtW_P~-?@A|)nI&q~EsR~CnS%$+-F#=2? zDvF%43`N_S^(z)}RH}O>G;XU8inlL0z%#3Wg;PK;N90JgB3D`2q40!^uv+mQ{)1f6eq^4Chm~9+_{XBGL7v2bi`XvGWa{pt@LGD zBzp9_Z}huD2gxKK!qFkjtmZuc47MV}^eUllY7STssbMAK^Qrw>^kH_qa3nkVmb zh|?s2=g4j4D-E1m8n|aTu+Nyzz2Jf0hWV9_hd4YE-qtegY>gI*yUshKVfjJ__7@A- zFWgfIxqhqTAXkk8;_UwGMw-SsxcR-fDis$# z4Oa0=RXE6IILV&5=fva0@#n#N#ZM7 zRYi2IJiyiP(1~RM=f9MNj{^@0?rGpkXy7`~z{s_f>%sxf1qX`uHsoYEnb$qez4s#P zq$7vTQnj9?k9k=Y3><|z8kIU68&jJk8s;c1IGCZ=qTJzl|KU7^ii3g$2a9Z(BnqZU z{J180VV;Z%<2u25CkcVX_@aY?294!`P7(!-;uVbI299?e4@v4c3Z-NQ_&7-_9OT_` z>v1LHg{LgC8jV5=8fUakQ@)XTsP*7c%|>1sM~Nfhx^XFf3`|pt8aJPmTB6r7t4dsQ z%aRjU8yC!TR1(niV`!SG*O;%UDZD{*c9Yb}yA9$QHzW@v$bQhQ?-TM@wK>TA<=iZb zhBbFy1>bOZ{g6d`jYAxh_NJoQ{|-2K)IMN|Eb!lC)hfRr(yu0NOWf*B*90cGI5Ih$ z+?=GnqiyvLJHE|MlbJ+$w)CyuweEGVk<&Vclfn`VyKA&}Ut7KR)I;vMr`jg4GTm9d z|KI9Oj{^KJXdiHzmM^B0w6LRoM@R^pXOG@m&!||gEjmsj76*k>&h61*l8flB4LFy6 z*hC+`iJx(GNByyG zlfP_{5*OyV9K6KFDk{*x{3G;i+awX6BO(EfEe`)yuV85qesHi{qq9bb$84s%+=Ua& z0gU}D3{yg!7&#cWykPaR?K^(#L<9@NcY~(58G*4Ljdy0T+>ToA-?)SDmKF%-%OoSXb8bO#F4G>tIMr?Trgg8tbkYtv+VJyZ6^o zWn13p9ob(RUPm7kje2@S=?0_doyN5{4$5+zkP2l|zH#u_t&UHV-jqGi{gTu!b@$-+ zppJ|Ojj{pxayJ@f89HCT@;IV*WC6p;=@G68nGObbb>uTwux@;C`R=Ak zr@Q)O?;m7ba(RgZqx|hg#)9)N{%jQa^TzRxJClVzW63EI55_3l1_m1z4;fAq$Je%= zTqZByroPbQ{n@J?JGoxe{-TmkT>gH(Cz+#kgnb9Abzt zc;R5|f8!wY5}_LvEau7+`NSKvx4uueVbr_H8R7CV^}r@IgNAcYToPlByXkybaN&&| z_XRhdk6+aI+Cl^wBpU242Q(aLVXSX$b*lF|&eX{#xY=(<_Tx`)Z`@<|I@t2krXgy* zsr}m5%sc-1yYP5l{#$Y4~r}VB_vF+u*=oH;$WnUxihVIolt9uGI2!!i}Z?N3R3tuKg)mzUP9$VnfOL z=N&2wvsJwfnivio{*~?CUYfxERWQ)2@y=IA0f)HPESr8@Ws+WN2CiM(4j&D7Fl(n*a&v^6IKjz9Wug|7S zU7~llzVMqQtiyEw!&;$#{0&;><>klC85=?pGyFF?^p-ORbj$R_MHHw!IW=EsD}x4u z#_{$8EZsY^-a1Df%PT31kp5h=_%$Od!{sS0FQVS>pLaRZWMiU$11oFWah9v$4;UG1 zSeKR*hbq)_2Lv=SO1LqZ9AMnR!tVNmu_jN|;q7sY2F4R!UAwO`+62k69^hWh-ub#C z>q&Vhf1lvoqq1K(;-57B5AjG-|Dm30mX^XPGI?!_0k3xB)>*&bW!tZIG%-yU;SR7r z(Enrg%*}49Gv15bXgq16FB+hK;!#h~_2Z0tDlgdR-|ca)U-q5vyV_aV31*2u+V~ht z_wzWkZ?|d_Y50F=y7NhX;i@7&O*qAL*O0(!Vv%_SeSn)I zF(KzMOBc_9mfuz%dIah%GIwl|IVtj`gH75;^fy=Y3zzuj;Du{+{dAfPT3bXC*ybKD zciGQdTg~Y&-;%vVKws8qN7pH(^)8|QN4G09i0d|FD6pJ59?Z0057U%A!68jE`5Qu6 zd6|~%juAMZXy3?`A-exRznq05b4Z1%k7FOtUnZRc!dtE$&fZ{m{~&X{hJ%xXo18@> zlgR<+CkI6=YFz>tyFD8J-ujbQSZb3R%by9^JyNgxka2dO_P)pVb{`U0=Q`Ux4gYs4WzxOq zfB7=|LJI1FD*grT2@Ocu_3Zm(-}<+KFAwi!)^K<>+oq>^-=_`x{5=?%8f*d=yqQsL z9l*2a?ec#Nx*lBpyWU&7?o(oqj4>41xr*U?z?~CT`SySO!*1XId#bAQjM)L^BgZd> zCr=ewqPNMP(ZQmi$vxPynVs9KaMOj8A}##fMopIvaEdnjbKIHu=--2ri<-J6tSTox ze;}*Qx4^(EBJ2P1azSmiQoH$R($)xzHjoQ=p5Xn`5!XN|uS4!OQ&@ zPXD-)S)|^2T2AEZK%ph74hiY1>?|S%9t=wt+-Bqu;)z)B=^O(qn~1=Lms=)H-onA6 z(J)Jcv5}=?u1JlMLSy3|u8?Pe6RtThXtFIA@i?%6p=lc*o6L$DVJ;?S1|8*!4I#mD zOcQw@b=o#CHZl71>1jP+P@KoeC^IW`-<->|E``SyF-o4UT{&kTQIwh>!$L8`2MwBP^;cRNnKM>DX<#+k>CCW;FUMfj50PT7Nla2F-kSS%MXfhe)r%8}m?t%-W691+`_2zwx1JB$3d~^A{JtJ?3 zmiiX$4zBwTzIb?8aYr@y=-Nv$Y+rGyN~>Q}S*gK7gDv2r?<2lV$@L7(KQDi5VE(hJ zMUZJxi$@pZ1(%Kh(e26&U0ysLIgDi7nv^g{^;UH^(Li+#-$%L6vEZL z9QV+D9GJQ41vpPK zFT67$wd!fgg9QbGLVOL|%irC8zn_smMtey)*GC4~xjQaD@07jaX{;R>^82CMzxj)j z8kq$eHY~7_tH{yI;SAY5NnOYylu^68WI+jQlI(?x%xT6aj$IQ^e89KeF8YOnY4r5k z{DY1BaX%iG{|iiW`*e2mYMHHVT$LRQuGJrjZJAf^QTh7xmkEtO7wH#8zYcso_s7SR z`uA%jv?n%k*>wHdq2sn_12g}6-Bm38)*p7n*W2t$KgFl{!GZP6R}CG}qWjLD4Ahw9 zRx#9A-)B~gnCf+>u|aUlgN|!S+qkBwHf9?#OcJ{|W0PnDgNjMRk3~YPLWfl2QW_7% zEpTG3|8H}IFCgO~YvBy%<|)e~tFWgc*AOB9{tP?r@g-^?WL? zQ%aZJmVZePv;=5)D@0bQlUvvrj5XJZuTJec%^(!oPfuz-reC>rDI&lB8b?v1;7VSD(o& z+nM0LTG%!*F37{7=$*qXW{U@H<<$omxfV3co|2-la!F)tRPxM^DU)X3{i62e)u$s~ zI***f6r~wXu{G2)zgeQeln`Cdc8r0+LotO-fPrD#^3ESD3=9kc4V8Q?3?*_8=H1ac zA;NHAh55}_3{9L4{}_&ZUB%!a%&_d_BnBY?xhEM-juNg83_J>FdP|=<^FO^U%ou^|{VcchP4dh6Z*I4X(@edzcyBO#Ld&)-!U3 zGW@@#%wYB~k&Ai5Rau*&_88qoLLm-WdzJ|_EWFyffIEXBe6NRL^NnQ=k8@UC+mXz` zGUuH&Cr5y)+NOgSc4&4p1*~osy0tChBRgZj7H3A2l;ER!Wj!y854=^GqW;4mNpPKr zrpuvU*R7V8tc^GI2>kOk#%9aL>L-^1(YXhCNR`paK39RpPrd?mUu4Pg6>hCP3sk4O}GF6!w)@E*x`g8Htsyr6kX%|>b zl5%w!g06)y$DU%a4f^=3=(d%cLRhl5R!^4Zl5;;lERX7l`Ox2}vqQ(sFLX-m5fLc` zuR|qltz|P-bS{~2;ryfT3WsyAc6!}dT))ojfGG>ZfvJL7=FK%*%6(0<81jUL8kJrK zwQ6;Uvwvtvd!)@Z-S_~*ikJxxgZzZGeH}bL{c~$mGlOBfz1-#f^6qxV#g zVVQu|m*XxRx&@9~PH%shb@q5^r2|8W_H_Mbw^OBx#s~jcE7bi9W>}DCIw@y$s*_;2 zrcZt15vC4nsm5pK$HT?+864hb1&AkHXfyk^v3V-HR>e!czy*h7S2(mfxUp>Xt^0J6 z!NJlvyzq zv8QbNZo!_MM*cspJ2}KnQh)z3uv#o^OY6NaS@`yV zitDcPCg)AI+s}F0vEi-XAI_hScDD|Rt9xG9FY9nh{!*bx(eq2Jk(p;^o5z&ho%1HO ze4@)4t%sbiYzl+w9beusZG8RVRCw|&-u(5(a*u>3e(?KLvuovZ>!%;I4m>jG6z^Vb zF?p@9g~z(yo$GspzxIDP@n-7wKgGLlslEzS%p#TPj&x1 zT`2!|1J5L_f@LS#MOt68_~>rewElIZ_HGEv7D0#Yl}(HR&c8Qw?b#i)-QxJwl|lcQ zSTyble^O#P^ek@KnlB8FzrQS5!=osn!XWX0Q-Wbhm+vo;0>;J4Q$L)UpY+^8;=#NN zFW;S7%@Cw!vg#?{F78ENPI5-&GDy`c@C!L)uVC=wd*mL)kr|XGn6_v>N5l23&yCi0bKGm1K-;Z z^?V-<_`eqL|J=a;b^_la1z|ZSfjtdEvzqx1I0$T465Qh;xXX#>!U2BOLZQ`4!VwQR z6q?xL90aHTOXl=>Ah^Sc&*}jGszdx!7=-wgghLwGG&YLHPSkvsz~UjO$dbr%=78ml z11tfB+D{HJzgnQR=K-_KMFpLSqVXRk;y1FHeXLj9;lNrpQPYS~VBSWBB^wnK8u>0T z2v}ScWOEc|W90qgAZRNnV%jM1Cqankk@VRHzGZ?+PaZJ;IUsmRL5Ba4;1dR37Dqw$ zgZzCDm=9d!=WrD6G8BHsz}vP_Q-)DMfJtaeps?IQ{&NbvyCzDhZ&DChsA&37>a2qF z#Er`Hvjyti7VyYD67)O3Jx@u{r-6r$NySx2AR>Xq=K*uh0YR=N?l1-(zXdFI4cuHx z;(-_WeHz%xCUUzyVEGqtKy3aZ@yQP~Y!9%NP2>wj1L}gPMB+Crc4) zlmeR@gPQ0j%_9$3_=1EFJrFi#)bUl&Iq0B}$-r7xs9PWHAi#K#)s2DGM}dv!qVnHM z%VtfK;cwz`Tc9+PNyx83U4EhTUj{k#gW8M_1y4O-p0q&Sl!5ia1HnE879mIB8X=A3 z1{uagb#+D|j)k)FNqlArEJqFq9$3KaVkGFNz{d7a@X!KgA0Z)`M9v3+f{N-m4E(WM>qe%D`%*D6H~HP^6K~?SSC<24*pCaT|3eX_Jq@g<99Sd%DR53Zz-prC%wOa=`-`XiA>n32TYe^i9Sp1m z#+vpG-n%D>PIM6GRT4jG=q$cfg13q7-WE-riQIh(Y(58gLLTUro7A(NVBnp`5U}+# z^PUBU`4<%w7V=~~U=B;Lk^UNWKg0d`14W@mmLm>YrxNt1Ht+;IuzhRHTNKL5GLh3O z!IArru&koQVFo3IgRD=4EFW%EV0*}XPlzWh#5YobO++vxcwzvzQ@Hw7g`@|pVG6u{ zS6D8TdZ};XaYzu;{vzamAhw?SkllXKXxnK$Dqj`%C?qdE#Ba4ARQ4c?MT5GcBdebR zFGC}z-Gb!l4k3a`GR6-%tQ=JL8cMS_@&z~~{F}I$c?W~Qp98ER3yf2XSzk2B+cU&+ zFXFR$!1nI|zethq?I~zq0~%OY6|pDz zE?~*{tjWe0;j5sb`6a_Mfh9!2`s$Y)?*#3Kn~XkBW)s?`pf*`u)R8reK}6n>E#VUD zo&?r^3{n5DBpEka8H=+DUCe7VZ$DRG7RddG$F0F>@gc#ojY2Yw!p4e%EQyYXg_VpR zN*W&&F0l%N5Tc=9Sw{d1rA(Rv@{fS zV{qk965>$IJ853QdOTf7f$4k7!+RHY8YObdh$!x9;NBJ9r}nU@|9ZXt3Fi*&`QPeY zJeYi%@{b9A5Mo^r)~tAos>$rc$~j6*eT_4?roa6>FITAL$ER&OG%W-kEn(ua`?rKa<@o|G2e$c- zCN5PH?peUjlc**2uzTflBQA!vQ%WrXKYP|5Wwc^m@@u_>#YvYmqcIC&BnLpbN3IJT74YqJK+*^pHX6Z*Y6ycHN8cm31$ zx8U=*sq78fFx2rLv(`)Voph*znB|Ja81quC2MXLa)bn!w|5;o0GJ z0uAk7Pcw$3q~2K*Qh!A1U&Y(s57IS0Np!J2Idr4ti^=PMdUP$}+izh9jv#X}8d!)wt@5-@mr}GMKRZa!H zHyGwToAXYgAlF+X_tCrGHzW?4%G5jT)@9;1`hBP@mF2#VzSM%Nm7~R;ZIYV0OO+u32(~ur- zEj{(FcPx=o$83vQJp3dU?Q>@QvAXIPlZD@oThURMmSpbTU6s&uis`E+|AUCHWhcJ9 zTks|0@xNJ`y=8~`RPwiKxVH#8?M}JSop$Q*39SSBm@B`;3ZMDAN5Fe^z6+YYRNk`OTCwO!DpY?hmsF<%Q%&8C>-ZbI=A9YP$3GK=wb5MTuM3o_+N+%~-73$Ibsw{hW%ka{ycX zJAtl)vPW487>iynEO>KZbIV6Nr4=q4T9;L5>|j1@vFb}3)BXC_dq3=Zr?8^#Si;U5 zdwcvi^i!oGAMhPrWi|Vjh}})zr~5Z19Z}D`%Dss9Q&Z@>C&2=ToVgl0m(IGLF3Wvo z3VX)^1s}POw!gD?XxvzvDyZ}S6ZegGbCn+3FIl*xD{9Si1~FL^zUKu}f4w@IKYgFD z_jOX6c^d=Ef?dlW{GPO4=2%FnO6 z6f|;F&&_;rP4Aok=^VEw>knl;%dgwwJ9pmV_=QQkErb>@)ZP8}B(?UqXuPma<3~|L zJ}rh%A5)BCY_+2PX{Mada655*o>JPpN1R8RSO1u=!jN>afqfR2)S8lpM#tt#u6msl zhgT>bY~tm*qiIn1a8av_b=4mZqa`OMs(8<`=`>pE)!f6wb0fpRk-?ftcq24Ilg%SY*X5IUN}M54y5&7-)64J2Wn5d&}SuuyTPggP(;JgFx!Tuz9SdW*R3} zG%zfkx@p_lRi2Ctn%sh1J2o4wzqhyM_pkc3l?-{R%-j}Mk`3nkObo$%R+$XNiXv=Y zmd^wkmL^9nDCN~Na1dR{w1ZpHP-4Q&#nN0gJYKsRmL@EdbK&{axxuZt`5$A7rxkx<|>1KkjaGx1~!uiM}k8Z{J7ze#Jb=Bb3I>3+rz}mo|9Sy?HoQd3+87Cd9rTI zG`cOo=6b1_H8f;lYf+CzKtrGM!-o#8Oa>PYv^`g3U*PV~a^L_nhloK#P>+Xa>^~=0 zNe4ORtkjT`NsA@f7z$MLPGv5CvGvJ4Cr$>1`D#w88!k-v`SZy9mCmfUgc*bluf{ko zzO|CG^=W)rxQ#qkc z$DcLm>A$2+Ib0JpmnM*Y?(>7GFD*)hl-0H_YfL1KWX+&X}*4_%b(l{^zUtaLD>}hj4Jf#@T&k z0>^Dcn^%{+i*O1AXhlsj`taw&E%yE#1~wn@`%O$N6Am!4IS4vb&Zu`@`}0z_tiyBv zg4TTjB9E0592mqpzm_^CvS%x%iY_Ue`AF(zQ&5A?!xN00AMSpW<2cCS6=2M*;K0Zy zz-oDMC4)>$2qTZeKXxI@1_rJba&1cr*!TDrw4T?x$7pb4GP}rHg&+@x#CIDy*aH}| z_zr~fEi~BAF44fiUcq!t>tPs6MPUoqeNBc`i$zAlK@YvSXC6A!bjevGY(k55OOo(x z7FP8=?X94*xfh0Zx=1iZcPAWCy2o+cZ9<1&uk~Wt@5{_5?s3&G2}yLNSNPN(fcV>~L237sP4Zvq@#@g~OUZFLhX)2|BS}l%A<4nB|lXbJ&P1h-=h2tF%mjA!g@A<%Tuh(P9%t zr<{5w)V*Vc=UisNNluLOGO}Ehbpj_iYXl3MJ?&5xXzU0-PCm)2(6u*3N<6`BNE4#mS1at^11%(mh(HFwS$B zb);wm!%Rv3ew`JOYXTb?xEu821 zMx_t`4sr-SP|w>cz-||!$i#QqiKQrj)sAB!Q_+{#!a@&PSW;M2x36Rnd~_fsE6S;! z!!qLVBxM0ZUx|ZE(GQr#lnT^dMmfx0TF8+9V72Vy8wZal2>N}_>ono_XRN=lhq>9> zCW5tb%Aw$hi+tLSt(qAYwciyPMBWuhBrvXH@L#|rA~m^PQ)X#uP{VTnDzS$Vr>ks3 z4)nM$IXqE=$H6Z5u&C&iYT4b-SQc(=V+xL{4;OHFs>Q%;z2Z~cj)fji960W^=1wZ? z;&@i(aw}A$Lu^yz1dE6S{)>$#7(+bQO}=xC^UYx7yT-!I!*I4e_$i;xB^Hl#*M>r_6f54DeyS^` zimFRou2h+Y>F{;Hv4NQwZ$d&a)3iDpLvf#S+q%&OVn%2@cWamv-&YyOa zk?j(TTt%`LlR`qz_Q+*N%DmKWoKWM7TER5A_d%{+at6PXYtpWhK8=;xhuG~du!!k3 zT-AB7Krm-PgCftSHV%zASE76*u>A828aZa1SeEND#{rab&&s>D6KZLL< za#~!-jdoxxZdY?j$S+jLXIsdc?Oy&kUDDo6===Aom(K+&8Wli=nItyD_Vx=H3)7_Tz&8c7G}5e9<=NdzgA?C3~P<1%pTALfIZ+)}B;# zMYc%xLMgMw#S#@c92-mOdp0C~`^exK$Qd+)!M!CpWFlwuH@1laoUINaKb{#JQV(bq zU<{kU*^$61pwN7-UC3@C!-uOSGcRyN1Td}@jCQ`jG3fx?t!o^X52B_mU>Dm^Gp(Rg ztblb=LugYeLx-4%PE)3am{;%N9^U5#pO#n6c<45%Rh&K4s#_uQrJ8_EeV`^=0=v4a zXpjJd(WMU8&Bojp+}vI42keU+}a1`j1(pz}Nai*~u+F+cg4a2C#@Mh|W=K z7XMJAa?y;_NT_uJv*-n8%LUAS_1oFbZ)Fw@U=2<66e5hycY-O$7yq+n&DD3hDWZji_xc)+_-L0(_1o;6Tm zdf*SaX$RQz9NB2CqF|J zn<6V0L;cf8w=0@9Qx7n3B-HIQQRfaQW;-CJ)ud9>q*6Oc$n*%quZq@ZftC!<<{dDe ztuj$D!bpsBm&dASJr2R{2SPZf9%b+=(DOKA`1hpxu^)n!8}xV!bYBH76zH-L^O&lc zC|=K}H9>=Gv7y%D=M&jAznGU7xO6AVR$W}c=BRkXaAUzs{sEscG(^r@xFgPoddCd=u*TKrG{*V4>Y%U-%z zzj(<~w~3=RQmU*#uiJsuev;7>rYy->hUE?7uaB$LKX2;b{lIW!3rAps%CR(oLM?H> z1ojSB)?||vDq2ivH$aQog{n&_R)wQ8Z4XZHpM#sfMG4h$b!oyS}w%7`psOO5AnWA*6uac~TeKMrr>B_7DTDnG`)V zymU!)=i^NF-AUKGRCi4>+aRoM?7mJ>dy~+X=@Lo84;>Zd>MyNZ>7=DITmHnR#S@D~ zpF0&YH!yUxDm<(3aW7|xa9;L0OCXqm!M0nmpppIIMKcx+6TerBY#a++UfbImZ3_0@ zDzrt^a`GnbM;m7eEK9oS>wQ_I>6h};i$bZN3mF=USsANbKX2xrEzjgMZx*BG!h@#L z)@Bohm8LdL3O&8OR=VEC&QZ*M)mH0MTVs<8c@GH|EmW2)@?pGb%hyxU~U z*4Wpk#>Y2$|6cN8p`uQObL!m8+Hdp?_@Dzh+l2I)N9|*;61Z{Z+N=V_`pU{ zpIdu=uHLUE$oebUPuy#-!0)Q-w>QOI*1p{>P_1pkk+6gBy7J5b9q+4dcckR@SexCs z;=S|m28$(0olW&OPVL-wNr!8}f#2DO>ectmUc^~%%-nQC%TEuLRz`u4gdGY zxb3vUCM}cgLe?&S3VCyO|JxWOH}%uueNFrJT64y1j$6HI{YPmA*Uc;MIcYSDZ4c}@ zt}Y{5zu@)?wnm*PMq1$znH@H><<|F#r?t=H{3H~ zSn;v=c8pe9mO%Hy6U>`A*bXQy^_FP+opt!hwrnMF?^7h{Z-*{0p~o*Eh1;Us}yGTQneHwT!IWzQx=1xQvCb+5h*syl{7&UqblQ0`})A zu6zMjR<(ZDUb1{($?}eg+-viuh|R6MmVNfxBo|f&gVVXX*NfMBO!2v1-dlfNc!>;8?4ioH z*Xwz0Ue9z;;J(qCd&5z=NOJpv_Omy7*UCM8abu$H&B?wur{>TPxSzT7CA`+PAmX^WNU5dwa9*?X9nKZ*T9ty>spD-Dhv_ zeS3R9@129XcMkjBIhuRtc<-H)Yww&sTYu;5+dJoZ?_Sisd)fEy)!e(+d+**{d-wL) zyLaE-z0Z5^q3*rMzW1Ky-h1AA@8#Niug~6l`}W>@-uoYQ?|=5a|26mi_ul(I*WUkq z_Ws|u_y6-gVAOlS?Dv2*?*V(?0|6F~(>rf)zI%`n==l0{Ccoc9WkK5?CJ#l|JyZy^ z=DzSiy6!%JyN7 z<+}$VZy!tld+6x*#5M1Ud*2h!bx*v{J@I|_#9!_vBO`<2PZow3%+nv#GwRn1gKt_= zQBi^4wB+LA;_VH(X(>87Iwd6~J3G6iq@=pK`jW25C4I@u#?qGz#4o7wT(wrdYO8)u zhVh!S&JAzVn|_wp-3@OA*{#qiUTapl+Nk_atk>-bmwTx}_p_t!Ci*?dk9|-O|F9(G zQBBUn@(kf=CepL4#p`ESa81%xm~F2z*I8q}o6bTn%?0iTi~UTO23al-wOtt@KgYpo zb*$IAWVf}6ejCyu_cKLpD~j7unz9RYIa9)p@~5rk#%BNRo&Gz!{`d0z@9ObCDCB=s z%zyvD|8a@`(=z^-SN_i{_`k`yX`657Rb;ho9?d#vJUHpFQn)h2)f7rF@(a`VH@B_4xpnj1ef0~kuKRRocU$}aY19ArPx!xT_5USH|8L*%fBlC4^A`NSv+~&e zji(>)y14!R!QBs!pj_y5=g#MohrgUT`t{P8S7+`%KXU#1t!v+JUwd=m{^2L5Pdqz+ z_T`n6&o5qibL-mMJ3k-YJAUH-?K}UkT={?g!vD9IAHBc%^yA$Zw*%fkxcA}F{RjV_ zz%F|F{r2^*=TDw}dHL!a=+dV@AKpKD{Qu3H|KDGK{PF(FyYHZTpWc7?|K-bVd9YUnbEj< z*O4nc90|vks4y~~QkdtnbJNq)9Jje5e0FS3Kg4zBRBfxnhZ&RB3vrY&e7>rEW<&Dn zd9i`KPtNbKt>;g$+I}YCq{?|7ySJCbBQ9>4tQ{{m`^?)rOdKj19}e)$@|dLL>Qq-I z^qe8f<6jV$j>K7SBSyA>q;vcBR_~l7BXPsVp@H!e}DQJU~2FEav8Rf>c^Xw>KnYnQA=hP%70r@0TwhIiNnGI%3JlD$@++bqg>e^6g7nb>S zD*w;#(rLbYY7R{b6OS$Oe!*MT=D2QxxYD$oZJnxZO_B?eQ&YLVITWGhUB>!iBkK&O zRErHu9B%e~bdYj(`{a-rH%ahh%aj$by2H5dROvYSEp0rulk;a&+Y*+*Nyp0er>*%| z>BaY?o0;)WrGVsbkfI zf~rT>$C8*#Hhef%a-DZldEBg?qJLM|zsfkQVe3s#u9=Xjb%Uumd<{chvdGy9Qcl8Y z$CCY(+&O#Z-JBhul7850X9A}}dpW~lz9(Ii>mT2+yu~QPP&nPN$x>i-w6L>h>s;Bc zdVvWmxkNml^xV|_^Fi8BH{$k@S2_$wnN>5NJ4P|hl9OCFK}X^Nn{U&v$yo~+XWkO{ z`A8;_N#{c%Q}^)aj_(oZ-zn zZ0Vtr7i^W!sBg<6aA2l@lG?txiH0l|(JwlVAFStddQ$w7aq`E!BL;UG`z6l(KHszD z%I+o`E*Ie=(Tz%vy2Az87<~%E(@j(aymI^v{+-$++f-+^`r6*7q9)u8*EyOTxJ6wG zu4|w8-Lyq+6=zzLn{d>Qy0+bHUP_%!8~v&d6$?nay$xlSXx5(P(Qu^lLvMjf+kGEr z0qv$fYuEZy@`iDOmdp*F-b@zZtd1#L)m}|hG`+KMl^eTe*H5PMjK^2+F*UgU6}@O+ z`{#0=R@;0@p_Wj;H;GTCs77)%jR`yU4~uX3d~FjwH7&i5JDw zrNgwG)ugQL`V}ttIDGrye8@J5FF^B>qU^`k`7A1YT{ZudPslJYXb7K@nb4g1RMMh! z2g6dK%KbhoKD=ALJ0!1AVY$_FhYy}7n-1{Rv&>A9nCUU&mg14>mP&@A1vmXH7!4OE z&$>1L$T!bJE?fn)$yUA^YJooC7HJzW}ZyqA3CxLg*qMf5*lIkrFM3IMpkvD0jWw?tk)yaRQB+9p>X{*BKRazR25o@l>zKfXnWxt+Pn2;znLG82=sTz4h(k5SJK5_ClG8YhWBW_{!Y}tca!3=sa$RV}j$h47F2D1d zA)F<$m{qxJAXb}p`gUi^sj`$-RV=y)w2e(7tFMut29O8 z0?Yio&E5h5su%V(dFHR%rP<)D*0LznHSsvhqT6Qcb{L0Lt#)Bg@)P|$!+_uP7XN2< z-+I=FDK<810;_wgALR%gJ33!Ceyh^Li>j~9PDq{GH1)~NYmG;yGdyQXtle8YYj1|Mb)+vTa-SNzwHgUp?y@|3fkkyi*b)(>IuFKX~@4?(nS7qLr&c_1)JsF3$?g zpW2~Z;K*H^Y})a0llBYq=c|ehuWedZZnFB37-#j)`YQDmoeMAS343FG({<7Ge=Z8k z4O@r&-Pg3U9H(U)Cz>k=P4I~4nI_V{h&>>|fmA zq03mDz@xj^ac3jO?<`=r?utnG=yp!6>l7Bxs zc`>8V(IQLM{dPuc=Y-p>&}TdFXs4fK`GU7+Zin?M=J|iTqvy4&>BY6HskVw5 z(~k=TY}=r4@vsqxaju*3^iTHBS51D*`AD88|L>q2XuPAkWzOA19UW}N9 z1^eUD$j!2!FU>|Vt%#pV2WuJ6re*Nr$QD%Vw( zm){hTbrOzyd?i=1)$v@Jk$Hbaje!@>xSQ;#+nRALB zVwhvdV0FlDRk?I}dwX1w=CA8Xb-{HCt_-&ihx`g=`!^wxA#O)t=@)hO=~XNWoNJ7f z*E9I)sKzM>MG4O6WC>KebG&6igeb%2lFLhy)?F~}dy#Fw#O}xkMg9Y66F2)*hp-h~ zmI%0#TkkF`!Mve_qtQAxLX$@zFV~oJsUky$LPW}TcjIQWQ%#n-pRE5JX|HT;zbF_G zW6Z#uAeU-XS(l`It5DjT#lc_^!|Q`44?CP13mLW_be{A;h1o!(N!fhg0n65n2B*_i z9;=&7FAC`p?)sM@YTMkLYA*3KNb_=HTrz_slS4a8{ZGyK8eKEu89h2EUDtaIDZ9d3w^P#!t*Zu-cQSOw=El1;$3#|1@Ei~HG z=08eXJ6TiV5yNvK&fCHAhKm?7E_k1Q7Sx$(5?nbkL5Wl7y9{Rm+lj^wz0{fYVu=e5 zi^x0M@f7GzT0VjAfQ_TGf>6bDR>v6=CUwl}oNhQtZt2chtBdOy^xEtE${XIZXwH(H zzHg?;L2HpeuY!A6JKQLTd$-o!D=3gi<>A>7OOuCORF+9G>aQ~%Y)&||=5A%YK zFmNO=aC~48GuPwaz`%8&o*{WbF~>%?goksvKXausi17rlZJn&gAE3)KOW@c_0U@ph z-&A2E|*AvWGeaZgmQ>UluUlC1C!`*i=j0+G~-Wl=waa zPQDN7Wv$lpe=PQxwdAcKr{zt_f6ud7K27wJl0Fc?%@N3b;DK-im*8dx?s|obOM`z2 zKRPVQ`9YS$)LmX|*_Mm!mJgP)GIE%0;Nm&Ry)b}B?<1%20}g&h9vcBRv5j0|SpsVk znE&OjT4t@-zUO8E^D?!dtQAuoxy?SXvL9r&xgbyzz`VI&xz+=A{)6160xY7A+$IOu z**9{TBrxZ_T4AQhX|>s>`&zbXQda#cE$M~_O!E^2=6_&nxFAsdfvNG7(EJ5VyI%?H zc3_U#u$(oJTYCXJ$3d?BQ38=w0%caKl_!?hP06vg5GejqbHz(?N|iu-!z!*oo~i@P zh6|XiA28coU_bJJ!%2XP`6H(j1J{uQ?6ns-?G`X6OjyYj$epl&+4=zc%2@&jKCnC0 zZ(z2%z%<8;=jaD^n+42{1*@4aa>i|7wqC$=Jc_5%VHMLw_DX}b2N*bho?>ov;FmBj$9ZuZ zDzGp;WY#^f?uY=JHpBX=e+YAftLxNG%l1?B{Ao?z|mTLPG!5|$sW zT61v0j-GDj$XlFR0&JJ9)*dn7KHVh{C&0YNK%j90(_yK4F8zWvYaZA>9g zfunx``|MQ$a%a{bJhif60aMinj=l#RrW2TtIP92%c5(lIZ2?CI=6bW&%zf1dWKQpy6m?MaV)VADUf$bl_HZ04y2x(u;0Vh@4*d(9 z{1e#?7!Li^W|gc5i+{(6_J26W=6JyQwLt9xrpGY?b2l(qZrFQj z&eAOmXCr5^YhSp)t9YpD7pK{R4M!Xf!~~pO%gtt>&7ynZ-)TDs=D1xKG-D1W1RPzt zi`(!4^Hm*zScP2-YnU$m=J?%xp6TIH=Dz}aSuGy4$G$SXQd+p-hqXZEflC64TqYlw zoa!GihjQ~+USOKK>WJ0>X2$?#6NQso1uoh>V098;Vg7x@;scZYhD}U+wre*q#~fg_ zF<29~fXRCgvkAkhBMOHsH(WBEaOl7XR;>hPy9vyDbp$FGFj*?FI3+Ay_<-5=15?yn z<^mobJAs`}ADHYOEL~Hx+28@ISMK5sPrL%HZcT5jzu<4f{Qix=!U^n-2UuJ7uq(u# zVm-rJtFXuME_>Qr*2W80*cG{|6NozsgX3 zU4g+Q1J1o)xP*diMU2_%dqfv_<_d23zC}knA(L_jk+LG78un z>e=KoU&wA?U9o{fcEg9m2CNMF0ul8FtmS?@yA)Xe`U&*NeeJoxC?~)^X925x1Lu(g zoHGqr11E6KV0i0ypE2+N#|#11;1Apjzf~&Pe>W*~+;h6ky%dr=NM?bBX+KwZ!jL|BZ}|eoVURmdRvMKXrDKKZBM13%M$T z-xn9NPvj18_;qB%m&gr&LjPU(a^%C8!1dgL2|rmkzK;0MxI#f-f58jpLe{VZfl!8* zJoC9W)&Dbf{C!VPo@s&Q4twie{!@1rF=TcLy!W>iXxlF^=?6pd0{xVQ0t^$mxnz=# z)cM|Y%8@wKbYz>4pmc|g0v`KB=$G0a-Sa!lk)=>kSyc9t5^lBI6EOiUR{bLak) zPSfKr6u+ms?5ML^NQ6~L;u>#JEzR(dgIYhlLs#ut5h9v$r7=)1Bz#eWKF4!r<%m^9 zqFWYieA>jo=kTB1z=4rnWrG7V{~jI9OKOG<4Q#vxs})Q*7EEX`sw+O)V6@BWK>hxi zM}pq*FtG_ZG%#`mD6fcF)WN(_TT6*eSks0hvs+84EBP3oO+ymb2Z@PJU3^vzPF($$ z76*1|8EoX3rk&B!G;!jBn_3`quZh~`6H`4d z8EjVcyrJ?hO~@)aih=QI%)}-B_7j=8MC*Tac%}wKNF97KJtjz#L(IqE;gi4+rBhD> zJuDwS+5ScBWQ*{zkX0fVe|H2v-7`%^@PM;ncB@c33ypYXbBS4LaI7aiOPBB%ozi&RGxe&(;YRi&dK!}q z8)!k$zqLRceB4J%)YSO+&wO|2o1!ME@Z#q4<@@Vu>y4Sq zr|~kZ)_NLM-JoByu#NG9mp0P^-|T;N--Q?#y{Xg=RPed9fPt$%>;sSf$%*V`B1<&q zsEe=a@X&Hf61*76A}XIT(aEQ&lmA7Ipe#dtcvZU5@2eNu%w0|e7dXq9+{xr&xp9q& z?*aGPiWAzqXL{!Ag=sVAtX7>k;X3o5XAB26x`=Pk=#fd-c=SVWI@d4F4!wKVH26al zh39wmvm0zYdMM*uy+uoMz05-msbii>j7&E|=SUQ+Zn8O`6ZOz5bf3^PcC#bmJPv_A zQa`w&emoML&K+MI!o;oXa&Xf1jU4fA?mTWT51E5I4zJjDfl<>Xk;|!Qu}tVruV1RE zG5Z>lww=2q?O=I;VLgLNUWu^SeUm4mNrF;77ycD6B#9L}pPsnHb=!kRxB3N4qM;RM zTo)PaYkRUtaPb`{mnF>_-n?AqYgp1Pwk}(s#i<~4#G~ti(U#dUn{p<|zfwKjU^&@y z#=&`M7R{0p&nKO66>{4U5Ttf|$E4IIbpyi`FJ_Sd{X(-V3x$-`4K*&VGgf%ZkY31I z_|9$4(u}9&`wSR_QZF?)*(oq6`bO3>pVORD_wMPG?vBGE29k?cRW`VGC-}S)JIL|1 zQ$;*j!b3U1N@MMUw+r1}R~>%AA)_euK>OGt7iPW#_LufFF^aG8V(zoN6fM@m!@-ap z(abp|KF85Z?TC}e8irs?krcuBHBK=b3*>zw4o(VgIJ_W4@n5^<3?uG)GR_R!W`!K8 z7Yj?U-*Z`8?xc|WDwauxJG)%#jBg%)mm(p{z1TCT=w?UEH>I5?SfxBAZcVj0FsIEm zH|y+Dw#yUN)~kCrXPz*LD7t#iY1Pr(yopcUxpW&Ax~&XtW$IXW;!W`Oioe{nf~vUTjMuM-d#X35l4rto*&~<&v zeYyA?HQp3IjqS6}3FPkICE8v1v|99u%OM7JIfjpIP2A2JjT|i-I5ekhX!)liu~1+} zsHf(<0v6SJiG`eNHBRWxTEL?EVTOoUnrd4)Q;=+#n|4~@+mz^SLhf7_HtGlWO-;Sz zaOFplP?u{ngV+z@7>kD-eia*Cc^o^UA2bQLII#Hm7;*$ZU=sAuaB*x2>m`=0V%Qid%9}Fdm4w#r zJsZpvlA{D)`nM!<1W!4{VUX6jI&tpHiQ=*XM9$(Ysl*6mMqu6G9 z{@Zf=lTmS6229OynH6ML|)gdOa5Ex9pl*Pu-b)}F@WLFlr_TZb*ha0 z^S%X6kD7hmOy$fglLJgyi`U-z@XEP$P4IiRgsd4e7CMQZ`rz%=*iskWBH*F$!N((z z#o2^KytRT!XkI|#kvWY#TR47r#|d_N%=xZ5(P76S*4>laq~{u~PuNzUr|!qITxUT$ z@5WT!{~6M;e7{u{vOIER9M){v%ChV2v?D6dR3=xfKO*3^;=7O6L>BcoQsV6zEyB|- zd|Gh)$R20?3P+8^HUz^?xJwSE+VXd|j6q#HD8Q zP)yg-MX>MAcU||Sut^X0d21v#FkHFslEqQ}glmzuj-WCx(~RjqI2jCgOBk)(KlxU@ z`XwcQg6tEWlAFz?ga2{5STH#W*xPE?x9Y0ce=hEv*}d7g(CW(})hiE#Jr4+6 zb~w!Yrpw4;cB~?ExI#07hpEX1XU?6Im@91Vax(mNUe1u=puyG9eQUpTNxRNB}yTucI* zZKWpG=UPfTtT}ARy@uJMIXt9c^Nwu{2@Iwl%(7=T#9eVQ-5@G|WNpVPqxFa8{ueg= zUw!1(kGaZ^mg)rd$vjcs?CgA{Kyrov8{=lfm>pZKg`3S@8&B76a=fuMNWqBf_2%f^ zTcZn_R4nWtEU-QC+cbQE*_8uJk18qU{VS0*=b5uao1;F&@Q9s}R?>mPAvqj}9xJcs zVA#kgwPw>K)>F3A6n3>)?BLenko9r8CeWZJv?n5mGw96RU$<9zaGZ>h6kIifMR=u_ zY|NI;g$~+*qKgi$KlW+Awj*E2ORXe}9ZybnF$)~&s9w=|_*ilY!_$feMhk{V5ez+E zP7_vH%uvvLV$tkTe_K}YF=wJgi;4%6k^$2$VYbAAjmjQOQo&6#l-Udwm{f0UbrLwe zC8kN$gC$9!RsF(gm4K$Nuela2IrQZdt4TzI@rg}rLJPtzm{%9;E!jM0{}uVw8JmnH z9FAEkT(YoOlX1dk$u7@5oGX5NCK()TR%vtI%rPs4^WP7~MH{;3udO#a+xDRU#KuWo zi_f@r`*v>-a#PvU63uz#2(Pe+^yDB{Z9}^|M$JYCd+!%BoVzVS2mcebd2*u3qkivw zOKGEk-FBSD&$D|OB$|Ir*6}oGHWcW-s>31dvz^zQ*?wlrfls>})_94$<#M@m$5F&W1E)J zbmJ8=>+blQ8u-K*tzUQXN}+JWaS@y6mfiJMSL{#8Y_oD%Bqeh|NU-5ovr$Rce5Nk_ z@Pvja+lh;EI9zi(7R|aUv~vF{7P)gd9ZAf5OdIT@Y_Ik8cyxd0Qp>&|=6j7*>C~&5 zlS!swZ7o*WYkOr?bxbx)J;Y-(uVVe`g!LtoJ4#sBzc5;F$2t3zjaAbTUe*J1fB(BB z79QGJFYX)M5-fA{=AMIxg46H1PFpdRA%ekl0gIOd!;>{!iMiMQN!&R2(01C2!+t7l z2e?$i6(&BFk?EN`O>pg^WzAsMZnO^K~THtf<$SwwsCARggoiZ$r-4;7q=0=#PvURQH z?d;_|wEEN)>t*WQ_6sDnS0o3r^XT+T2Rhub4>h&^6&=Erd1da=+l_+LP6RNpYc#Vu z1et0aZmS47B+9_%AR4;lOwOLLHD0!orJVe0FQxi=Op_F}GITt4@xsgx7nZH%61G`( zMa()-()=Ty#~f!(?P59hF(9S4>-*aX$2(%{Lr*w8(PxX$IJWBGmXq=VN1Rz4`m!%a z%~;A6zv7_lY~SwUu+U6i1(v=P*Q?OS9dd%*_vUw1pdDjhs? z!>N@e&hV|C(l4o)MVu>y|LJ%#)K6i&cBXB?8DV2)*OF@oxpYLvOvS5Cwn7~(<>}haRZm-bg6(&+sCkyRNGMSOc z5qC7qM@CY{%leIQSj}3qxP~p+439eE4>3s@t>bwcx@|=f!{Q^HOhF9B5t2a?E%mb| zcUo36sTcT9H(*isc^?XEV|>U-gF~Uw!v7!$vNpLs|bV9fx~_! ztipGm9VooU9Fk&Lcuh#LL1a(p9j9i$fA@Oo7b`Z`S}tLfiJ5a^mqam>iUO1R1kNCj zCUuP#IcewVA5J+cu&8S^O><@zUl;Fc)ckah@S-arHZ0tm9fKIU{qEH=Jf8HFHG|=L z@*0x@2CYde{!bE~actlIRECocod;7GRKBvht`WD2Y5142;)cUZ4~a_;7Ka%##M~-q zHK~{$UVq~*D@Sm*z^e&rR}3Q<*aMswF+Y-)vhq~0GR>K6Qg~xST2^;M(%-2srx#3K zUnefObAA23&U=BJ>KRPVKQ_m@#HLr?n5ZM^rNGR;hL>SUi^1ZM zX_XOP5eyS1Yb{sHWWB{oI)r6Py@QFW1i%+9sy5g#)R&mT*9|1Nu$ z0*i7)>a-uPl@*xO3|Nl~Ejqj~Y(roE8|#Kw-(K+X&s^EckiB|!5Zw)q8{Nrb;g9-LLa9^=r2kRjiWXoV+JCKsayY1Gyckiclx_q#k zZNR!?aoF7#ZtC%!RwcdntO6IWSxfAj7+3yn+d{AYAlx0<=i zyk0H5toAYEjA>5dOa7&CPC6wKuEn);TSu^kfpP+qOU8>!I(u{+Ta*%-Tr4)YtZ-it zKrVn>W+KYr~tIi~Aq`$XRo0#RXr6&@HFbLLP>m?~DuX zbgKX7(4=b7RGr_H5#Bt3WeWTL@Acwe*DSc*X27b-a9TxzWn0f}(}>Qyf4;SgOB&5I zS>Kj)JZat3m7mw_xUIazsG`68nCkmzfuBJq%GRz3irLW`=21EE`1wsYrr9dDS|xX0 z(+HiKQr>a=XItUSxoPv(ZtK)ivcU~!A*rCSECJ?tJV?u1(yA|_(Z3~yMy61kjgT+{b zdC^mzzi;>cpTP2xhi&`!-}~AB91#C=Q2oy#^FN3CjpkqH)VJV8+eay&kf&U>tFWC%e(4<(OUtz z9hVdSF3RZ23EU=c)iCuJtB62jL;7NH9)^LMcDRWL^~G%8-`jF(^%>R>hF zXnb=K_Pkgx0w~ScMH3qa~Q$zvoJt=y1|Wh4n*)b@~L>7xjTl%75RCHG4dn z<@hpzZ{Io}?@4NwZZKfwh(FT7%G~%+yo+NN+qsDanF>cbgw(y(xHR^z;Z)TqTB32N zX^oy%n^H8r(2dN7|_l4-4(!^{$*JW26` z*P;%d{cRx$o@*3OE}gElWn=2YmP>*XIXfqA2zWW0vu@%)CdNnMT-+N~v?3fX9=x(? zk^5x5y&UCnRPGHi(S92T;)Bnyk z->+~hb91~Hd+{G9Cuy&picE$tPdfGJ8w=WvoXOX-{FIV;l?e2Cmr_h z`S`$L_KrfQ8o`AP64KK>w=h%)+Zx==HsA0vw*!p%JDnJq*mNe`nj|w<@hKCFgu~Uc z%xzD&=azD9ZD4x1S2IwD`(M+;c)pG5j$GS#Ojy{|=M>zibG8s$#HPezJVEEb+pc?hx=mU#(%nAr7GqhF1;~ea*U9atdZKaxuqFa^!GsNN7|LNcHN` zZE*S$Tfy?-hsvf!y`IXGSMVN?amkp#m=d&Bk#qK(lc4LOgr82Cs?TCzFfqznQ28W- zL$7Cp)Da&ehUsd7R~t4myDBv>a{83NamkQrU^r0EE;C{7KhG76suT4qxI){V%OV;M zEp3WWco;8W6LE3{Gba<{(Is0M89R<__^8o5S258luI(X-loBU;aQoAr)2K#xw$U;Y(C_d@0-$ifblKc(GLRrn_p$9&dN~gV966O zUclDdlyXZ=jE8Xzo3x|KY1OGUceGuKSJ()g*1OGA{Meae9Vb`!b{Ef?d;zb$X7ecg z{W5v|2kk4nt}vPZcG(u*YHhgbdESA|jz1q+A3EZm@;1ij@Ve?yj zz<8xoPBN^x%}Dov=E0fqOnn)XjeX8C@I8=}k~3gnv`FBoTK$l>*?24Sk7bshlrJ;q ztuUEwaMm*I!9|rxHx5}|+Nf%IbD^(VAe;H$V~noSCw|lzs=aT_*JxaFqMn(h!M$tF zzk|MP1`V@MT@bp`!=1=I!8<@IiCrM4!Feh795u6zonKEpN-Ueu@bAe|>%})1nMx&` z*sfjnGC!dt_SQ2s#o~xjWGM&p)?Fn>iX zXHmUmF3|Ge-wc_bNAIL{Oo=EspwK3L;)L8MZu0B0{L7_(h_%mNmK?SF7!RgaU- z>~$iGH!B`yR5G+_tU9K4y~o3h^V(#_4cc^_K+4Vh+J{%DX_0cafnrc6XUu`rVy7Ih$%opwIkFViia1KUG%$9Ta_m-Ez|du|e3If4 z1?H=%C+b-o9<-V9Jmmf76q)BT>vz;;4k4vG$_&^3b^7M=r9?VRa&e0M!O-pG${?b~ zCbehfjV&w;)weJEF$DeE`(UT2_F*q+*BHa;#wub;Cz?AxMa&86RH`^&RyND3`~?@g z3IijjMsoAX1q>`U3{mR~7)oml*_v8;J+l~YOiNoODpCK@`+(X?7OpHO9_twmjj~CH zIUE$46dAOd#RL|58p+r#$$7-GN5;e8nL?9caE9VWhl3oSY?uVEGzRUmYJ6&?#vu}s z#uAsu*}xoiO?q}3W0y{0`IpFZ_y0|lNXyu0$^7BM3WhH+cjhQwoFciG(Wc}`#g=8A z_0kQlMJigkw$tmgZ%9bre8inC@b8@P;^Mt)S0C;5v&fPUT+^97n;}}8_kf(sH;t@? zGkBDycbz!Kqp_#Y>!Y^YRFBP^MY$IFvz0k3Ok*aleZ48ifBvRGgBZy_x2L|Ed~&~P zVTjh>b&MMdd{o|T^*CvsH1D9Awm_W8p_;<=5(j@pg)>h7q__4~VZHGkvkVJom6~md zm-Zau$?RwmQ@5SnZ|AU9aHlx4Qe*Hbjz_!_0sR4LhNeagkB?1MI2@&7#5uoo?ZbqH zEfa2LJ}mApJLt1+?wZ%)cS5#5Tj;n*dxA>U`(n!lK5tddUu-D8$)mhLd18hYW7`yl zReOGHVHVV|*gP|4_GDR|36^#v3TSW{dduBd5lZ?ZCcsJWRJ&1f>Wv#b?db zOg~`l7C(`J*`^_iQ~Kqm({XDr9^3Gi$-^XO+eo%IV`9=R3^d)2R) zYr;COL!mo%N+8GT@4|&gwHCgwS$p7E3v=OtHLIPLdaS;EaMQF$-#6W_6z5M^`mIfD z7smv)#sdHQD<6Kp!tC&&BV`(c+<%+5cSW<;2mkuc#PR+M>jDNo1x7K2ohR=pVVddFPd+Lw<_LOy4>Dc~}`{}=l@&9_|{|hoZ zc{)k4H0+jC;5oK{=iGwGjS*)f!@ebQ7xYYH4x8n0cfr4_GyX~5-JS3t#j)G&?1lJ+ z_t>3gsqZLjw?LFOdR*pM9xE^D~C zI~QDxy|sE_{es<7;x7p@bShpEjJ?HZpvd}2VTX;_A(v8JQ?98GF0&Z;bJfgy_&IGWUwlGNLLyfrSU{c%z=QxczdSuU(qp7j6^ zrwH=~`MoO^`Yz~vHFdIfPgthw)YtdZ0@rH~XFohfkkwap{REz`m>oJvm~V%yQ7bB1xjlH|{xEoyIM zSv*cXdD6;~aiA(jl4U|9YmbB3xdr+PVOE*E-_Bmx8GY%z_g?3O=0Ytvqv{>oW-#& zDqQNphaCT3PxwB_a)0^AQJL~=PR{vX8w73(Hb@H0|0L?F$$QYikbbXPdFTz zAEWBh!N8ev+hKtNQ=)X}BOc3b2gB;KLV&1!wyMfxx ze!8UlpaA2Y2RW&+38oQNve!KrZ{NA8?#kyP#nWI>c2wWuL|EXNGF?@}6Kc;mnjA0G zcWq!{=9GErqQG@-%S_gPbLO-hJ0#G+A?@+vx?sbxv+CVk3ubLy!LX~Tl*@fNubh<2 zp<*-lnGtgqOSVtoX<$kTWLTo=YO%a@8fR#OTZ(D2cTa1P*P|ji)?*wUx__FUec>uu z=%9M$U}DPbGcVK(6;9bQd9a;fl9+ImD^q5j&DgDYlh-D_FaAr=%zFI8JcL zE6d2==2ba!@sk-Wx7Qq+Gi}vb*SRaL;^zt-mT(D{d~mUlu~VK?i1Enj?+gnTTi#UM%AZT`qK(vxduM zP6L}w^r|}T_dA(XH;C@Iq*>0uF6DD}VchwcjDF9reu|t&3j>cb^4#8S@XE!fsqaOH zqPDF-;_G^m~G3H>#GSqIZwoFk>0;d*hnAN4 zc)keUW3cuCm+wZtJlRSe)jR6ey^Ns;WM;gX=CEh=L7wZ`1`I1VPM*`|8ssM+XQJ9X zqk$!bfurC6r-YYm$^kYXhyMi!obPni1|DEbInZp9@xtwuKuL7N!pjB{dhhGM>0MqW zyyZue)C@*R8+Mti0j7p4_vYld7&Khu%-`>IGyF)C?3%^0YuYvUIZB^l^z3nxy}o6ZGC**WijGM!R=(jMHE)$vpB&$0J&_8prk@ir{L^-tKk(`P7u z$gJVOta5-MB`-oIWZDMd&wlcpst4Ay)o)<&-@xeR?&M|=@uXu)NtpOQHF?&01CI6$ z9Q_8I(>HL=H{e>nfor`1_x26k`we*d3mzUb;Jv)V{PHJiTj$~^8PmvU{CO5 zJHYTmb8%?M1GbGq`i8kn94Fr7xaxa|N1tEFc%x{%;m(u6Lf745dT+B$J0g<2QNp&hhbTrq< z)x)SnNj`K>laz+O|CUcaykcQzTGy+pCoXf;67R3inW{dahjslqPVQ$#cXr%3dY12> zw(&}b+>MQMAC}c^`fFxnQhvIK>keOWi}nH)^Naj09!wF7E-Ptn(4KP8>7@J?nQ2US z0;FUbZh7>#W=73gvRQJ%g`IK5*3t(AdmW>Cm-81+W)#qjn)*B{tJuXv$eeNFyE7hU zr`Kq|;I?fRuDAVMy!D|m_deCSWsNqfB5dwVhMzVE@g_6NL|Xq=`5SApTgBLQMk8ay zjM*2Snkb3In-!QG|I!=t?3+(h)ZLa7y=y;hjBW32WPTIY%zKh)3Zs)G!+DLna+VIU zd-VCd1ix9D+|qE6d~x}li+6`+L(;!CJKcsY6Qn{Frd;^R;q*h8snT#U8q@)AQ=pHk*+UctpTD&@=G-?ZBgj$!C{J%6?n<+2mFt)0H_BQq22K z1cq+8y+X7wEGFuouUug`YwBa|0*#_j9v9c6kG>|}$`r5I?DKV}p!D1c_3F%f1Q#v6 z_W9<*c*R&5c#*CtI+tao-XlfB5IX8AQ_ zbECiIPQkCgTAw%lc9P;TRlarGEwEluH$LpgQdOsyywXZ9Ov7eeyeP3{OM-mbjgzY$ z7=G)s(VgVE*&}QDZO-;Xi#5bZMG-P&}OE%B#3DX~b4_Kfm z_o$z}EVDPkB}aK`{;u3Thi1k6Og;62X-?zCZEpR^iSuS#9Bhf7^~JDf=XM9do*rKQ z`ngY(ShqdU(%Z)Hhr^fmrAd$l??T~!E(!5M={HuVUS^W`H2;6ta^1x9Pb$rH@9^90 z{0GWKFfFa zuKRy7G@ic?Jft$`XgOc&abxi_zbzEMDjIr3Evq~>L&4MaZdku6!xilVe5pTNmNa^I zZFA6#z5&yUSnD324v9tayny_r+(a$St zmiDSN2v->B?d;@^-TORm!J|D7@>^9t?TNp?LTb(YfIrfEr|;<$4q{N?y;R*B>vFX1 zVvTP5^WtXdf-C8%^AlUAhH^iW{m^PTaGI9OKoT0z0*CRRsYgH zdE2m9i4BeoM!be;S9biHnC#v!@7N|{ zIVr_+vU=dMke!oKy{GGY@3Jy>J2=C0{Uw742RGgm;p|Lbax^>{8pGLRB?S~tE?CdZ zq-N;T(Y8>so0lcP%HvAI>Rx8?oEq1LhVUeAIWt#*DM<`Q?6MIl6>1F3z4ggVb56d< z&JAf^cS6qeN3es+$|BydE7bz;Z#RcYzj0;wsvy!*r)o-U74)uyE zO3j%P`Ne;mLE>>f&YWp(Q3sN)A9}knLU-DhinTgn(Pf2?k55$3e{qVj*`%p6&}j34 z9{mZ0vI$S-L?tk=TTG@1IAyhk zEC-lUUpIKx%w*AEVXxLY^G`zP z{Fa?e1`0y)F^;DVlSJ;UVYEGbSlg)iMM&-elOH|ZjcmMoRu~C(1~xYs^-XG7^ZV7D zGsb^TdM<5rFx{Vwl1ES--r zdl@%e-toYuep-<4-r$6L_R^15y9R{U_%JlEZkw@CN>X~7#0e8GEq@j^jmHhlL1)gy z`SVw`y0mh7JUHCzmRrvF;gOWW0|v1NhIf}wWMN(GAIG3#mSA^tt+Gc*#gXWO@L$cX zMf3G;zu6r5iM5x7!(ag;Z>^&817?HV6Fr6%K8KgJsZ}=c)a$b=Gcz*rRW!JJ$$dD# zz(gctcB4Pz-PwxA{+-Nfxa=k0uqXe&TH%3)1z(S5s9k)dxA@>GDf0u3r>|BhoVmt( z`xRryPdSrDv@LXYuIARz4_Z)0p_A@rJ1rbK{|dpO^L=)y*IFs1re;H)l&g*1U;ZV1p<;tJ6 z_W)PY1*VvW1=oJ^2z4nuap36JU~^_rZ29@~phBI*Y)2-+mZFPI{5BU3^8ItL73`Z( zRWmEDBBs!4#*af03W*OnO%FMV_8svtb~(x2`X$n>pY zV%HZqBwq1gN&dkGw%7-aT=&?!BtAIs+ea`mecsR{(;>*iFEf4WJ`T1!BF-F!KbqwB z1lTM3O`0?nba~XwlgnEdvfW9p_mEH6z}0^yiOulc2R$ z1~toz$3I|wlet7pKSAAjpQ(3g(8dK$FOK|Ewz}9V+R-GDFhj#l=S8dNo5opB9v|fT zG+}E|-;^b)rY}7My(Zc1ahSsUvc=H0>1@&4B(_gm90gXbU|xH2l45m4V}8skCfOAX zjWU9*To*XcOSCXfxA?(m=yb42{J{Y>vjz2yyge!`QWc*R>IAgpq&Icx?MYy@7D)5D zI4f-Hx~XeZncesbx&#%UBrK3(Y~lJ5enI2bf_Xl%*gnI{PR5{wHDSR~9fQ-h1{*{cYge@Jrxb)WpHUJpoWWRlYgW|Nb|O&V}A_ZxpskKRn3&hm+@y z!?u#xBd39 z|Ge4lTYMAPss%d#*DPocxZp7JzzgOkdqxgVrbXOwKbpk%OlZF=@>nqG&7t2B8`-J)_QQPIOEel>&j9y(`A(p znKkFmy1KUP>*~#fb*ZTM|#~Zccr3cz5w;tGctUaWMWyNI3=R&_`-b?Jrx#YvP*8isP3-m zGyBig%!KmWe?E12@Fd4hxb1P|4t^jX$)!d z^`Zy3L#DNPya^06-&3X{sJ6?+t9;%;!EErpZsS+2}<7%G5k9J&tb!@mV9L?|0gc)uRWUnGZ-*D z$!GYzj=@^_cm1J$#TdteDaYPw9ARKt{3p)s(Uk;-y!`ilPgy0C5|1=7EYW9)?iM=H zz$nGQ>!&Ux*T87B{QitXqNf%xsyr7x)xaoofF;(EH|PbA)B?s8YyGYqV4UP{SK}xo z@QmS-!`DN~LJI9acTC_q+xNswnRiw*&#Uv|Cg-iMC+Z{aR46*aqMXDq!%tbRfIYLH!TP=EWq%IFqfASk*iD;+I2cksFn^u0VXclTLy8K+ zjJz*%E=um~HQ{g&I@TM@Q-9#O&;!Z0x-KUYKF{088oyA<@0g@Gv%!tl*hBfI0uBaJ z?|F7jjOB1B{I@<`D@lrzRXHqKR#;6)=%~V$e!Dm~#RK^=(vL)cxVmv9Jak*HaY0Zy z#KlC*>E9=3gI_JOr7AvbhZxVj7hQQ?OJD(`VXye@03idn=RAutM2?Hb9IQ7wbKqsj z;pZNP|EwM{o^4`Jev*GK!6E6ms{DfYIq&p01Tg%&a6ojyVV(!MPZ|W+3R5L7b_sbM zF1^xVm9;+hT!T=R&|kO13?c!HMSU(Z2N;DMc-0gY=LM<6<_leLNGNb&5L5Vg&Go~T zV-6e-ZtY<*xyS#6Ly1voVg9YBc3(c!+wXa-|M8Km;Um#=3VM7GZpASsMqT){Mv0N{ z0nd$~gdOLth29&mI{#iLsQ$vuxgb!!apNDAqJ}}4GIDbjC0O@a&wi4 zoXDZh==`iT#K12&&A>*=J>i6sgUo_lJ9oxc{f1>n6wWNTThqvBw75WOl7xz40^0(O zdJYHun8sYT7M*`bB%%Yfrft5(vf%pyqqPFhejIwN;GvRy?diXtH49CI8f;V!N(vs( zFS=|qb8_sAR3qsWQQww37Zy7@G)w&aBsIIq<(~`d{bn7$ygMT5ujlEze=~AuJ)|YD zSRv5GK|sWU`G75tN^+2fveqHno{h0*n)LkmOzKt6rH4J$5`AX3qjtcl67bu_N{@;oB!UG>XL-+43VkyjKWY>~y?WfwxJ|Y>V}; ze!aNXUsCmt=*p!RUm^(>ra8F!S>4jERRidO&N5PRs7E~uFy+3Vqzvz#3+)$_$4%6l7T(h zIXG$p;~PCiNe9MvrD3N#wU-?alvYxdc^r2rMOREuL3W$&jHkwD7Fb?uddW7$Z|YV} zr#?2rBRUdOB#!0Q^E@)(6FlZ^{WY5ZkpJhBh=gUj_ZEGuaN;cqi(b1pLxv&2G1c;) zI0Ivkq0t&auSTaQJ%RScM;v&QVt0HNGWHcZwt(@3L)OQsJTea$cWld+Z%|297PP+l zHq1ZqXs1&;hyJ0<4h}9!HPJZZdxMXi>RJCDN{P()fT%jAH%GaJUGhZ>}U@osUjIA`!=Vx~O z@z^HPBwJWn(d`xJj|SJYx^Jl%rcbbh|)`gv9E=~NvsJ1!hqj`Jc+Avu^C99?J@1ELKJPo%ujp&q6I<_dK zDm>rPAo8t=^W?9QiPsz#>`-R;s+fX6lBr$(KePir*eo!7v?nR#1cSDTilWi9 z#Pyd#FZ(MBS=f|TsJ6XVZQG>wlf%P8U85O#AO3{|tX=ehP1$n2MaIGWhqu1iF)Vhyx7qGhevC1bfq()dN0Cn3 zwM=^pmtXHqUy2(|?bG&O%QIoK--IBQGYR(t9`W#`tDbO}+Iid}=b7D=2Mn|P`{%M| z8P*GVUHzdDS80;>J-0NxasIT}e=J$wnKf*Zg}jtQC9Y?_zLJ0YsIgRkq@S6&=k?+Z zX6`}Xb>2;LHz=9y9`LfGz}ZTKcS3rn=^|;?hL<7_Qj980Gx}%Qi}~C6mkVEVnPGge%#8 zDsWlmZQLo&zMMzJ@m`jc{;43|e<3@As?)SCE9g6mJ=q}2r>v+rAuq^i$Je;?4%2>3 zVQo{NG%5B^c=Td-p|thOI4^&Va(C}LB(b?z$YEBAVN?8{!wxZR27(HF!c7Tr)9Q5J zTfSV{r>$Fm^MJFKWP%~@4doj`?dDF4Bb)xFJXXK*S)ps&lCx~@{{;T?$(K!?YTI^h z(dU_6e;1eU&X;AqAnI{M@~;qQ;EdQ6O6G;F_8bj`*9xujzlNT=DF6MV-ZjBWhsO?Y z+Tx66#~#|e^}6BvPaz2@M`FIOk2QJnC#TZnM{8`yG#mci3ibb4=Il4TyhOQ1cCz2W zW=0nOn1j<9rzfk)9k^-XRH1S3&H{tN;|=PIHvHR@Y$%a_PV}AIZgywh6Au_qIXD~j z?+qJLZ=e4uRbVIbId+@;NgKMC0*_ZISpMlDf6bgw~7e+_9Y2f z92I}Cn`h4=-$N+}Z{B9C=d)1^Ei#Te&gimH`AXZNW~n^c7zLJ^wgqn)ef|`2-N~}u z#e1{GyT~Tx(gQ}R1G{%VDdM{5-F18+zb|jnmLq7Rbnf)(bw+2ZUhym_oD{9V(QcjGo}l?zbH-6kqaAkB>esz|*4pxS z_Z)`OB{7K%UlwnRHa~yZxBbamp-hu`-yfOg_j8;!)0=Qv{J_6{%_qF&kB(_*yE2?` zXjf57zNj$&r*oWewMpA031xm=sRKR^<*NSq%3=pH-JKcV1z!lvs`l-w_*tHpx>u#* zW5T@M%4r+5SROF;#58jr(C={4Ur{e(b4Vjl-*oj>X+$Lhwg)H0^C?(yfydsFHRYHVI^>2Gni-4NdLebJ#^@AIy1 z-r^W-@IbKo{>wiBlaie8@}CK3G1+I4=YMsFQG0cG<-JGe+kDQydv2#( z@$nDa0>)#XI8!Ia8oA|~O^Z9_pmDB&=K=%of%9&fE)2&QKI!`@G^^F{CWQ80WLPjg zY0Dw;a|d{Y4l$lmC^PG4yr94X_R9vaj8Ya;2OYnfLO5<j=T2O8PpcNRU>UU;N)U!3clAFr;uBuT33xnyiuRDZNZR6owf!|0(l z3#W$7{3W!^0!p()N8eJ3l==GuyhJ&vw_BmseIt@AsSY zCGc&p`pyummuEaZGd9cy-5&L;mzym?&5iTyOp|S;W&#tI>7V)J6{{Ffa7mK6e$K|Y z#v8S&*R|7a6y`OW|GX6Hv~JF`1%bQ*4U$n^dzW91&-!9|vccOl;ed*erGrDN=(-bg zwAo}n$cALF3OF!ru(aT0WVrNfT9?i*k&D{R7u7gb*Sjow+^fP_IoZ`~S&NWg(##M6 zRi+sWFSxCksWMGU$?M4}MsAy*$usvJOsRM1@t-MpfN|N=r`}R(kJLID*k?>}V33*B z8LYzjXJ$jfo24s*CF`{wC>v&Id|334$@$TiglIMcgLEk#7qyd2%X-Y3$R$MAe z14I4HSyylB+^G24;4N4F~2QY4JF~n38e&zU1FBs{^Z3Zp?I${O{)W%GaQF_5>-$ zoao%+^8=l7c6;wlI>4Z0Z<@U`#bEWbm`OGT+5Q*mA4xK7mGdrPJHEyCff!T&D-q6} zoV|_f{rOoYyo%4B>UdyI)`u>KSv(J--DZW!8T^wt`E^py$9t`fxj>)n65Ind1Qd`5k0%xm+u6+{@ zHYD=zkuBLdk*7YvL9)2aL&NaJ~u54!ii=rCL_;e67? zR4{x2M{#mTpp=w@4I9HU#_YnQt=E1Coe5l&#q7XP@8Q(OEO44}+r$>;OCPw{b=W3y za~xohc))OM#ls%`LI>X3L^ih|r~Yus1Sug09oB%OjGf)rnXegjmPC5@w{EGQ@2K&R z;o}U)iEJwt-e2Y6p8W6=17pWY?a)>)CY=NBlM<$R3b8xy$mCbnxFw^?=fLpqgXoeX zt(_b`DW9DAHtF*+Y4odfWD2v?c-PH4J$vdY25rH;j~MK@Id4>iAG@0SMD*{bYl&<> zjy`g6QQ)|8;se_+GgsCHjG-movtvGr*Ru+2F4Q_Xc?O4qQ?pDjPfySR2BrfI;X95l zG?>Jj(D7|~@6AsNd>YS~I&KOzo2+Nl)eUsD&+=rNk{;P&>~UdV+61q82Mze{PV`|7 zSbRj4!P7)*neSzR238dn_cNa|7#?H_^y(^ZkT%PDi1j?oQKc&W5;3 zulk9OX==JhS+^)esI<)&IiSI`X3I>*4NLX?(i<2g7#J@Z&z~XIFe77@{~TBD$$e2z z<>LRzDAcV`W@uq(zFrrr!rS;UWK|h^z)7i4r6)S#H3nI?c5=D*#Q*e?&{pd7JP~Gk zuIbf3iO2I>cXcXPYUMZ{69{b2-xcE-rZeW}Ugi#cy;CXZ5hHI!gJc!E zmr>1e@$>`r(>mi>wb)G-@G#^iHnXL%O%F)o=`U%Oyw=1vdxfI?!_E$sGaniZ6+Wsi zEMbs*_T{nk-GAN(Id3d-Jl1N)^Z%J>N33tk5d5QN%AtBmDm+LpNC2VCoE13RX^Lk`KMOx>5sge>)1VGrZk5;ut)mq3VF^q zI~t*Fn4-u%|<+l-_oQ&Ks8_j*NW~l z7i&5vA8ch|{A;`Y!XNLw+|nEVol4!&zjLe8qis_YA98(P6gSIy*;~E`4-%MfJWI2c z3GYdq$tCEiB4NPR&U|~Oo#>nLzUM*@js2w{s@3@*(x8yB_;CQDsxAW>(IPJc| zv?9c?v3>jGJ=Uw6?N09C+qY@nr_J|Y)y*qiD0|JfxP^g9Vk?7%MX9s7{#vVx+qYVm z+gne*Rb~47Q9$IUM;rGX3ieI&oGe=K@tjK&k2LH(v|i-7W&7MrjL%%K zIQO%*m)xzJbInekdKb@az9hwY*2Uy`1!K7XKRl$FW&AqyzGbex7jp()VZa zhGUAc6I)cSEQq)yRXzLJUe%3yK_^$Mo9|?mzI2MO?$H#1?nq}awn;VpDnSdo1A;?Qc$*; z;1kzc_79>72SxP+8xN&7#=dB+6;wZWJdpDML)wO9rRy1~sto^@sHe+Z2@+8kygyw) zx1)H^kWG?Smt3Kh4G<_Pu<`y1^YX6-v>sJ~Q8`)yu(;H%C5rLAR)geF@E zo;8W$WbF8JB+g=E>&5Ga50$bl1vyh2+UyNE4W|iTzm(*8QS*L%BO9+l-=Yd>fu#&; z9?}y(Fhoxc`13qC+oEZcg+cgtjVT4mr?)jJKFNIZt!c*#?weD!)_<3)-~7+=(2Mr^ zWqEF2>m9B(YfmjULSO?j~}R9(=dwS8iLTi~lDA@>uz7d|gZ=(H4HlqCPuJMoel--R&I ze=qCqZktuE7V-OrcY|bEOGoz=HHPID4609+Op~&?wiZv{JZI7q8{L~Nk<(2(i~D=q zJIq=FxemDNg!=Rxk3VTtw(OhhdV%`rbK>Qei*(OOxWDU^I?rBf8z?%7A>+p*u6!ry z!;j|~ezFQ_6g=;)DE!GFT_D?55+ zIn9CWE3`t|{U`>vwUJB!|C%Rg<1cxXPkNZ4{p-XsQzQmcjarx>O4jTeYK5)?VOGT;&Ss*6eUcS-rI z6lS(cnte)`LxfYPMPbWE|22wJEEyF!pXjV}un}_PT&ftO^lTYg%yE%BFvk zGlxa>mU@kqZDA|lzFHR>5q?+6_HbK%?IP!d$!l#k>YGb=%RVe9PDs|;t^3i7N3{h95iOklWjILV4p_}MZ4mcu5+ zhfH;+tUv4A#(hEV>>>XxD>htFaTHfB{W`^uG} zVE3k7SoyYq@2o@(Z-#kn1%D2zeR5(;c3`{obcOW8nHj=U%(%;}wYMc#8#5&-&1BLz zvc$*v5qCxc+lr62{ZJFLna>vept9PF?^!;a&Yrwdo{M+(|M#HQv?oXQ&GG;Lp z3vu3Pk(gD~`}0+NULr$B;)b+>Wmcx`8K+j{i0yc{ZNr|g`MbUMJw0776aQN9QS0i$ z=c1dhy4Ee03Yi$dab%6+LaAA&#G0jrc6u$)IwT1y21^BY$HGqx zGg{bs&m?XBdFJDUx}9e(3UXE) z)v!A3Uob;BZGqY2*YWy?78er#;5XEjo#2%rd+r?Zo-}%<(`$A;m`TKtmo**@<{2en>ougyV6tswPpsK7Zx++$|M{uWj%P(+mVg!!*-3il6zls zr+(NhUw?bA!{alZ9qyIpihV8q3c~3r4XSM%xl1?gpH!e{H|3z(qnU=qb`}SP=4xF& zG0|f7@0X6S`J>@9$;SzJ0g;SUhfKuwl9r>S&szx{}uVV zKe?szcKX9Yw);P=(ibcU+Ef-kRZ!`nAVbWZB$3-y%A5!09$200V%B_sSJA%Xgzo{* zOTvnQQXdyMzP%=LvEKjZY5A1oJSHVOyG`1S&gQP2OG>!!EB34`$SA8R|+_Ud2)YX_!C&bZEo7ZJL#M=Tie6C%X2#B#d@$ludd(xeKvFR^_bJS zkB*nT&lR!%nHKSNPQQ<^SxkPVPPkBFm&a4>m6Ku}j%ap1PU$FT3uS&JdD$xW5W|}$ zKh8kUf9og3iZ9x6vvng|V@28llkj(s%_kZcJ8=q4W#Bb<5Y%;*Zvg|R!dbf%w%qLu zTK5F_Kgg#{VC&f;%40Bf-viHjrOM|;b*BqwMmY+LfGD!XWU-p&2T z1pMy^@0?aHAt$uqp;D?{=)<+WQZcGuT;A-l<7{$Gld$ynj7tl6{rXj<@SnD;mGwqZ zPN~ln{L0kt1Z~^W@o8Dk**&hOi<;N_y-Yg$dcvJMh7XO-J+E2!@r{)s=jx=xUUm%o zo~Q=BE^7XIXU{#ACf|Rxec$3E8Q(=WN^HA$DQc3s_;mH4<(XRw8EmHuyz}e)+FsxJ zBHG_B)IcLrO8#B!+#3Z_!ku><_0~zW2Yzss2a=3{v^35z~L)^sn#NPG-B-`g)W2yNJ{; zW_FFj^1mJ!|I+SkTjlStXNQpt(?lVoKauG#C(U0i(dUraFS2u$$f}N6%XtKju<)rw zTzKHv!YQhka^u27=MF(tzaEE{HZVPGS3HCE(C|Ae@babe1h^9#hb<~_Z2 z^>z4$DDej>FT8|inK()Iu}Xy{sCWw0a#`%0I;oNMUsmTr$$(>T;}0~l@~hPts4_CM ze-V;?9lk({k!?*J?}cd+GZ|9&?bdpq5l?S&spQgOE`6Zg+g;37U{g?kiGi7Akrl6l z!;%ARj50h&&N!@H&&D4jt`>LaM`0H~-x1jiH8V!m$)bIh0+-*eX5Ou6WpUurqV=ro zdHgcQ2ds*|yu7-8`V4D_=B5dpODa`48MB*a2nSS^vK{<;j;H8>ZFr2}i)9R@QoRyh z92^Ne;Tjh`8y~V*DKoIB8E#l!Kl{UCUj2V(1RNNiNt8_JVJh`n;Pfr3Bhqt^q#Bk1FMUNn-zysTtQfqjZ7)x*{c(+_Rk;Cw#gE3cO(J=*$-s$xY zTn8B5^ArU$=>6nrII>`#)?lO zhZM(EMg{(^mPVEn7f$;vZMF+i==C_)v3kEzlAT(f8r%2op8q=T z!?Q2{{`~v=H0>oLlbMQV$X0=#g{Fv3e;ltt?&rMh~uKI{M%wo`R zuzd88_nW{YhLa2Yo0isR2mDsym?@g7S1$bI!R>Pk3{4E%RoF{>JC`Umd|2q>vLw1g z|H_0J_azi6H53^b)|+fO^_7K@{Z9|mu>%Yuf=`-P8r^ud;6&GU_r!{HU?4GbH3jWQCXpYCz7m6kg%n)ACSiER=?J##=)uZy?x z?I+9HjFv5FuvR(dE}_ur`9VFU*3pBH-IGBjDsbZQO0JN$Emm(*+$`8VZ!78U)YSR( zER1u-!Z?+U%i0>%&HimQYR{!(zGQpD;h8IR~{e4HEq?DEQ5+Y@5d%=Q{rCzCkv^7~?^4W+9WS~}9xTljRL%7Ct-4fy zpeK>hOOoLg(_?NUiwBH+6IS{tPn*X!)o2+@gu`q;2gRdXuPCHUSZEbk6|zJvbS1wh zGqcEr1`(!bqI>}dnATKwAkga zLkCLN7B9_?eOnd2=UM3b>ZjT9e}9D^U<=#OT(6pw$Xgw8L@jJ%cWO?u?C*#ZZeg1y zFU?8St&TjC7Pfiz)0}kM-;o#E!nQ0{&CT?!j=HieZ0qXO-0axjQ8$i-ZQHywH#fIB z`p&bk?Yp1m=GXp?e!v#KmefT0tXkO#+L0#6j+~f@ax22^{VcTh=>FZje;PM;m12-GUoD2vQJ#MjHp7A78h-R|P?W?{_8K(>Tzgu-Ouh1;8Q~MP2 zf2T~$p&ci@-86qcN@`=cGWle%-AZj911UkznWv)LG|D!)bhe(HdOCTXlB9$|o9^8i zXR^0FiM+BP#q4&NN+dJ4h**Q2nJ9~S3 zd%AlB2M5Q*#6*Ti`1||ECxBpba&k^iPG)*WNeSp0(em>0!u*2xgoG7Zh3hP<*O*kS z(kp4GuV?6%XPux~&pk<(Z;GMtG*ht|=HfFfq-I)+O}Aj`Q&pI4uQJbBW4^oQ0(YH- zUWSX|SA<4duLy_S5?a?#=e9P{Yh8-(hIIdp86lf3=)N|KXAUz5V_dmHgl2(zM01ZJTfB&XC?6^?}`cq9^T7ntm_?bSLQX@};@^Ko^46 zH#QUZjn7naVwyn4pP<^5+DEWEmI|AGBWu5Vm^WAnA+Z{NOs z{rdF_=g+@9dHdP*`$wLhJ@M@P$>$f(zPxhb)%E)i?k8M%bL-~2dzUW#etYflr~5BI z+{77l~M z+t%OT-@wc)%Xa+Wox>%2XSEtTFx(BW&%Y}Kz97`bv9Y7u;s7%b2Sdb+m{PwNhYM=> zm=_+@e0F_9^67sX?u!KppnCE>#dTl5+dyBtTWPsbQfeC7nHqpGL=DQfk=ZxGZQZ}SEfn5t%f+u zHW?PK4$f^a9(5b=Dl;XqPDo5N+A85D-mTUe^;yIomB0P8*0aC_Iyq zj4DX>PCX;)FpcGEQgrS2(##hNJB&)|IT?T5EEQ1iIrUZDwW#IUfq7h<8rPXs(pnzI zu>N6pXW*M~qHX@1EhXL>Yx;s-CjR43d9cD^ZVCs3ROho*+3U7PJh;2&{Ld)0W!z^4 zHJ1yv8eDIezFTxKQBlRXXZ=xLmG%i;yNm%9~a1b{WV$ zSFhj67CZfh%OVj@2i7A>M?BlapGZ&KJ=^TYY-SrbO>xErA2PLj<-`s&)-YvqF)Vl! zmQz@~^@g?TvJ$zr*Tr+EFg9_llxpFbQyeI{NG40kWTq6Cjf1<>;Q}W&HpvB!QM!s1 zNfR`d|743fHkq%)+i;FW14BGp=LMK=_#q(E%4O0mGbg0>fYVg^k8 zCu@q{9bqorB+29-_1t0ARs%Z=HtuwTnGKQ>CXY9qJaeKkdqGIUYu(i*yzI~Cwm#U_ zrJxhTm~wn-eb$8)nzPSzu_bV$4BK@dHo}93>W!QxFxwc5*#?HzUTh^s^QtQ z&Z%BrM^UPuTS1m>y+FyaL@pDKE)K`!1&eaEIV0Ch8Y-D9q zsO0$RlEHU^lT*fx;lrVMJn0oei5{H{Q#W6WxwB=-H<>i%e?>2j6c{~_dTZ&xE7`%& ztFmQ5b>b>9Ne3U+Qv$969Ni2yLDymyiE^=uG$dse_%OPBlrh#>!yvg}b~ICh{Pdp% zdRz+3oJX|2A|Hi|lxidhgNXq&KtHXK)$kky&zY%L+T8l_5-X9e|T9$ zo(DN-l@iZPJp$Ma4m6xeuHVpL>Knm$ASi zny^Hv`N$?qAI;Wt3R^2uYtycF9)Fpskn`xd!2=eiw+q(T*+|Wekx^jhepuwimY8P8 zuB7p$)Qh)WP}ng*OVfr+#l61$pu=1x5w4d331wLY=UHwkH-`A0o|M|SJfQv6gy@pu z$=oYvWAhGXBy%mF@cy2&pWW(gRUU6?Z;Y0C-nX#hv@G|cdXM)k z3z!wSlHYfD-8?1rL?US_cZ4LWbJFs*buYTanSNrX?R2J2XCIqg(=e#JzZtG@+Kgw~l-382BblWnn zzL^xavVmvK)!d>2{&4o7*gG@KU6TIlIrfxF$i17s{_qxYL0+Ml|7)*_eN$qPyDY%K z(UYL}a3|~EJZGlsGcK)rrV*yn3By&kZyUZZ>_`(W{brz@|{k zcUQy(CLy2qlS-l=Ti&*sv~|H&HU2xX-0dE`&$S$6IFuG#+;b()VqdD>>#$7T%(n0AGPu1eNJg- z-EiRkq$>tmrI-@1NELON(3P7WI8oHl0u55MCl~_36Ch6NBl8 z#a)sX@V_~6Jy-kJrBh*&8g7nmjt$P||NVb)(Itn4X{WisLIEc3&tcmx`0}?4JgyJS zmUR*@49heW$@*4awvCCgXLA`p1CN%F$({DR{G+Da&8qB%>}%U(RoJzJHu;}57Z6G= zI{AR}Ia6iA^(w*5I;F~KLGC$=*cu!<pS-*!H1;Ji_7rQS9Z!wk zQpv?yyKq}7i(p`JhQN<4fnr9=(P>@^Qy8-tvX-UPvIu6rGS4f%*devFvq03$Zd+V? zOTFV?vFOH2zCThWg3US(SV$jGbB$LQxT4<9{=9%wkW0Eize!oY{!2qKqmEINgqQ=* zY7RBc={!%irmzNf6g{kOx~BG2$&uB8p>QFC5u4ft^S<{7Gv*4k*KM)h_Nlu!Sz0u} zlQlqNZb-~Ub8+4oJR-}xm;!kUigFLmn6R0Vz1}RGK~W(6mBNMPMGxCgE?{GAaGUe7U|xcB+?MG35%wPr{o`E7*m+w;mURPT)&b6i z7dT}DyeB9sr?pu~yDBZ)7$zyyw6I|!yMU%)iqy03ZKY0@#+xFJ{cy`=GVJ~#!8S4K zOjBmz!IF9|$!Rk#a^5dDP~zb>YJZ@>)`ZGqM>1Gd#T^qG&PFh}F6z9X zD0`()iZ4Ly@CLT~jcg*z{dFoW9%h&*e`8Qeh`pAi$uh-I>_KX^E8D^ctt<^`R+pyo za59vKsc1b`W?Sa^@$nQs0nIP2({?0^AKGYWy18xcqLjRPiK@#g(U%fSlXlLYs+eR} zZou_Hmw8i*k}E^%0nP$tCY_f_T#4~t4=Uz2N?XoUOkvg3>}#4gno zhSUuridfu|9a?!MncKctdPyLyaYM{ZWAj>G=&YBT3QE9R00=1cD3i}Kh8<!q}Gfb5(F zjw~N!`47xl*x-A~g+VdEJo%On-+^pKwyI+@A`Mr0W(C-4>{^~4$j$hifzyG3<$%Y( z;K%xPQEZ9_<`!Ql<6z`cn#>rxSaz;LfQ$lD_b-_u0VahBYGOg$85Ri0;A#swhA+!>nH0ar80~n42_B&m}O35!q#(dl5MYqE zVUNJeDSDeyW30MMs)AX_ zQ3jT{0s)T%7T$%NoeMZ-E!eQ)0M{}Dj=cxCnlEsjY~Y!7fP0GpNArVCEP-3YwFUMl zZ0&B?@w}b0DS=~Uz=WO!9Ni2Xr*(5!Z(uH6&Eb>1ZP9JP1qK>dl9S(mTxHzCY09vb zwSFR(nZZ`>i`-rtn9UlPZM6lw6IdKRF#80sm>F!_GlALr0rR%m%u}rey1WHuJz%yu zz?2vuutI^w=m4|TKZ9*24{*CZV7@9Ha%(lS{sX4DyO~9-cRiaeILm0_r60{sqT5qu z^CUlD-g`mdP{KyD3A;};u;?G)NIJmOYQVAMG`B_l2d4T9+$$THy(jDlixxQKuu0Qe zU@rrUbpqF+1Kbm|dG>B#u@VS5d4YS60gKZC?!6bdrK!VWVB?mY?2oH_!r6PQ113!IJ?I5>fsUq_(p0aNz`0iO-b zGBP_{16b5+>W_*VS_QKiNIQkpZeVux5ok+bo^V^hbk6RR2`ruycxoRoAKk!Vroheg zhMoB%yX~4i+%W=s7chIDIc6lV>mU0?R_Pc4w*Z#+-A6mt2pkI1TQ|clG)pGZc4u@lGiCkt2I0XxjneRDP_uyE;9j;;>fkO|N-4`5KcIJ%L1y+`c zocaQ1SuU~$#RzyjIJWiASq?>oH!W@Km&=_(d0YgJupVS_E;zw{kvk}xMPGrVlVOKj z1Ivfg%yVUq?`>dqI>1ri-N0h;VArw+j-~@lo(&v_=J2dsz|pM0>^y-Zesz_b0&~&^ zj%ERlU&pz-CU7_;FgG*oVix4kQ(&7hfnzPtzjIq+3ep~AFka}G#Bzq)S72=dbK3`j zH3}>?345&n9!X-@(!7D?#0E~+1KdnH%vKMWJs#{jp}=N+fcf!mmS5@|_5ORA?H(|@ zP1wChfX!|Kv$X)*uXL{PyF0_*?vj0TB`$WK*59*-Csgd)$ToE=i_?dF^$VCY?g%K) zxvsLN>Q^|Aqv?Jo9X7c&8zt^=OT_GFU3p#k%mJmEx++~B)i(#r_g>rjXBM+j=9EyL z+6C8E)m&EmczB`D%|&m8<|Z(5FJNq}|FLeO&8;H3+7DO;z7U+5*8Cv$zWG9)QwdqK zXYw4cZxDz&>LRdEMC=jUxiEphy1H7I%Bl~o<3IS|gaH%FhJ{iFLYH#yi}eXlDrOX2 zz{pu_!6l;o&P{6j1U5;ARV*jv)OM+u2b&j7U=%$dx@RI|K_a8YVUsx*mSrR`N-R)Y zxM7tfL)aVzrUeE}p`o(plNn9UtvYhHS1&GfNh4d{g?d+&oq|&Bj24#}AB3{Kt$Y}> zPiXN12C)FP><<%eFImZ0z}P8OcW414mjF}BhJ{xza__(e-yEnEr7c zS)~}D%aXTNDS$CIgxgVoiNj%%+D}QP2@Jc8d2-gVWqi;zJ7imt$5xeR!e#JOZ?fgQ zIPRZHNlSN0eh8}P{&lM}cHS%1hiq&gN*4(*8nWbMIX$>)Xs=~pol%f}gsrwyw)S0>N-V7BGoB-P{y2@_q-^hqo&>i;+D*FR*mGtH7^J@9T; za>%890tL$KZ22Enc?;}#a`)c75AufW5)0#+!zvulcxWdjj>6{t6pYbu{6=@4(-C7y1@143J;Pd=|&)(~Dc;0`oIWM@#!TyUX zm#F=lU@_U3zG>`=Jo6ZsVs!-So75B~^zE(QNgW9L^xu$cV-llu09%Qt@g!k}C%Gm9 z2VSx_zPR^Dmuo?umeCiU>+fyAVj1>%m(;NjyCkUZ0{i^KiMiHRwEX)ZH^Qjhtu+)0_j>~O?u zdTkbqT)ooc3l9{G;-us_ils#S82u!2dlfF2zK+C`ovDF2v0i=21}AR)BL>dA z=1(>_^V_o+x(K?fY;+O!cQJGo4NnPFO$n>osFTuFSg4+olw;^Fd-m7k{wX|y&BxY= zC?4uiG;lmQMM>yn=XBMkGa1KZmoF*Oh|H5^ zlNmjFt6Gfx=Kj0zukmb;Nc~Dj(ajkX6VLQiMYf2|H8Eses`S*wBv7~Zg^;T9gaao< z?2je5oCsmbe7eY0M042;mx#ot{PqDSJN)ehC#gRwBr?I9AqZuf(nH0}-DW6&eeWh?RUuY?qCz5LV0$H+Z5HC$jGZzx0iH zQj1r;cFW+Ayy3PodyAmfAr6_7Z80vnwdXP<6!sig$uB8kc~m4gAn~?i4RU!s#b@I|Zr79-hu>Y+ z40F0O!F8LIvTt0(jMr7hPKVm#%Gl>0PHIq)QC2D1zjC@_j)b$I%fAy-#N}%QLVCmn zGH_OQ^5MFQAwwd&odeSb0YesFg(c$NFP!wZq%zBMF!F5j zZj*0OXi?-j*lr@_BG_rcqFSRbxmSZlaM#ntDNC9-ykwXJ+roPsI2zd}Vo8#jIpb07X+_+o z9cq$mY))#V?wlRIqDXULL$kC+;i<(F4l-n1IBB5skDNRz8VoEX+n76MikJ&9@EIr`kes*k++l&o;ztggFf>v+ zpCY3y9=zkQ;g^{c%h@iQZg6boa0=uWWO3m0kaTm(7wkHI)kR`!#Q_W9u8F53QWgpO z9y6HII3YUci?Lw6uP289gV2;Cljf?Q<=0z12mB~NL*b9FFiOsr61 zNR41+bSUWNJhOy{;e@v{SHZa!1&1|SfzFH`Rf3irDSPzIy!3PgJL~`1hAiZI?yK+g zt)MAp$8@fbdp*R?R8RbLDOfdnCWDks^CXe&)6^Eea8b7qO!Z$8rpmeQqzqTVg%l3v zC8u^cuqCy`JQX@1yw%}=x7C~;BLxSOtqKP^?E@KDlT)-CS_|iOJ8@|RIC4i@G>Ser z88OT45zAZOW7VI#1+`Ncm80u7G))XuV&_q4U{Ey3v~+#oKBXavZ$8`BsliRDvyL=s zb7-=8v(O4Y9nbcslc?Sdgwc-u!O|05qEF@!g6dFmq zzHv$^>Z0ULCsCPd9_^fmYNrHRIk*L8F6?tK~ zs-ME!2>^yR2jVl|2fghhkg6QFT2WJK?10KHvyTmwel&=+hFf+P=f$4fF z16vqV6Z?#i886Z*Ze%vG3;(!stjUi}XW4~dErwe+PEK&)`qRT2D%8w9?I=^7YVRb5 zUpN; z1pSEHEVbQ5uC9Kv6R8ydJ6wkfC7FJE5uk3snhZz2~1cMgvcLjzMogXWS$=}fImFLpiK(7np%=u(NJK|J%LKC}efSUOjNO?P!e)Q%n>6%NZEuKQlMSUh04YSkI- zajfSNOUjiaQ5Gzg21_*}**#Y1q^Gnj)XEaGW|Hjd%7dw1j9t022O@G2LhM_UTC#2v+_82 za(lRNzTsy4afs)IzC{H?driYi=MKLW3{#FUTubI;S7`PtXkcJyVBNqhM3a6%5%zur-5mKXNQYGLIhjFi`MWRE!RIB zy~CU|=}GV8YPY8)I%RVa21sFjwZp zITpt2A`I*a?kx??y*kZC2Yh=Rm}hQa;0<;NsAynd(BolX;1<|wDbT>%ap;a#1KSjb zk|`UW^Q>Uv=(W2=0t^in6-&R{=n5Jz z>?%3KAjy`((<;E)8dWhdQJ_`$tE**%%v6oTOLun|rTDZ|9|@CLy>K_rPZ0+Tg}v++ zE!_f)3>=J7oEwfO2R2rjvof4wQMF|cu;7|o-`OLyE6)30n==PPmqq8Jl8eP5hbIK= znq1-X*r~&xgMmfEtL29QZv(GB&rx~RqlpU`M7=vL8+`A_T!=VzbV|h5=3=dhTN=78 zm>Db#0|XkwD<=Ngy)|Wmzj}87(}y1SJNA|ar}+NzFJWf%w_r;>5R&S#!uM+n@0BBB zt-K7Z^;fzXE;xVHvvB2@THJ7YLNfyggZgGx)((cF$=ewg1kRq|pHO{-X#;bRtbx}R z4i;ZdEmj7hYE{-7hu+)?Y7wxS@4Q(>_i*%`%j^tcrm2Pu7j~5=uS;7LpuXCi@xxAQ zU(Vkuh87A8>=6tX7hG`jX}kXBV#3$MMtc~#e*|hyy;9Gxveo!OgY!R!HlI+oL6z6ty-}gqZ}@kZVroa4!YRU>9~hO|MF$2+8{IKAQ5K6 z76o5pgNAh{g6pGPJNcCj8B!zfvoz>CaOm@_ueKEkJH=pm;L5cEUdsm!uZ_)59(G~+ z5s^^QF#qaBUS_sLiMFU0T9dk%85V5lF1V5y(bmGn+GgtB^~uC?!3C2S+nyik;8$jD zm1^576forh3&V*ZW7eQlQEu-!4ABfXQg^hb-Mzd*HlWkB<6?a>bC19-W@YAoj0V>x zs5UU)@MO5q(EZ`i<|7xKu+-Ep&^1f(Psa6}e zLqp_;Kt>J*o`mqHU;F)cw9MdU4eT(o>)1bs;cAM};oK<>?^PtekP+ z#;%xu{@fc@DW7BD%ClNu)NDDy{h%wy%_ZJksSGOrd=9zMkMh}vu*aZA%oCx%27D#ZjTEHB^bD3$zb@AGx z-4Sd`Z3zqtjGQd@Zgz0;X~fKAxF>Ddmb+>@1IJPK5+m!5JKY{vdUkalYrPR!w>SC1 zIm?Q3i5-Hyhd2TZ8bbGSyjNma_SH$GZt46dM;SPx{%A9tOEo_(I*GqIwnu@{)Fixq zf`zXPO9S)eL;3$6-N@ayEZTyFQQ>Ge1Dl1zHA%MAKN4(KA6Tpu7ZFdsw(snnw%$bljsVyef`(~nOqY&gsf8Z1vRod5gq)6=!r zpR_CycHaHPdlW& zteTba&$WYZL-I|TBQr9d-I^5JoqCP=+9A2Vt4tECUAxklSKL0g_AxtOn2~@%+ks$i zhK4JX{e$YaM9tzz5!%pjEmrs6r87a?*-5+`l8yD6`8>j>&e)uGE$i=$Rs{w|3k%K^ z4%X`~%*tC1MHsoYd@y46$a$m{7Ic;&AvtMfj90?%7M=r#jZ`uNcHIANn`vveHRNf- ztSOfls=6?3h%m{!9{6;{=BkUVuCt>bMBB6G$J^TO@$2NT|Lojh)F3BztNvcX1{1@U zj?j7C;m7oj{jPnmd=;tk#I6vPr+V0!-rdKtg!gKfC z6R})YZ>PQP(eP9Ajd}hibc#S5rvSt06}!Hd80~wu|M?xqojeVfWgi;WGFWM}MJ)*E z>Gdl6e9l6kZT*QXi*5BU3(mz`2sCh4v_@$CV|(tCIrYYE!ED}2kvmeuAxbQA|M+5JN9)0__uQHT{()(V8a`|yf{4{aqzWcVj?{@dH z3rqzJUv+%eoyqDG+O<8zKh0_rlR*PRIfJPI17pg^^9ARMOKs+{rbPSJpS~P@e$S+s z9tCE`eenm2Q>Q(9RvO*<+cYWRufdNsoojEL_+86zO*?DKg!@);VfS6Wa0WEE?%yD` z{#`f|Bcs8i_qP~AovS}!%rR?$NugA0lt%Nef3H}Kc4W!e?B&|fGj)O= z&kk1hST*hvX5$H#<{KJf_!&d@u>L;Gk;+j%*{X$i27^$?Qir&hSu>b<7u**x@bdFG zHEYH9+Hx(UjB@ME<^mFdMh7;BxjxrxJ`^L)*xcLK5~(;ja><$tEb>3(dlFdXXOz`% zj$jfyF?;p|R{4mQc_&)Le^hRgY}?DMp2Tvjbq!}i#){cLmg^i2>r?vHvx!yl8)u4z zs<%q~?24Tm8LE546Za+WfBT_XcE^%#2Nr3DMQa>bBqbD!IvHJzxZ@03Q_pvVOlWMs z$?4nCxYYfF*LA(^8h*dZdia~)yw8|B+kLBIy~X5N8LbWrSY0ZF6r@=G`R-Vts?g%? z#cCMA^uv+EO`uunhk_wTvyNe_0Y{ax!8dyeN&6d%94vlK-JuW{(4xMx+9iP{?gukx zm81^`v*Cy4o#rgQ9;`RqS)?pkFQqfy6lcEWzSS{;$snR-{Y4gYN2aCrHB%>~@f1{T zJ<$+VFW+mj#`B#)i}Z}@76-Y*?woED7?mzCsvKyP{V_M?!E{BVCUJ%i`;(J0PdTda z@XM~8#B21ZxpjiF+aHy~DJ~q`@@^9vG_PeJ7f50D-K${oLB*@dsO^cvBxUy1DJR+( z7G^#Wuu!C(r(k<6#QGL zsd{5W((y^U+23?-ZOOX6Dfjg^-8(yq?w;dpc=+nhjs+YRJEnerf76dei-$Sqhry#p z$Ehu;MoVTyx=DtrDoei5JZ3kc_k~6n4~Ni+JtaDpogT*yO;M3t`bAiItAzBH6IrKr z2u$VaI@z^>gZZXv{ga7Cb$oMPKFZMVRWDTbn(1-udP-x!YMWU-7rS3{ZZCfS?yvQa z4@Iw&1nk53W^pl`nlYW5y_cCG>(=G(d8gXGOYUdS1#NV<+bX>gv;(rd%v)E)E`-LNvVr5@kp@q4+F(|x{ugBh3Ptv(cqDI3lxy42}^bmpWKiys>f^O-Resj3^H;SFciz{oYT@Hz{0nsh5z7EC1o$ioek=X zjbu_;1k@dOsm$DX%1V1}`_-m4nSfIZkI5umnPp>(`;y3dV;&BVI%W=|F4_!^ur~&9t1PeORVXQq!L@LrB|*W6C9WotJL64_!ZMkP_gWuq(OHxndU2ii0O7MQ0n? zbWf5uI&$Td^9H{^CRYNzZB4KGa-GnLkY0MUzJuHCk6;_GH;Z|?SL>dDBl3+68;gwg zylH5bNM^W@Q(zUC+bA0u#gbTD@Mo`=8Yt*>oN;Ei;x=%eb9*Hnu2M z$FqqU)%R#5RtWuEdWluAaj}cH#L4c$f15P*6dJEbXfivp2sO`{V-|7rOW_eg4~>Ug zed;+Ty^yc?sMPi_!N|NZ^np5g3b(+wSouF=&8FJ3D$ zO6YB^idY#LdGF~GR<;dIVtW+Wj60?!DKr@+M7l63H`gEd_F<8$;S1)dpl2q$n>MuS z)hP1pT*4{8wO!EigQKE`g;?+#g%-mF)8*o-BoZE#Y#z{I2VKyjMl1_zBBNsQckTqXDz z9LuLDvZ^~Al=xcn$l#lWnkhpALk&-lqQ4Lq3q!)3^E?Nba|$OJF)%P@aIk9JSOgaZXiAF4F;tU9A)k=6Mn#$S8EEmw&t@c<kj}i;r}CoP?%s(2CSxWET)Puwtev1KR_K`Zk6g zi3)iZ4ytz>7@E|Q`8YTj)vq)#w5U0=DCjcFC=@g%>M-+VSv0WT`EYV$-&3(U500qb zJHz>^%XMK;KwCZQ?4FBZ3hP<6C8+ZhFeZ8O%;YmDjFYkvun6eXnZv=ro8{Pi3d6TnwofaN*z-? zG`F6|uY-X_p@Ugk{&b{Q&PuW33X3C?yCzw-FtEf+utsrJM!LyY=%g?-u*rBcT$v@t zFp;HUli}`LB@0D)*~*zuPc}?4WLPNI!V2+w(eMXLcM;aE0c}P&E`|n8GPkVMCE^EV4t$^ z?Uj~)i#Y@~sG3cXk>Kyx7TG4)wfFPi%gi5HMHCDt*mPUB&17YGw0`BAsF)oLH|FHc zKJCfC!s5W_#@bpXB2Rf@aFJHpD!+x*Si3h$%^!FPSC^$ToJwH$US<>p@|o zs>(3C_8RjUM~wxJjP)7~yE|Ktzs?+p0Yi@j3KIrucpQt{b~BkxZrxFG*d?`y?|M+!!coM6Nol4cSK5U4y>Uh&)1=rsSXmn0U0ld4 z!cdxfOC`^tT=lS_S(1EURt>>QT`p;GEOQl4ky&831~haPy{c=UMZUEL|kbyFw1 zPi$Spdqlk;LW%E^gH(LPl={h9QL|2}GV}3CEU%muaiB4_gHuF|;TZ3c4p9f0IV@rv z4AVC%GsaA7&AsNp^5kP_gtx5x%DF6jekr;NQEy}p>mNBJQotC@dqnoZeTO#(SIU@Q>N)nntLnKAu9F2C*Bqg0S1{bOfgHRbEq`vbhy+T&SPP7 zV9+=q+Qcao&BdH6*=+dZP)w0@tlvK=hMWe!wB)N2GuHQ9b6FM6*LHNBB7;m&$|=>u z-g7Un<5ja2V_-E2Q(U@4Sm>5v#zN6WN8)Odr}kd=6bLm?Qt?=N-C=8neUw#icQ6f0MoTh^Y32 zxHDdq3t%i-$RL{ID0|mYbkC!!ALEUD4srT4ibgaR_qysP9AFNZ$7FNBA~02^NK!_I zfmx%0Im}Zxg&|(y(bhyqCX+y;9gZv=O)5$bOn0WUpK=WrlB@iCPwRu~0?`9A7OFDT zPf@XzIJa5OG+# zG4bie%fUq=Ojj6{3MH}^xmYHuxXugKT)NyXZW7ZBWiNxMjA=sszix@~wP*-1u;iRf zmsJ${cV)4!MnsB(uT>=9yVU=Cn)*YTW<)V`p8XYmY)5QdaxUUCN#gQj@yjMnv$lX18s!*kzSFSBJ|23sEk2g}2bxP^+btwtdY zj2w3ut?C&vy;N3SyEXY;oJvz`Qs@;u+mxh5N4z^@jh;OG=OB~7%HgcLV)FdfLyQ6q zyF*vb*m1c_&Dmnvjr_Q4#~TkQI^6j!nPy}lrMHxYJw?-6%YlziW9hm+qZTL0oJYIa zCd6Cap1>xrr0BqSMVhgT!A#RZs^esw%DjV24O3RhGXAJfU-gSicEfA0O|M_n9(vVz zGWD94m%?H1jg1?n)-Z$wdrnmAX`3?pT0-KLhmMyXwjK<#oGWY;(ZH}ky2CPzQHQ}= z@$&jzliT@@cxy&a{+Ff6c;Gl&14D&yR&AJ<+VWjtlI@}l96z%6dY#oxVPL%wbLF3Z zqT@7O2M5L%tG8<&s6W)ls@}lxwexOV$7JqXjM6(67>h1jVySrW(`(PW|C*K_%3{qq z)wzg8Rzk>nuL$RkMyVBzvRfLZ8ZNzyop$2yVi%!j%p3=74lPT6`e3u&{1b|KMgck( zCP|!kdXk@}$Ig)VV4d#bchCJgS*JaFvGzziv%}k~emq7u4q0u>`+q09J|(b$A>&nk zQC8%cgIhjb%s&-7yYcPqX)CPPHoA#2Ons~T`e@>^Z6U4CraW8Ls{SF4dF64-KoN7h zw6 zMJ%5G6jw)`X=LD0kKFQJ^q<^ZUKUT;FrU81$0ssu5t?7YdN;lGS%>OcM(g0`LW`5j zf{cFNe0eD2+q?Aw+w-pd;__5|D>$FklQXm{D`Xev`d6}-rpjz^J@?)-V8i++xusJV z|E>4)T*`ZxGk)P!K9+BBM_(^HvN@*8H;)C ze9hT;pSYa$8Lk*c_$d7|XlD8uG~IgQeFue=GR*3XaWmSpB2P^X@>INEMl{nQ^k^|nR5NuIAIwApR;5S4#$&3Mbtu%EFf#nRhG^GrgO*&0V+Wz_~W|`j{$r^@fJslUNtz zv8#t1P+Za?)!|^-%qn#zaZ%_2#qa<8r4uH5-(xc6)SbE^PrrxZYhtiu*0a{oV1|?f z%WgWA?36a@zh`jein%3&dIUp?Y}xBX2Bv~b4)f;uiZZ+vd?216{7CbFB7gIA#e3#w zAL=H|%9tJ!<}M~Bb0G73X??bsL*KnaY#(%OSQQhR8BR}hWZdEC+j{xjGXt*$3p11* zHXdT!t#mK1I=UvHlS`|C;Z3QqgJ5iQhF6K~`IARAmMn|9(5R;UDO!e!&7y(1q+yv{ zn>FjRNP*xaldm=#LwPnIW!;k%?I9K&E?(JI`2RwtP|;z`BgIORb`u+mb~2FxH!bSv}uW;;=wYewtwjr>OW33Om5_ub0tFLu#AALWXyLZ zJClxf4XGA}2Kh9Nil!eziglYsWmJABTy;|C2N5hBj4Ez1%o zFtGf1z0M&%Dx{%ibL*{*8@Jms%xW%{VEmqN@nzKU#`r5tRTgVyjxb(1>7sRlF<&`- zYT)++nmaZxWM3b%P^QI!v7kie&7{LG@2b~+T5#HNlKNEjCz*#>*U8L@j&}OBq2cJg zW%Xq-doovEb_@-lp}sQ2;N5JQ>yu{RWRg({T`A5M#Ou65{MWxtLJZNxPRg9tbGxR_ zvi-5foNlTn;t%@6mv|9suzr{jxV`7 zNydg@w~|9e_+A(> z^^OzAp6j>XPO9gSnNoI9Tf?FuE%laH>+D-=H{If7I63*Zi06ldgN&YsLjBzSh3Tdw zNp^_NEpE!4VUYj(bv5eyKr2XcgyN}kmN$hjnk+PK^i6VM)@IDv z-1jeQYW>~BwoosIHPSnNE~@{yW%5!R2NiFzRZTLDOu7jYWfy!KESa8)JeZQ>$Jl)G zihxAvzX{6jMyywK-n?*QY-CDlC=KaUbM~Gt9D0n!)xp=NZz0D5L5nkvZ7GL!A}lx# zHE!@@eQ+o00?SQSfs^M%cBlxXORnNrbF9Rf;mW~C4hIGAveySM2So6P9r#dR?9`UX zZCoaLFjPT`Wg*MGCV@k0Zo6di_X^#fUXXaWT~Ix2&y2$46({d^zI@lRFN@neu zS)6{JU0XbWA*t^~qlvYejoJlY#VboXd0b-)fe~%Bn8m?y^k@%_&)q42@h8H47TrT>=_*_PCsU&A2b8=`e%8 z-Rld7`5k!zj|hrOKWk!=X=pwo8aZW+u#rs3V}&^%etWJx81?$p#>8g|jEyWy4*ObN z`&J+PQsPt7Z|*(OG71kG*<~s^Hd#6a2rTO}s%WsBeaeG_S%1BbkI0pM)dkDv2{7qN z3Y__@!u0iq@kd*hu!;Q)Ml7>Dm(RGRaKP-Rkb$#8qKv=p=I9{4Ts}mmT#|I_IK=EGc8~n&()BC+{%P{-Bla{QH`5q4#6FNlY$LT z^5n7XVR6#ew&W4eZ{`x?dV2EnrQNQLW|IoJRxzgua%}H@QrmTYzW`6jf>bWwv}MKI z5wEvrPwu=RR^O;$bNT)Z7l#F6eG?p&TWb8@-gw;a$QSu!qGe$7q)D7B-m7!pn62D* z@4*hgJ|3@0?=(8CX7MwK@@Gw%?Cs+4N+D2bg9D${lAK(RRZkk2y)2$Yytwi3OwY|G zg%b|V!fn<~hkKnZetNidJ)3cuSAgTe&cp94W^p#G32S5EGm)!TaM;s-p~2aVy}_|x zxbmvQvZm$dBp&p5UkO;ieA!{bh3%FP7#21d{d@9a)wKU?dKQvA0yB2M3yo%WTu#Kbb{nb8jSb$7qrE<7Lmy-z5dp^;nO?u76((G3qCC7uXKFtOCR zu|NX3Gtbq`iF#Q4k1@DO>c zyW)Uj=I^e8#N*8EgQV3uaoT8^X=uz7U~Fr9Sl`B_(Qn3N z$;>u`xt-fXU&Q3L+}f6Ff<_Dq9J`Aj2``jz)htVs*v|3KRU_v5#KfLeA&b4-4Cj@0 z>oBGD*spBW@DLSFObAp7?KvrSG^0Ce$GKki!dMOwhjn5`4Tws{CF~rkI99bvJl7EN`jjTQATVX6(8*(S zb6!f+x}1~9pQzEcQIR2Q_9NZGnclJQCQX-p$iQS3c+_u2R?5PHFhNm+6a0~z{LFqH z$=LC1W73a|%mo~dOoy&}=jKhGefLXRx5dK-*0%-B_kYchuA6Qb-NnIMsnR1O$55{` zk+*p6$py<76=Uz1t0_7H3~S8NR)xBr36!}IwBg;<_0FNpVw)^_jAksH zqMPMmBpS?ZbY+E7Ht$3Zh7F8+mDn_x9t5Pk;+nbGCt*|V*Ei|**CNFjTUYI=JiwTy zRlg|lK;pVqORn&8Cicpz6JmJ_uB0rhiaZe$x;a`@H=|KHMy&CWaK={=qkoUIWH&7c zE1&-%SMTwv+s9MB87|gfNN=4T`?l(p*c=8|^+~U0Sc)|p9CCQNVx4Q$-B+qiXM4_w z_0FDt@=&>Ht~LW}owV2Nh(L)+o+cb?b41gom6$6hP!Y5 zW*k!Z#o~SSutdNF2EMHf2O0S$G%E5k^D4{8x4k)O$t1EQ{Xa7Uo5KM%Qx81`NrAhn zA5QKTSaL1=;>#mU2boTD@;USJCnR$0n%*OHpGjm6_b0y-3m6#%7+4fGoYieRGeK57 z&{5Jred6nH^$ezWnt1+h_EdK{KHG@jnNL)qf$7AAdq!7yb*y$Zr1BfF3$&~hR*ZNq zqw`OI@z<6OTNV^LPkyz=b(f%mt3X?BtD@}7V*-!WIetYOx?JqMs^BcyF_D?U;)6Y} z1p@>BjVlIP4I-=(49;^L92kXy8dTVH85lGermC_tL<=wAsV@;|m~|}3Tuwib<=J9M z29pg-qbydMDs1d$NZ=M(;=s?$!r%}wDX}|*IpGwG0f(Q$22}xu240DZ1~!2YNwI4c z88+-YFt?8VLCOwB1`WRp%nuecaOE6eV6bS;cVcK*0J^EgNN^r2(@m*^4{ym>9${oy zFpZ<7VLQ8~GlRf}`gK9&LYp{uGcehG%JA%;^CbVx5p^d;uD}{6kty$7)g1&szxNB{ zlaIL{am@Cg;iaSnO!H?&L&w%0>|amn(~?3*c_{3jgp zIhYv!sAM=wDohX4E|`#%puix;;h3+)RN8oBkrJPPtM09@X@$%OnCg#jRA=H*kPUEI zz>w@6!+0oHxN31k9LojMZxBj@sPduBx=gF;hl%VdVuZOb!E zf@fCAKhe1N@1&H7Km+HJB~R9t*Xo~AXbKg1tb63bx#$K#E~6QW74M&H<4hNlZ%kld zxcXX>;ZD&6UWNufcE#OAvI6ytFH;#9wk_IzDrD1~T>!QfA=&^yFZ~c$3 zWxwXUKN^>sZn22x-ZOlt!JeFZ^nB4X)i9uJ-n)MR7{A0;lpveZL9Y6HU8SL z{?n%=e|?li(vrQI{A>yY>Q|g^F<5lvN$v+9ZU!F@$wypj^ZM4Zz44k65dX{nqnete z%R&aG2b;M3s{+<;X<%Y_;`z~~kNN9_Lr#hu^$rOl6CAClJruj(!*WAQ%`W$qMm}46 zKSR0F)qSnpf`>k*xU3`!=9I$% zrVsDc=bdL;+OBg&Pedsp)QOQLiixEpr87faaz%f7l_Dd{gfC1Fm`=P_Uy3@p~wnoiLXBGX0Vrh)sJ61T@0vy3T|9x7TkF((x0Tq^20ptn-$lkUT3M$r?MnEANhGSoB3W#|YvNZrrp zPA}B)S~S^9Na@A9UbZs^k&{e+nE=UpVktu(7`M3s+cO-SOUQhRS=6WI6U{TaE~-YdsLNP~X>~Ys%u_m6vGM zX{_jPXwG`b{P8Ew*g&qs#r5~>f)uI}#UC1f_;tzY-z1gt3-jiAs~-BG5R%}MT9~wD zlUqyU13m6Hi(Wb{6}0_4!LD=4iUqH7KAaT(F!^xbrSCs3xn6ZMWf$PysZq3I=O z##4rBceo5V-uYkn#9$PnSgypp;NqhPL6)pZO0FW@s)n3tBKJm_rqm?1=w9M<=BCh04nQV(QU6y(wJ`aVrJt%2N zF|d@(^)7hiIeW75n@jYK9eR{M(yhRQuI zQNO}q6S#)2-6ZIw=+Y`hz9yse3!z)=&VJ})-_*jT`0a}pmjd4>m&$*|cP8Z=xW*~r zyXb(0pz$V7r_KrHLJbT?BC3-eCC^L=e^_Loo{E9z46vR8pd^=God~d`@c=tNW9`$b40(G8C~E(Q8k(Dl#n^O;r$W)_Qto>kM8ZPt9|IlvU>oVkCgaF(HjrJ{(z0*>cvE6p85 z&M+`XZ54A`@Ohh8?&qXN<_CUV9-qCs1hW)GLzqOf8U%S3*GsfK;BYu1lGM%TYSKq!vB0^DAg43`wodbK(0uBjI z(HaNAX$NNPPEZV9$dM+=Q4^+cM1ei;09#ptz!poM2@Y&b2f1?=aC^*LWTA%~W==nr-dW;`u|tr;&A1!=8|vE13_nC74SF)jP5s*r{yx zkk!IsR^>zfqy|wFN48s0E5ByWjecS?V>`o-2L=w7<*U~5S{Of2J23aJl_47=`>&nK z1_#+T?P^}ROZh+o`#THCLk#RnH`SsV*;5!eg%)m}?6~G|)e`YKVBlGB zO^zX<|F=OGOWAZ zXXeo??^4Xk;o8$ zOxpK0dUk1)s?bB$O_lq&ZA$+u^a|G;bhJ4+^-l7%1dghk{1(xM2OQW894GvKy>{|} zt;~vSetYxgId&h#AD{a)2tl7&P79>s=Z*yR)Nnl?jIdx_N=Ojge8U{%-MfM3b7fNfd zTeF9Mb8t$NI}h->i?p?`aw z5^^3eFdI2ENYy=wOfkt)>&5<^ z;?B$FyRuCQtab@5=oT9`K5i#BFESq$_^i|(R%ad&{ zl`L{3{7eeH)fP`KxnXF+Dk8Kd_2Hq@t=k=JK6nS{&Wt{sbu%k^VUtGcBDEzx%N8;j zH7SV%h_H1z%uGD}CTQwnhQkk<<_IXwiz=6F<65?qPup3c<YpYgIRD-G?EMn2uRo3JLyX3;RS)g?I#Z`bYMG>TAGv_a94`yDcwl+CPo~)60q|1L|I!|qw z*om~+dHXoi=M zH%hdNiOXQ-8C_9<1DxTP=7u@2iR-ll``1TYoy5q<)ew;6n59!0(#)D_pc<~o^1xvo zzevH0io8Ep@AilYrKrvF`0AOy>6G5-oXzL#eurx0MFbp>VwGLJkkwysi5p{c-qtg# zyiX<`P-Q)OaAl{4kciWglWUv~NJhwpG&XTJ1|4M1$^5DjdU(ad+sWEX+cb0LPFTpm zv{tSDv)1GVA{W%xx2AqE0)r|XIU1Ql+F9W{-2hbUbqhDNRfj=W}?Cmh`zj#OJN zXmjUmm)B(o;BXkp~m+VMbYr3DZ(SCOkTELTvFRL5+u>PDF(i zP4v*|%$#Me0=KDGQSg$n+Ptl05INy1$WL5FpH#y$Rt?zT5 zuQ*ja@5`Fyw(mR7*Ssp8|L4te`~RF58n{Xpu;{LEWVm5;qHbmO`gD>^kt9u_k7^j<+vESvg_-Dy*C`? zrv>#WYB)NqeZj0d?GU&9k|tk|h=U62E_K^4Xwsh5(WrKeE22s55ZjuFF3p?|*BLaO z*osp-H0$FIaG3o|T*TeF)k`a70mr^yrW@w`O*ib=z_Oymkt1@hmtjOBPh5tQ=u%%d z?Omt1eD`csIO@=$PMwEeam;l zHih-RZaIzK0(XCzO=6kIs-LyGa|4&Sp#G1;h2l=!zBB5Rc5+*;)nxkEbfm0o-%p!0 zHQY+w(kzR#X5Da9tVm#%Y*1W%)PPCi*92ziCkh+)L^$!4O=#A0Il*r^fstEePV)sm zrGq*X9Qle2T9Pg}vBw=)&-c$jH295zfE~w%7S1LXwLgjnEjx0I(t4OBZ&*m4FmMu| z5%5sVOZ2OQXx#PjUFKa*9>}6=VCZ-}_#ql~sqVS=^ zhC}@NE3%9lJ}@b)DPwoO;Uiv@z!j(9#HR6#Rr}wECYKFLqWN1lD|YREeoE^gTcYYZ z&1H)?#cw>|U;Cq(o9AG%(h^DGH6I+OHJ|Qs*`u(T#qpRxL_tePPW>S^p95Q#{TFy~ zcF7^Oqz#(|cg^96e8RxFa)PVkqwJ?Kr;YbFMR@7gD6p+IIK@G6Nxk$tMH z^R&ps=D5Q@E}e|XNfuA)l6W&iVdjI}C7#(iksB6?uGPq0^fw_#w#7`+c|)TX$0v6A z4d#+7IvAH%>a@tVT;+J+cPzF3y{~}5i-v!DmrZaC{hz@6CX4C%uDl9s=84Su;wge= zH?l(|1e={dOK`X;a2)4W>RFf7#Oe^hBs8g^S!RQ|V2|mVZIYi}D@KH~UGj5NOi5^- zQ@m^aCsiiFO;#*Q4Rgfxmu%+|3KU4;VB}==Y~uI&o!=(l$foYjBp9*bzN$_ATm_r* z9oH}ad~M)xltWg$?3nf2X62kcZ@49Y3jJgFZl5q!L1%xNqulP?iqj6F9LLv{3Qy#4 z)kxYFd%Rq*!lvc0`_g;g!>okjcCci*+rD(((J23@?^TKfBZqzp%i;ZeRryAT*p^3d zY2{2PUzrf|c+CpNUFX-7wQX=>``z00yxw%*gpeZ)FaK@Y?kLf+A8v{RPQ?LgO|yaCuB%zA?2TU}O4` z)VTTsOLKhO14l|A1ZIBH|^b$m9|Y_PeD>dBd6@Q zM7M@&H-VZLrWx|nm@m2uG)^d%3@hoFkYHxO@|i8|Q(A+Y8Ox{AqKu~rqRSFu4T`m;Sf(Y2lR zAa~x5rj-d?(`Ll3oWQx_LF$PETq_iKP6XtoXLPlO@OUq1zW=={d}9@>63?;)%+492 zt>sumebK8e?D9sWuegb4?gHh)gQAabh(>?v^(f_DEF@aIK&r5a`yz+> zR2I>q3C>JS{o#dd0vmkxFfiSkD0+y2snuD-zS;C`M99{Hdd9#M`Nfabwm1BCv7*i75%M5vn z9oVutwF?5-N;ZmQZIIwqWQuudd_8GqYJz@g$xKNHwv-17#T#bTuUW|Urd4LWArHep zm)Xk_%@-=LD=09n7vzdbQTe1eGeyCyz=3^X!pyt?p@d3pu>~{JIfXqsr<#Ov3kOV9 z*ucnT$Sxhg$i%=Xoxr&Npq|1+My>@KON1HZZ>n%iu##e8VliNpdce@>EX%(@Siwo) z>|&)t6(Oz-jM4`fZFh>)UnykN_cZ$zB)Z7KHAZq?elnx*1VM=gMuiU&hZ&eS8W`mr zr^Jacyx%Fy!oVQ;(~P5lk=fJj(L)AN1y!yKnwOnK_!j881+sBoP*nQBAW~@Gut{L= zhH0D|7|ff5gH24PCkcd$`rtKF6i z&f2K|Z!060aVL+yiDKtxtvpX1$pmFJVJ5K+J~a#3B3XGv3c2|<^f!ED=r2^#e5B_Q z$dGFz)C#8w3t5=@y#%Zjl}{K*izIRj zD=ax#Fr|c54Z1b;n?zi$NP0vu2q?^(dTY6agP^kTD$xVWjRS=w85o?6 zcoY-G7dB4dQ8Y}k3hrrQoW4ML%PxVSB=J0jiMfJqK1&oWRw>svn`Z?o&77#ju|Oy& zQuOcxnZlg{28*N>URqu_DB$>Vjc7pB-Az7@OO)ds>=qDapkyz{DcWW&222B0&4(1-+M2jAwTVoLjiy z!mgk!21b?#3>gPvuW^ZsPgr&9)fE4k3_UvqI-4ZwgB@l%^2~XtXWqFf@S_RWhe;xy z3?+~CGZ!!zRL_3YxU%3QgH1L&>xapq2kVu~n;45WNX|)M;Bau|ci7f!$j<0s{(+JG z@Dm3AVEGphx3D_0aWt&1RaUd`)=8hlGo^|lbvA>Kl{9PMrb(MzSR19aPjAvH=6WFhVUvxf^+p+H9d4hMUI*7P91yJC z#kk8u;Fk9$*J$COg}UrA`xITBGZwIYkF+>EL94=ZrhL*|L#>H(6Bx3pt-eJ1%uUd& z;AB#CVp|x*wz7VbMW@nifhT%ChqW^tX8sFRbX!<1@p z?A~WX+c!Z)8yKfGGG5v#uvLLc@#CTb0l};boC*)@Vj`z2H8ARPavhFglzAX-vv__y zcTuW=aGnBt>=$uIhcjKf1&%LZYv(ozWn>qBwOmJ%OSyp2XqC|AB*qhe7Wp2UYIMm( z@_u0X?|u6f zUO^rGw^!dkIWTvZ&cX-FAN;lHby}b8&<=X4j zXRp`lhR*$VuO*VibE#Ta5CwBG;jP)~JmlZk~F|ji=>|3a^sX&1}_>0iv zMh0WPa;A7J40c9?m{*#sY$~sJSPZ$@74%sSGM?%cRdTS)>yh5;WdC{R zffo~5KH`<6Y+8l5zV%uXOx=?|Mae>t@DQ(*& zn!*mMXJVyO8yI9fwHEX3%@1aH=Ct)nuV?Xr8|TmU?!8#Qg0)d9J9l@7o#^QWHr*`i zcdh;BrCKx?cS7d>}2I>0uqKYq92Qj)GT&E_&V3Ro2?ETW8>ptCju{$7;yOvLseU<3k z3zO$Eyj;ULJyn6-=+chGnznNr*zz{0mK1YmO?YNwynXHgwv-KQMFNV48Q2dL%6+>u zGed#>@Bz-c#MyZaKkw`j*w(Q0`roe)cV9W%$MCG${}9WY>G!X%aGKLU&tG_Z1Ea_S zwo?qh>T0E>viAO-a(nf3yDZjF_4|M4Ech{P{lCln$|?t@zmNYXtfaqo;*2l%|86yK zQ)Oi5WDwXqiC1O1{3ABi`b|q@nC7re3Me@J#CwKe>bWJ6m!J90u`GS}#PahQ=IM(B zN?t@>c@en8bE;nItt&5s+l$ohtXj(0AiW}TYu?japqnxi)%moUm7E#a^^UGfy?yO% z^p3)ZeB7o6A~H;QSx??Qy?yrtomtpZhTBWVRgF4!%R`9g~@-S zY5uc2H$SI0EijsJvLKN!e^Ae; zUk|y~OhrXSM@PrR#KhX#+8KOhSx87oOiWC2a&mTdHspe`b23b4gc;5&aa>U4zNpE6 zQAhZqj_73*>C47aSFM$=+NfP~*17I(c-_P3hPUZWKg*jzwzt9@Z%4Y`iS@dh=yxwQ z=w4>n{p`s51@RB^V;>a8KP*XpR9~I*s3QGweF66*J+_Hje4s1NOvGnc$jq`4pKi|F zr=~F5UU{yQ#(X#3Mc$eV+~N0|S+5AUTNw$t-^^`oqUX9~-wkR08#978<%Dd?j^0)r zzoQItvsuE9@+ZwDPunY>b=5#FEh{?ER(hzj>PTc?<*eQpQ`%q6oAi3&wAV{#y;(W$?V3gJx2%4*am9!2 z>p$$-@^Sx;_d7Q<9tT}n)^lb~`>7d|&MlmJVd;#E%jaBPweaftrPnvDy18xb?VZbS zY~FNt@2A6iw%t3hcue4j(>z=FFKZSFYT?ef!JlqhHRQ_+qA)$d{5`0bfXV|H1tq5AS_{aOd{>2lqZae)8nWn>TNMK7I7-<+I;! zUq1xhL-y+Rw|9R&ynp-s!}}i}zkK=f_v`1+zrOzc@%{VnAOEL2Ut_*IIe| zS{Ia)WCp*0}V{vduANs3O?P)o_umu?CEW5Z_l5z z$3TK%!Ma!mMk$NhY$I=mJ>fsNRQ(6p;X)MDj!aI5okFt|rM7r7mL@KHI=|sw8pr%n#S8LNmua4;zqnAM^x*P^f*-@C zGnV;%Nt~Xxs=}c&=GU?pUUMXrvJ~TzOcqJyx_RFhCv`e$u0lh(*s(|R4!;a#+isUi0c$K$uqL72#;bAlVZ|gXgsR* zZb#PH%t&0}L!Y z2O4rGF$t*e6mZWG=`AbVEugqWvigErti=TfvCB(e>%?8rn<62`Yx5z~kypcef@a)| znE@eDA_)y=*k>A@5arfsXib@Iv0;CP7R_N7XmCB(TJZ1y6IZ>(2iC=$ zqD`*n!`~b|$*ju1rI=|A*92C@MN&#LHJ3?jVqoOmGGm6gl2wYAxFUbbiGSkF3A!Ke zH+V03v}fwNCiQ(xg_Br|%S11<-e+p%Jix@myNRKL$;Kg0@xGN!fFciz!+{ITg@p}G zvt^<$C~%3y+}6?!j=R8IzSr;fYZvAE2U#oF?%v&%%xJ;z^Er=5k3-r8#fC=@g5*-( zX5|`Zaf#brGj$L<>@H{HI49;{`iGnBdjEbft7b>t;9%uBu!%)<5yJ;YmJcOPyxMoG z#pbdnL^2(JB$<=eT5({zNy-GL51FQ%hDSxMp3l~c@rrOceV#$YWg!#K8IkvkuQ=}e zP`~f3zytkg1+qvF#ICeRJbqkfI>)$;d4d7T2{kW=8PE)`Z9t>JlVlw_tFf+jl6?8luxK- zg{)ZnGChUaBJA{=O>3UAJV=}?5aAf!}9r}LQ?@*RynPh`F@1f3#tgBu6-dvt) zPAU{fJN$k;e0;0h@FMF9Mre@k@O!qM2XXG$!(LDNPb7+E3^jei$+qo8)eQ7BW z{Ujvu{o0Ir7pEI(!s|CKtdwdKXSYc8{}nC%eNle_C_YzjJE*U+Jm%!{@Stnd7;Hhd%L43bKyf6$>|IPM*pzW4=`*`y4ip z*K=P@j&(FM^kHi0EiU(DaC{Uwefh?fjDHoU9b-x2ie-AhQ2$beC05{sZQiWh1+RIo zl{aN5H?v%vz^uE1spqk(bA(%^U8*RPoB#uh#)`=2m(=Z-OD(oFUDq$I`kdj$(j`o_ zT$%HXI=mAzCwTvKTeM+ww^_L0+UnXh`Tvw;9RIXmJ2LU&To%rZ*e#h?J#(8JxPSER zRhS%}`SPj4$0eHHv0C*EOC7i9b+Km0nypk<3Hp?Jq^al82P2NfkDkt5{le)vn?M8W zo7UxBOIKz6f3kn8lFDY2-hZnz<(92aI$P*x((^=1?3CN>6IaaNFS(m~@blV>f-J2I z=PVX^Z^WRHHf<*JLrt-D0t~D&+|A`Lr~W+Cwsn!~7KOT%68zcP%clM{nOnbF;pH!` zLwlyDxy40DxFk7-d#)G$n!Kq1LQEv4E&gTeb$wo|s=!GJ6M~+7yNTNjZ*Yhv7aZXj}x?h_@b}RgseV+1y`yHl5U2npU#! z$YopO?v>LkS2c@8Nk^MS^;o5?6x*lD@MY_p%l}-%e^0ZlKmP64jJ<1&%r{3=FkIMl zWlGB5n92K(tuoWUWd3ckaL1Rmwy%3XT`8}8rlm5ypy|fyExaB1ssHpI9}=Fv`L>3> z|J3^42^*t2u1UUHBi?p1BDTNJm!+d$Gs456@kJ?v5`XN`3sSm_4|_^HaMVn zw#RC1=g-~F!UcZsrp>NzROOINT>G`l*5}9vt%SO;yI*+{eW&kl`?-0N$(fGjf8MV7 zsjFPv_Acn~Zto?o%f2#gIq_(1t?058%Z&{^;?0Q@rk z%&Y$OAu-~sC$3H6`Z2}3FvqK^ac+FKcCBc7`Kk#IPd2eBu5Uj1BFZ;@YO0#ciR9(~ zmaJM>xX7zKvEh}8kC&LA?ewyX8s8^WR5#Wnx;`@r(%2cb_)NNVFx$sNM>EgYZ+lbo z(r8KUWM{b!5oxPtR{jaBwax;e(~5cOE%Y-Fa=tcEJ+hEBCc*cODud_opeG^W{^Fsl znUxNUW-Fx0^(0rFQP1#fVt5rU^U~2f(8cdLd(Ok-B?m;M${!|NIZ~U{;&R74LRw9r zzcu+(O4i@b{*cD{Jav-VxT5(oJAuD5GriK8obD`4@-K*adv^;#hEd(lz znyYS9{qva75g{0G=9?+2FhfS6z@*JVoPxenGz6ZwI0&~@aUE3lrQ(o{M}#W^ZXz*LBVtvn$+qqcNm zVS;(pI`y8e8$IEH(ec+=d&+F<4p*}TXv!Q7c-rjp=5Y|igM_3fI)8!%9G^7Wn6_=7 z;q&lVOxChExeSXnliIcjXYPEitRU?ANUZhWS`SuuPYjEQU6i)ngMnE%;DV~# z>m$zf+((Pf{g~h(sCMaKkc^A7zN-~irfpVP%wZOWuB#Oc4!WfxvI$|G?~85N6fGyZ z^prK)={}V>5b`gh+^{M&LVVXzR#xLSWpN1wO|>PWIxn1aEQ@rM-4j<$3f>huh2g;j zwi12KEy<^!N^f=2@l!9&x@IKJF)=Dr;tUzoB=7!4}5tXb@G-wGbOk^HWSFm z;CQi&A&x<3+Hz;khR{9V4Q3y3YETn+cvM2N$U{n_^g3$5*H}`?Xgt($BD-#7H?q=ne)MYZ@7T6aYxl+ z*>#d}$vdWQsh1Qf3}vuN|tn}Y9*rz z<7fZ24|YrkEEqGnlut6~{Ig75CXn-~IZeovqb7)9T5!UdBGzew9-og+Tc60_*JN_~ zdF6v7jy;A9Q3s->jBQIE`t~>n&*Sjie5iR*CBuPDi7g2-74>Xh8cU6DiJ9vg8@XjD zsaqHvG;7#exzJg0is)p9erCZ%Qx)SCwBid`&jdy>E6@5qiFH+_LDC}2&dqM$TsT@D zu<{$si!rb%6m4%^z^K8BnjbJsORQgd{HVq~A=&kUHB1}b7p`DcnKmt1(4T#Rd&~j#L!4fArxf`Y z$W?80d$LmEZKpAFli!^38EMY5P;4LtfKFZ2Jq2X_oK-&aX z-VF?V7g#^0%f%TiNs9>MpI{W{AUEd#EBA*DJQw~gyt9~9`u4{A6E{iUX88WfCT_v{ zh=PquC7YG5u<|r8a2{azZn@4aTH@g^qu_&PYKFzXoYg(0T?4g+gR8fMRd3}>9KRx?wwkS z-uuI%cOKih$aK<0QnPK}PboZXy zyEy_&!W*(5yx4stdXLCtx%Ux!PQBj!Q&sK8<~`>Ah2q|KK8)Ft1lenZ{)Jj5m@no z*=qxrZH$1GkHDf2hgdEicJ&chvEhjNpCcZI2MZDeRs^sp-l-R8QedtR5GYAtpCZ8O zY{2?)H&<-~i_-)a)jeDj71*l-SV{#rJq=j@t`?ZZ!0w{J;t_CYp#ZCg0kh)-mVcfL zSSBh66fR(&xPisRfmM4CR~f?z?}j6mJnYp0$D9?|U1c~rdRQ9Pum{{Z>AH|zFGpa4 z12gv?fyx9{Zw6*BfqM3W26odN7Ml;uo(`-g1xHIAm^~TTT@9Fxc}}@ZV6kvu@pd@G z)yTC$hP}jqRaJ+p(16us0dugxS^XX^rw`2b8(4xBm_rl}8l=&0(<* z_;;j9fcfE{!%OBI-lQYoeSvw=2ChX5m;)WoTiq3&(7+rWBQSHrMgECLGi?OY)*POg zz`o)FyOF|qrbc!n2hM5%miqVJ%=H0WRsrl>j$FY64^}{PWte2 zRyQy&aNsmi;D}gzmFweC3kPO5gA>e*M_hC+aSC!6ezo%(;Vi!(M^ub}hXD)QMs_0w4(7%iGdHkXez;+wz_I86^OU^; z3ns8XwK;D8Zw`ygA7-c)kAYS&IcX z`4--8-pjQ&SAc&Hi!2Y9eFDpBhEucZ1rDE@dzJg*VNRQ4#d}ZK>9Aby71*VF%YM#& zra+c`ws&VSa4l`PCw5Qh@t+H9jVvAlf{n8G%WaM@IkKB5uo$mp{&eR4lmg}^2QDiI zb}mH@=LIZ*6Ijd_JY-tPZd7pAL*e{o-A5}7SUnY3%nFVfoV&~S@7jG^R)Yp++Y8Jt z3H9tsbq_=2gnHlJV;1DJ*uXA0k+Y!S0Lw)7iUkjXH?R~s99ZqZIZcPFXaVPn568F| zxe7P1cnYvqKRD7D@GOMk*}t*_PhDczLmXHO99V+|4)(-csWdpeqTy0S1AA!$i=n{% zP`j717g?_43WO=J6wi^K9Kd{5_QqM?my6a3u3)I=oZurc!GQD1#S8Wg?DY-o&I_2A z+r8Q%XECASlDz^;;DT3M@4bGk%(ZC4`F(b8j>Nq=R`=$_yf>%#EJ`*DT|PWpd7=9Y zEs3@$rLG3Hxequp4sfspvT06W(w@MfZpf8cz?S}iou!Z~JK_LIv2_&)*7s~+dLYO4PETNN0b9=p&P;`ObGPk2{ZF{sNKNx&-Ap%=aE2XHjtZMS zB~B|ABq}g=ZeSBCU}FhnlKj9DaNsR-;Xkh24=f!Y1g8fuDF!eqe|W#zfJ<9}Nn!)z z{0{=T3m9b$m=qh{aXw^MVqg+xU==UqOkiM@V_-74&n6VWR^JoAs5?Q0$6+34ya*S| z3XP4NJPUjoO_nJqT5|jsGda|r?7-M{flYV=n|wVJ+e8la07iiaALR|X7AG(%F??QK zz_t7Vi&Vj9K0zkM3!JMOzH=0EP2a%izd%rT!58L<93lm5(*qd&4%l*j_z-$u*gKG; zZNX1zSB~a}#;3}QXV+geQ*+|@uu9!$ z9XOtSQDQBLojFlrlfJ<02R|zhbKXDlTf&-S?p67t|Lp&ySTIa1VUsw((HX#)yWtz_ zMGjd7rT_!Rv_Bd5)I% zoYD?oSRZmSG-?Pg4qnZ(?pI64#TCuGa~m`=1Oi)4=NmO-?s#>&K}Rxtrc%nO#~zbZ zedoE%40`G{O*eL5i)8RKpIN54i_QcsXkcXGw2*ysXfp$&F8f{?1&0R?;?2!`DUJqL z8c$4GCiO<<)&qrwzH@j~cHAro4yk8$-YIkEh(mfK%WR&!q6u3Vn76N%GN~}Qa$rGQ zEQ`j1s)7lZcCDV1ov6$_bI8hMS3 zj8_HE^yc-PaiT(N;v3GifK@>ckDP4dQIL>qaZ*|&DKJlJmVn^Khm(2d2h6it%Hcet zK6tUxwvQ7We{(%%x6N&sWZ2uz`}DeukIJGw9QJb24mLkd`YaAk7pM#=IPhf^JJY%r zRs#n{c9jhd%=|6|%Y4}q3mTc~qK*nMNogFJ;K-BN#lR*d)3Dx=Md1OLlZ-%v{$#Gi z58X^+Cr)Uy21&JWOQs*$pyed-Wwmm%oWcR_dgr_)s~DMfD7bVpN*H)FG6?)Q#LX-H zD9Mw9|Cdt(Q&tS<%=U_g3IFyOtmxL`&}=!P&y(fAz`R9)g^{`LlXtgMK+C@i-HaOy zo^UfW7<)MBL})Q?n(M2nE=|sM;1eb|IRtvr^_&&wivs=hGi-Cb% z$i*x&b$aTy$n?ab2ae5L4~zD%el_XC4SsopjtPwCf;bz+r9W}$Oj&2}pn=)Wn&He8 zo`)|K6fLt)M9YTnOk&^>Rd6ub&BJkKivFLo83I+jzv`75{)atW!m!q8QP^=drh@6+ z+Tkai7|QvLTpL+d7)`pTW$w4KML0xq3zM^dP-+XWl;MjO?|M@Y9xv%hk`c`_ir+19 zx%5w9ag*>R2WQ^7{)~#Op$D@y1Vc*aZP^+sa8RMQC#Jz))ro~cTvwl~+AL?|akbq! zn{7|6)(iHqc~H+)@9Wrbv{{JZwR5@Zp6@Ebd=q{zC<-=e6+Xxw&v~z!T{5dtPvOh! z1br5Z%a5C7Dn2hg?i<6(SZsN55hL4_KbQ6X@;o{sFp7S} zYH0QryQ1urYyDD0(CdTfJ~1WJj3D3elaiO8g%qhYhe%s3Ou^Eo7oQFqzy)v8oZBDw#iM358lUL92)=QtjY}6Ca zcfhIM>3D-cT8eO##{mYj`psRwZ;mkX?^t;IkcrOJB}%Mb(jmEd#!Yv4*DJi*9JxMh zV$&Mkbmrs6o}cHH3uq)HuqH`3v#onRm)AzoEZd^7Y)#vqaNC1D{u%zxSEf&L;#kn| zsX1BZsfGKdr>R~Uo()^X3K%%921HA}7G@1(+Wyb*jke}Nrn@3D8*VOasjZhZbe&@L zY2muWMuy*7y^b%!^*6{aapGM$sZ-_1TCGOzIBl6&Pc}n_wNnaIro?n=1vxNH(pVI* z%i8&TSRt2^Tng)<&kl}${}wj!WOz+eyl_*iVwzy+iib9mg)D5#c69lr9N@god{B({ z6X&wt7C{AtdBP?OT>5QPX0BpMaptOD$f|Sk;@tNw={E73Jf-3?gj+or8!zbzMFr_kmpt=^C$M1=gI^5$%kvB@^$HD)A`J-)MH>6djDk6~zBCkGb^5u( z>!4enn#!TOBn~ksI5Qh`w(va2W#&=X=#$pszB<&Q*P<}y0*jj7TN6(G+Fiba2@K4l z8}hiOFt>56S)iyIaL{p%K~q!7qFvGo2Zikt=9m>EFkiddz%H_p%XNY}vxJ7fbdMJk z#{xy=`sp_q-t!5u{mD~cRgPdhbtpjY$Fu{M*(V$-%@~?oWLS9jylh~1QP}!mZn4T7 zjSRO%Q@oB(yKzKaZ+5{-CL#TjM1k_23F3OMw*Q+jVS<3cx~|t+70S)JB@XvqMa|pu zpw($cn{dkqr{3Q#8>-EYh=^A`%@khNs(I&)G7&fI5DEc^Xt6bO><0_$+ z5Z1iHNiZOWRr!{|3-1G!qSJpE&pxa^+iZ)XV8^mFrCSf!X9!+9EO*kW-G)j3=%O1} z*SCFbFjJi5WWf_zzidY7v>k0a2WwU0w`X7Dm^<~==>;kQ8r~<>uPHDI6j(U+860K{ zD|nT*_M%Gj!)cTEK2SJw^w#bBY}>so9Hm%Qwwz|wI>IQlpn>t94#RO4F0RaXCT5A| zr?uE#sCcgWe)#u~92P%~(oJU!nhYC$MfOBEav3%FOes*xGcapmGOHKK>k7Z~C}dX? zbJ%p9;F5=o{4bcCIlnlu$1I$fxH)0p)T5pH9X85Y49p@6Hgrr0xb0vTAEthYfz_Z# zP&Hn<^R&KQ$s+N)FWlX$E=}E6vdsMMOaJz&D@*N4SB2kw6@I+x+SYxg>&oxGj%TmF zan!DC)AYM<(%q|XUENoxpW_V*^m#}?bYVAAq`);?CWEmM2?ERzS(%^U??)!0e z8+D(@RSlZ5d7IfUJmY-QdPM2|uMYq3e#&2dEmdatm3Xp=(SvP)4ue9;b$9#Qg>$>6 z3nY0qW+s2092fYYp83SLxuODMXXe-aTmJWCKw0Nn!|9oV3_{kso^#vH++ojjaliSe zT>%SPCJMBAMsx;suy}MF_!qs$_d(aAY|h5WN$V`;UavON`_WXMY^ld!r5>vAL{qHg{+ulVat?pgu$bs>{1hx!NET(C+b@?c)Bzc3->Tp zFdRvAas1VBW9Qs02`&s0ld3cs*l)D3CLCc%U^u48z{tQL;Mw5hz`(LYx!clSJnD#> z%7W$xO(`*MOb;ek88WbO@F?D#Q4-BC(PFQo%8@6pCa>>sTa?ii&eOoa;aXqb#UgWq zxu1hoc0%(MfmV3|CXatBSiBkzZ_s2?y>WO2_nd|jHc%Ef9 zFkfiWQ8=1;r-hk=f&Ie{1_Rw37KR%$HMbkEF#qt-D`;RaU~pI>%izGE*RXI>PRFO> zh7~iq+P#ixzhGjU;5qd&N3e*v-ihh;3>>yfPi9OFlJS1EAkXk9n*)RHfhNZ{Ya9c( z86M1LFR);+*qOv>+ZV~e;K87GqLYDPx_*M9S4zW)6C9iq#o9C(k`1}sO*nKFymcLT zX8+-s`exfkmdU;b4CYcT+5!x-7Ab4}U<~}gVSS^~$D`9@LZi(Ijt~dQ(1bImL|9Ym zjX5lITF=RNOwnKs{Bh>oo8u}Dt^cmraHKf127TZNxpC&YNb7|d*7Gc9o2MxM{wV1D z;H+-|Yp?<9y(ecSG;K?xgi58>rkQZ)DV#pA!S=|Oy*anly=)qqE1h2IOv}vanDTlu z(}n5hE}V+6;aFg^f8&w;w{HoR@AjS0s^^&^a(|$%={Ud&Ji(FnAx3V3=@Da`EDT z2aHw~zKR`8QyW+$Uo`i0Fk3dXsJv)YIpGkxp;_?-qtXFpixw8G4bAcm%nkxfswd7& zTEL?AqfzchJ>w~sRuu^*$pwr`5>1K?EujIenj8K#J2*7SMKGN(>9CP#l6PnlHtq26 zXi^kyvT8W&F@wqG2cwoii=szUzyV*2R~Bp>JNtidOl0tDOk}v^+-b(N(k{^LPqR2v zf-JKHL(|P!A+MS$j_mjK=sG095^So zoGI&jmy6LrJT6w}_!^de4i>43OOq!wt2!`AC^TtAFj+ZBs+?$)?_jbz(5Pb2VX=Tw zGnPq`A<#DBlEx0kdc_4z(mRe%5@1#Q!DxMf*@~kjRH4=CUk9_y3r0(Z8)>eriVqs) z7BE>ZVAM3=C}?fAjbM^GaXs`!v+4?F8;fw82@z5fO_~>OXzpMN&z^6yT=Q~IWbX>QEfqWq&v5*GEmglqr{Pe7-;q0Z z%uhlbb32lDihrLnLF|)!z+16PhbFa2HXJ%})iw9ZiAxvwrO#Z}vVVES{%sD&9-g`E z1`Ik9VmlZE`Y-H1-7tMe%DD@Y(UnfEiV}hS5lu=9&Q5e_&D3R*kZ4kkV6wasCb5CJ zc>$A*0ISymMvIIsY8My-UocD5A7J*Hz^L`%f|UWM*NjF>g-&^a>unMd|0FxEtG-|i zVPKWr&~#3ON##RF(1xJSUPkK`Es`Bffj_QKXubSfGjdAr3cUyhy@Z?7?)qtK@(A2s zFk?w~ht^!?2S*GN1DX$bK7ZO0l^xx0u}R9r|HGN{F?*T(3gV2VZ%y==5gE(+w|=qa zj+OR@ISzJoX(Wj#m^M1TKQd`eZpX$svbUx8XG$_GUF*$KbRnFJVQ1ua{+AuT5)8~w zS{zp#occ;i)o|i8lZjfAlOEO1cR0|Pk;~zAfN_Fvr^AFs`x6|>KN_1Cv{YYVmb`FS zC-tH2fkvMhEK)z110OJ+)8!0tV7l{{`Fc#fucE}=W{HR!e=iB^UetWRY;%ISN!G*n z#=mB(1(jNQ z!(DjczW1q*&G;H#q$<1+ZK$~8{~^cJbME6MH*_6puKtN(-IHVbz2>S@PBK%%k#km8 z4t(HZJWzitL^qn@M}OC;d&yJn?`o}!DLt?~fa_x`kKctA?pOEeHN@F2d%|{i|6ay~ ze+e!uGlH$6n3P`J4((```w=)rBTy)hLs@{Se+9GD35U+9j2;b%0Ur`P6j)^sJek}$)_moJJ+6NAg21dITzM&3gcU_y# z)Wml3Hu*%P>)vxO@0&0Eakfp>y9}W|ZUP`WAYzf}ysO zVddPHC0_SK%~Y5?ZZarD|JG#ip1RoL0i*d@jv~Eh0&)+9KSUi zuIN9QF7+_@xlN`CW9ZhmW*UueesHqN*8V%Il#o5`Me1`o&Z2jWDhC)9I~*jwWyx@~ zY^ZxSv7tpygGoh#N#;d%b48f!f>$-M?{mL#NX&buBG7aswpDconaU9=LesN{dZ~ zuZ>22y=_EZ%@$^h8BC&YZ+k3Y)}GM(<6U#sxel)l%v%2%nyn551s!14o>Atg@GwuG z_0K+M+l+_y_R@X_nAkLOdQJr!rP=*h9KXNu-u8({k`6ELomf)z@r0XH3(Jf9p#~o_ z6MaQgHSgOI`^e=MXl7+rD z5;wkaxT#*bkU978ov!b%#e&|<;)qP>zvrjpIm51RzDmO9o&`+NYCrBWyWCTG>>n!= z<(%9Wn3E%NQuxSnh5bLg?sY4F-nZ3{QMp$Y>t$Igz= zl{c+t@c*24NmJ}deTn^~u)+lsPU=ecx^4N$C3R+MsLTB8{xi?HI^`_+w~?o)otxqG z_Zb(;jXeMSVRmSkFro6^wE3PI`TZ+cvhM$Ct~unC!sXI(u;clRX*x$7a~clJDDcn{ zn;7D@_$-HY;Yp?$o)6gkA3tx|$TG1)rm){bg7pQz)74XDMgFgPkN>GxJbh?Gx<}sE z?FJ3EwR=7temlwG-@*we%Y>@7d~}`sY~hJh$@3!qF`c^l^l!(snksjd$2ZwKLYdfw zbTU3D9BSbbH_CbOLGeh3kb2OXj6j9u+MHq{QAa(!r#HoJDNxGj>TY7@+%iKcL*uk~ zv%IK8z=5TyhxECHEDVllaxZLbt>45mX{PEyM%LH@xj#Y<2i;lNWlB_TsCs)g#fh!h z^KVnX7JbX?Jo|%CNmjyJ zt>9QO36BQWk4H~TQV(92^V8_rnOWw=@7`D%UG7-s=B={!<`$>rTr7*qZbTK`X63Js zueW=l>cHHxF#Genx4+FlJUG-Yte-b$^Q*guHZq(jl6fS`5H&A&ecoTIZ*OjGFYf=r zdf?S#E+&z;b{9gJ7(>r)&VT>U_Ro(`ovZEqG8mYi-e%|YSWy2@E9LKYN%e@1RG|h= ztsM%@yz3^(6vo6PHk76$tGZNO{C2;X?1>?8LW)lCJqja>YH|`O!l?fDWD#6#O01ctiYkg zrJ->*AE-4~cy>%`t9W=+ynu5H=ghV_<*Kuq6CyjN$F0&7Pz<(eZS`zE^HXJh?XREe z3u@8=85Y(v%WRk?)*|I_poFO~kYN&w#qnv35i$V{3_MpdyqH-f8Z?>ND_<};MzK7I zU$Ao3F0IvTZ$)${wv}*AS7f%>a8j*_^Goa6HjzsW42B=g9mHnG2)=QeeIUxim;K}Q z6%J7x3mB%Yi>lV$b~9`D1ZLKh&=U;24#y58ri)FGuCG{E&!o47duCBX4r`&)`RuwOK~#_*Vy-G^zB z5?lqYNgsr!9LV|;7?Zu5Yp--+5}!ap!ZE|sHpXYK=km;S=PK~Y3u_bjz!1$m$7fA8 zN6YmhMg#to6QaS_{?vmmF{=&SZd>ixq1dc2;l5TJ#{~w(<`;J^DmWS2IGp0@)VaXS zpmTv$Jf@^kgW;)Pt@*vm$F-l=O;DQYP`Nr|qXr|#6!Q+oV5y=5ZM+91-tS=+a5%ug z$gUcoDF1Gy`SZEe`}CQWH>G*pXnnJdQ?X@DYL}wV&nE)vY)_7DSYN;K*r_YK+w1mO zzi+rStz2==3?mN4C3R_CFPC|&HgSsHd*`3^my7;sTd7fbj{!PeGH4r z2FvtTnF2dT-h`8#%)Bgmwtqf~n{bFt*Z+H9DThUZy<>|_gG2H)Umy5XzcP`wew&<_{-xF>giv-sLSKUmF{%xALSMkWoo(|_m0|tgh8xL`Y z0ESPz*|u#043k(6*y}wL@NC(`qsVe#YslYs=F2UPYQ22J4k9O@mGE`X9mwnV4Yv!#F^tc!K5OAIa8qH#*`;3B>0*N zr$1z3Uh}=-W9mZ&&M7A}WdwaYb&gd@ZDbKo@|X}F-v_FW|cAZ31`p}d*V64oNGx}=3(X54VD7WTzKZBK9;a_%o5OFu#_>5lhJkvaR6Ek?^fIB>WHHu1a& zR_Hr%fNNT(AoGe+(MX1dVCD};PTp}}!xVXdp~qFOdq?7?>^U?*_cn%0yl-|+| zVQ4*3(8$1K>dN?J1%pA*6Or@}4s1pRP2N0DggXQnIjpP%Tzwe0=ACfhOxxzbP!R5> z-aYY2!jB6}>mRyvPZDO}@o!;eWO>kXmsy*UYu8!6-u8ezP8r1l7fXho^@{&uVqHtb zKFlxSJFsE<#^|*?2Uc<|HC0@7AhViTp~1U|DQNH7IcoQh&(V`oa{Fz2pwleSmC@xQ zL&xiNJ!U5Q+eIGi^U-SgyRU#@k<9ANoCmKuS{yvwG)IX=IikLm%fx`I=?5cohX#ij z&jklPjsxCOyLvQ59NZd9Ua2e0@=ylS}-;8xnqc~0s{ z?3E;+WWhrm0xgPyX)6wJacyGbF=$fgUC|)nwz1LX^qZ#06EA1%OX_0v2sFrzPKjkM zV^}ZJbWyN5kjGN-{;~SXlt3Ph2C*w5vW0V57^k03<|q#Jd|bGC&dkkA>gF_E`^mas z8_z%ChNiif+=9%`>!$uYKVAN7+?-x_wU(&K3UP;IM)rBGpk>Ld4-x z1y_P5m;U0%u@}T;9yGAq9ME6ZaC&#x$q7yh4#BK~hMwY+xlyGBjf zE+^Q-WS|=!VO;Kc4IDXcuPW1c7wT_o|o+|$+tE?SW&-0x_ z)NP3c%MH$epgPl26Z}i2e6PCqJx6iw4Bss+KbRYt*t`}r@zg9hKlelfhs^{gffNNn zroa|RTLHY8+1Jwg{&*T;*iBCYextaMJtUGjgFm zHv=y_xVVca&b#X>#qjUXY_nJ)$BK>@Ej_m%T(mqp?K!WD>da{~MB^H!Twt(q*qd;V zYu{|{Sih#NM|jWjDJZ&FReIkSb$Fe7U3e?+>fDGehBw#^Z}9rw+_mCz+S`EnA9`a2 z8hYzRTPi!f9V;9ezg%~1ImqS_o+!Yer06nnYNLY+6Wf(5pG)s+88ET6G&;;_;P`Tn zqldvb@!%T67Uek&+%^lO*TtvsoO)n-nSDuQac+aelKa_-bCori*cupr={B(~VQ_4? z$)xPIX|R#j|#(?ou`=v7{uPNO*FXXy2g<+=YXUPOVyck zP7VjzLauRD)F05axu3W8(9EkL$|()PCQM#i8B%q5SGXQAwsn#AVUTiZQxs{iQaYkh z!l0sbhhxhD&7KCfnnRLH5+zd@E^@lCtXg<#?nEbrMNR=rz6u`Ev}t6Ua=_2%h}Fif zR}Tg6ee_=|5dMmlC#mMR(!`rFiVe{}l%$}0^j;OB?pskJaF97+j}xx zx>5P@SN_gWR{=l8c?rsnHPak|B8z8qujM^r^6(#vNZG86gS~e$F29Mn?6^WMIOZus z%G1d|xFd8NY7CD&S|by&B@ZeiUaI94(vx%R5|18Q&+^hyR|W|xb0i#uvhR1*Ng_G3j1nyeG%XyZ_>M>< zG-MYw{mW?6QjotQ=u%vEfJ;X5-jPMzaguHUeTk|PNjy$6508ika4^m}AF_$L?Tg9YWYR_?6q`GSLc0|`L;O$zvlPAfl{-$qSRY&!{ z=iIGaJq!)LT+b?(s59J1o}ZB zwXK1+tS*8txeM5m2?sCPstPM5pt1eagdn8z_sQ8 zSA~+qlowhyj)i&gF z`6|6F^{BRUw@PTIc{O#h*;p9 z)8gF0pzu!k^UQ-%8=mEDb!64ZR`*DcZCv7P;KaSc(K+VjKgAa58S&04k+%;f&6>5` zd|q#m7|RX;hNOn%J$D3FALSEjIfwvpImotUjG2~3jlV)TP4ds1V$Z~%93765HV1S1Tql{hNIN*No>}8z)yUbv zz*50b&)K1NsMCSviipda3G>8SBti~wwj31xax?SOP4$AC_D{vwwm3*MI52iao{;;; z!d%6$LFtH;2Lsy#2hIr$oEobgL}qT*YcVstyKjl`A&D$bv17ZXT-Nry6!2Rpc9kn? zuQvma9LLHVjDND7LxMaOz0`6&ez8IHwyy6j!=t?|-Sr2{cirz zx^f-U{3JfHwx^GF1@13moWZ)DX~mm}nyKOoGF%d5uhczyq12+@;mFx>K={cE+rRNT zjf|%Z=Wui!;4FAKbAzOF%1mLI)ebdI+)EgKEz;NIIwIx3aNW-3O+&m>Pm|<~0~}B8 zYt2|Mx2{QYNdsejos;Ag2M&vapEj{F3cS}+aN-6Iw=Nt#l84N7UdA|}5JkVlM zG0ops@*w)3-M52k67eolDGcW=Sti%6+ZM2HW(wac z)xbTI5||FSs&le%BpqRLS#^)~K$V1dsEZ_Dxi5nZ!&(!zlqHwc7(=3xT$l_TPDB3#U+Q>COG_)4w>dzaPWE_+sw+Bt{soqB9<{_I!eX6Dc(7f9&<C!ifVmi_*cQQXI{R`z=@kxj|C{A$*{cAExq z8wL$kqe&VJOcknqN1iU>YcZ2$@Ccdc<^MudAw+e3EOSBQj1Qj`Y#Lrz7FW+Ww7l|^ zZBe^?PXl{O=HwVBDUpKJ9gXZC)au_9Fv>>uoL(l8{l~am@t&sYjGny#3_1>bXN32O zG}voPW|zFEnsI33p5@LvT|`s=m0Da6?J1cqX~e_4AUv#jYv;Yv@|PSb5>Cl)*ggvQ zI_-%muhfW;X?XZxZqJ@z_Hx0FeFEisub+BkT5-Tt++||himhq(pKfS!yx!ASsj{Tr z+*&BTLG8WEg*$VOEBrVStjV%NhHYjdBkR(6cUE|=Tk?S6ZfoNM9>K&$wwYPt2?s^5 zeEaHhK{TOp_6xV{ct^1pFYjEPnsHx3Jb}?~wnkp~_pI**T=ztLUa%_)Y%jdb>G2_* zvDDFY_O`0^+tUh`|Jh?yeSCY3dPntf|B@RYYwDkGuS;it`s>S;jL9AEwm0xwlpfhu z@7%kr_JonJMYDND?iKSdPsFQs&TbCh(Q022^zT57Mep?;z4tBpp6}>;Z_)pKNB@6|3G6#3@LNt4-#JnK zXH|Nye?1Fx{U49qC47_IcTUNVZqPpR?F5I)^<%SUew|YOb3*e3gJdBd!@#71M&GEm zb{?f!*$11dcg|j2e!InzCob;p5_8udXZFM$Tb%i0_V=BC8h++1IbIc$I?ebqw-bw^ zfx~X8#iGA^Icw%5mjpSE(=FRQ%h*mh;S5fX_Wb6 zrFFqkW&u-v!yyp^M&TO=d&)hpeW-N);U%%rPw|AX`ibC-?JX;3v#fdJ_G+0`_7rQU zf~H;FUfU;U&O7a*IHNCgM}3u(jlh&W)=odXmaOm6_|hOM!J?($C}eR&;)}k(qe194?3%95}aNrGaa{O>mB;`-4gSGGl2Ej8H*Jdy&Zuljx z;kw^+r}u@h>dGClS`8**2LggMnI)QfB;Wm6a(s)(p(W8rpDnxFn88v#@l5?85hiAZ ziBZ{`u1&bX#1r7g*`U=qRg;HHBlYRRcz&D7GqleMg!`;u%J{TPhrv^(bA!%5hUJA$ z%x_LyZ$BNsIP6v}qvD3WM_(}VximRCF!B9ybWUO7J#esa#UXwX8y5#A*_K0TI*$Au ze;htA$~pYgGGOEn_?Iej@Z|O%89i?G(>eHGmehT#5&Q8nN^k39rax2mCi``3IxH8F zTg-dz`U`i(DHHy!a8cdLJ(-t*`Oelu0YZ#>EgO zU8{xp`xnj@0nsIPE(I?by8;%@b#UVk+huXmZ+?9chvw6ji`9eOLOi+>M0ZWgjozOB z@Yq!A>3Olc3)y*%QdR^gIxh<=RJw9qV4;4)-7Llr438Hua0wJK9(b@oQ>R%=pP}Gs z!a^oy4#gY>g@cVw9j1M82Qsg!v9d5^IA*M9XwYX@RZhq~HG%QMns7_M1}jGfmT-o8 zL4ySXhn(tJ*b?HFR{U^uW??F@d~wvFfoXP2-Y40rtJ8HFd^Ph9aPD}_%(j6c{0)QR z^7EW2{_F(|TmL1ow1pWSZDe9t@O~Y$pih9~)Pfhz%D!bA9_#vAbS>ob($LJFsxo1Q z6T4j6go3FaZ3h;z%d}j`JaM4*NF3X!wxb;C}U#LmFq*J>@+JnY+xoJ+R9BR`p zIJU3go3)r-HYMVfLP$$M6Ng;Eg@=nm9Soh=RZ1EZ*#++^dFh5svIt}knCH{vDN*;t z@rch39l_2iVG|d(Th=X6>}pne=-4j5ibX|Pxhvwr1!qCukc+!7WhCS#rZ@%Bf~C%E&;|8=NF6&8w7Y6nDU~tC*L~3?bmQa;82obi;trM!%K^g zya$@u7#SF^hzN*XPTKp=;YHWkSJn;<&%Q)6EWWr;*tCJ=+N(tejAC(S^E-aVkz;XyAZwDk z^Djm=EtgJ~cH8hq=3|1HGafzJe&mRUNZ^VCjAxr&I9)sCv@|7GtJE#vnAAJDWnsIW z$Hql%o?)Dxt*G`wZs4za~a=C&^`pX=@} zoqEwJww3YpcIE|9yE{) zty)t)FfTr#$W|ZFDX^|&LePXo9`TO#91Gi?*+`z7&{p`cMNDjhj>pD!;rIjwu}R;j z?VqY=vB`kwdfHi8akaR}$RPwwSb}6vQBUHc}_Icr?cDy~<$-S>?vx5Jd~Wd=gKUa>5T zV197>#ka)_wOR~}za7tHT;R}Q;R#`U@KgG8Sm7=cz6VjiLmK`u9x8Qz#=;lPp{U|E z?dZ{4oC=J5ssia6>K;8SF7`V;bb2rJfc46nrhblxcNq zOAly2_rJ-cTK_t;#krWXg~zAjBx@QA|3a4zxfF-az@QGcCWY2NcP4RK3pla`N=Qxl z)@~oQsdW-7k0*b{HZEnIt9(X3Ci5*}IBg&+tSlPx%yCAipqF1Ff6awvIi^CR-B~Go z#tqFu6Am=z@7uufh~-tX;%)`!ibmnrPr4IBzKc}^l`P?JsOM$mVm}@#+OTD5>;d~$ zaT(?{-|SaMh&}R2wR~K;e9O|Oi(C%AnBlzc(V`BXjJFxlx0x0gPVlM;_55d=#HIft z%g8ZDbA!j#V25iW^G_zdd}O2~+2ZzX`Gg)pw~{iuoezvw>dQ1GpJrE6`{0na#N=sc zFsHa$gn%N~lX(5sChz*qix#o_ICwCJFYHp(X%uQ==!{Y8n3$4w#96`GLoGvqePPIj zi9Ui(YW$0q9c8Ond*|zi_SZoidws;X<0X!W?-K~#@4B($^PIDyOagNmR2f2SQqHRx z9JR9k^g&^p(+a2XL>nfNMVrjn`kwFOu)6dhxKHwJ4+ED&ij26V?FOlOO~wh@B2UBo z%FoBLzK_|%_4ZNMu2ZL9`YqiZE1+=>qVxf-P0bc0zYA)(c7Ps{#)wjP2;mDA=P zb>yquu{yw^P$=`+LjH^(5BW&~i|Xw{Ecgv)I4S&k;Hh~=fp0>?5xJz0v%%|`I4y1* zmY=4;eDu)@{;C&_{7a0UoBCJZQjPQ^iPGhd$Wt*nv@b+Utfa=QC&E|NHv z;9?x6vpJyPbY%BCuElvi%F{M?OpJN@0+-}sSlUTJmYzehaqa|?Wua+XRnmi z&pY>J!Nh+`SSFXK3?S9<9y>F|003*dWLt5uk3}I)Me$$-)T+f=E-Of=W29j zD{!rC}m6d(5&PC&a`Lq7W0|S%;#N2`czrp2nu!iSXiX_B;UGaqQvDJ zl5~UpV!iFnezhsfYS*N6i?&92JrwxmX>p*o!Lg=wQP(8H{oju1-~4o4ttQ}%x5&&J zw!sDRLcU9ud{<2T_bpof|G(o!Ot&L`gx=dQmsQl+ujtXMbXR6(Q<>zuPVCDpRP92R zb{<-6{maiXq5WZ9JGa2%aJ5sNF>AKp>gW!87}BA^eafTWs3NN~Mg9IOW@VuVkx9!L z4Gv9k(>JJ5?lw5S%cj3)4zrn*-@iMqqK_2#TblT|c-e2O38f@(xhVd6!mzTzfOG1G zHXlX(FfD^mPI^7Z&Ca}Fk#83kJHU8>c|lvcF~ebjIZNNWE$+GYC?ssLsYrvvmlu{S z4ogoZGw^Ka4$=QqFVJ*M&7YZ5@oUsk?nTnkvpF!F>R>vkQBt-# zLhpT#!6^yrEK8|;tDZteu>G+gc94-H!BWhj^OQ2T&{ z9+y9Rrpv)7Y1t*PCxP)veTLN>RzA@SB615Dn@$MSaVT$SV4SjoyU64ICIaOX!t8`0R}$CBPxm95&y&%^suz37%Fi~6)llakmP^B{f|#! z_M$k4<<`)iT@&rSM&Kj~jT6V@hZz`5Cg_p^bZvEf%;WrG02>x(vJWC)-76zjK8 z*iTW^>Y=c~BcWRhjHMm_i7Yh!>tHPSNZ2M()NY~hvqK_>E*ZvtHocysVyMb*$#3?u zQ!KSZ;E|x=F`=V--Uj?hV7}BKXv0v?W8lQ2b%5FC0FS^U5s8ERLJx(W9TJpycs8uj z%3o30hEZ^nu%ce0;DO14cAG6l6$L|tm7^9gn>8@qT43p)@Q=lgk;^W@=Ha2uR+r2^ z8rz@j6wc6L{IQN(K}-Mh=RU3n=C{@OohK~4#&KHBDDaL0)42vgtpltEOgv@>1nm~q zTZbRyF-l-IQeZyCpeJ*X(}01+Lsob74pu7vpjU1%_26wu?+o$ZRs& z@+RPzQHM*9zEs0~K2?JgQ5JFZF#NZO#ZEzVo&xhZ zVZA#=MlYR0Hg5^>-DX<`P=4*rZ)}!-B(%Go$wG(>QdmvBryHZkLMsIkJQ$h?ta!o?GB2n8a$6kfmSh(P?7spO|(1kbu@TM!ya3 zZB{dGIKa4}p21KqfkEN{<1Rtts?@DA48S7CST~hfLTSma@i%MIp4M zIc0W;-nos2G6{?v4i2r47`YO*YFtlz%EYrMRQb;VP9Fv4a}IhPV(Fd_So{<{c79Vh zbv1y$iAC!Hvr|G0{~@2l4@5#13YUEG-CpK6WpSv6dcI|9J;RO_<_d@HI2eqNII}t~ zSN&O5IrFQ~v@M$Ze)-_Ct)GDmszo0d+zj`YVc2R0%5D;3z!ZyM9!^X+HxavVS=k+l8BHai(SIRaK&=Pi0P`V<~8n? zCS43K4%?Nu&zSzHFuijAPfIgy28(?P67mVs=BdI>lNe>bN2eTZWmo9mZJr-ozp0S> zfXOWO;`?7j4lQ7fdcb1Vz#>-3qNKoLvW3@0fki8U$u1$%xT&81kf4_WixC5p6$8tR z&%$#Y7AIEm>=Nd2JHY(U$bsdJN!(3`DJwUaZZS;ZR$we^_7r^}q)>ubJw7EAFNjbEFa&@2os7<d4(&@3QqVY^YqfSVOe4_Mq9n z8l9MOkBaPKsED=R(JCFt7skD7LF&l~xjSZY?@*}OKBeuzgN&;SHayl7yp=Hf z@J_=W3%Iw<-o5>{zzzoPT@2i843)x1|Cu_Jt!tmHtCcz--Gf`sq4xbE?sqGV|1swjoHP>`_5sJ=c&9wnrA)3!(<$z{&X-L*fY66-~+SbM_-nY zzfbJkb9$w3bkGgM`X9aKB{GiR-k#)FIkmp~RO5%>M+L%t?#Cq0pMJUL-14_a1UH2> zdvJ3w%-DP7q^RrJgE7L4BHNN;PQSIeC@Q;R(w)ArtnM5C)WTh~0$FNLnHw%!*Ua!_ z&N1=5mu=_fewd@H@Hh5cOki5f=eRi{{C^eByuBRz_v&5ME0;AYBPKJ~^D1^v;pX0? zu(_hy)Xb6l!Y%F%3yy?&T?%a%-t~ZMg?ZaqW^N5_Wv#hqo0Yle*e<)4S(JCTFJWiz z=e5^gC-2dJ%xTVO;}UaS_R{UO%BLf1&lRQ$toVB~(e~ccyGJ&9$J}GK`EkLk_aeij z;{q9Hytu_pIT%H`7Zy3S3Y56sm#k+9_S$Qlu_l_!JV!hsjDdlHtLyHK*fT+~D!Z3@ zi8Ay^9hke{p(arIN$MnFze-j10}gBp=YNUiE=-lvUivtaRk?0=N!Z=ee@1Z%)yp3V zJM4RI`y#&f!ru%1T1)3A74A>pz_?_S^{kALyuzo9EsQJ=7-z|qNy+swJy^5<0mGDf ztD?P6xqW6H)sj8>{~5!M2izu)x7^~0%w5XloaJrW%p=Ox$5k%y!-ip2N6{P3x5C^0 z7aYFyo_D8TZSkSHH=Q0YMC0$J{@rolMgFHCqZ@I{kE}56Q`fRw+Uca8FMZEYs6_uC z?;7i7h80mP(*DtBeuuI&glDWN4Txu9KCtV`iF$@_?-wN1T?*7G4B9*2puTUx;{3S! z4^Q`WaxLtc*ZfV~{^#Sp7rX5`6y(DVo`lGnHPcAKxSzqhyM_piU)78@QMY~en> zw(|3X1FJbijZ{<~Feo~=af!~lar99Gqky^Cqe)L48yQcMfLPl zX2v+VIV;LS&;DDfAiAX2BETWDb8C2|q(O%x<7WQ4%`6ituZq5q<}5t;sUhcisM76q zpH2m6zHduCZzcZP)vP}IecSEb_5Akx{`~y%`u6_*`H5GK@LC%C?6~0A%plOfz{Hb~ zz`&5P@Me)<;U@++HYSHznaYM=Tp2~IHq7-}mY}$hf$P>buBe@F(-xL5lPGwo6_K;G zD`QTA;vFrnD?5UG`DIELXU{fKc$CIqFfFvuLRTU#g1tBNo@0h9yO3Bti-<;&+t1j} z)M-(9CsU`#)x8W0;WjwJ>3Ey5R+%+JB|mbmdH|zE+?E4sY;P>CF&FlEhI+{HDm5@m z%=@xt&+X198O7_?DaCC}v5i(LU2SkuH~Ns?nS#T7_B@7lJz8!THumXSHf%oQwyl1p zn7F-{?h-A@Nrnf1X;wxr(wyI66!l-uh9TKe_QO$zn3+W(;*2aFp~dkPb8eUXpXQme zHCB=HTE%Q0n`}?U6l=k1L4V)Ut6}kP|81CYbk@)N$5%^M3aHOE^ZwBNKQ2Vk!)^7G zkoNUV3HdkJ0+wi;eq4EGejY;z*JXzAC3hX_8Tn3p2@44~2oP{S>*(ph(AhkN;fA5o z+U=J%S!EXZ7Op;)lowIYSM_31|2?^lBEQ+MJ)5jO_dwsQ%u^GN&rUB)II&Xl(zS>U z`CnKWJoaieoD!P5T%=yy*6xoV&(*90@3u&Pm=c{V8^GXoT7T(|$MP#rY4v!DTQ@Y% zSbcRjQ*nKn;-V`{)}OEY{cdtz)y|$sDF?=8iAh0&k~tmBpJR)p;%oUC(uiWx8-kZC`;%tmv6M!OT7;wc>xR3^EIx0~s0igc)+M$|eMd zeB}Km;iS)0lPDbJpzz7>^4@w@ov_c$(;YIB4?3n?D1KkBy-2XX!zI2_k>O9^^*5qFtODoC3c1oQ9*=)grdxZ2G)#&Da$@ERY%=yU@JK&vO)2Nf`RD)ZH)xR z$be**eGeGSiw-s1R&){H_V{FPffF}(K*MgEC#}gwM?~Ux1jq2aVEs3_aS8XvIh}^) zrX4wMO9Wy+1d7|eYz?q;n`OZBOsn(c$qKZK&FbGg7Ytpj}{1pa3pdT1-go47_eF$VO+dqHH%P!m$=6X2X;YOAC(6Ntr903Rm(Ow z3YjT&)vGPpV$j%dSSV>j=&Y{NHUEw<^Jy%c@DF+UU)O}!4a&QuCYY4M_ za)Zt4z(=8i)nQs+95^)DbTuX^ut@z;*i_Ha)PFdK<<7c8d=~W*FL{y@SS}o5-P;t) zs?zqMS;B{LkJArEo`QzQ7V<5878*{11rDvv9go<(9Gp5bCp-x~kjU;V!NlA4;cm0S z41V5sTbAEG&T?W^3ZKmhlhA;LEHV!cusL36cZE3XB`+M{TcMES9B#-NxPVEtaKS;9fQ!s?f|!;~n6WYXi9<8r z>PpcSKb(2Ytlu`XD6v^QXx3shET@ny{PCWJk7Ul|W8l%OiFVg%xULd%J8;EI7noKaX*_eeb6! z(Yc3I`cEvH&pSP!L5cq(TdP_}7mKVwD8IJ?>mE((45^SLev<_(lUx@zTV04?3$x(R zTC|{Kd3Vw?BaKYKidigk-!rloE$fm^5oq^mxN^>rp}>Vjk-77E8E4y4bLTU2Z#_Pz zaB}Jd$198r^LI8Vab%TO@(caDUaxSaQZ&qBwT6r1jg@hG9*Q!qO_~7-$p+(>| z1KYob2v?Dg37m2#7Vww8Xe_*|)TMcWf!*`Oy1A?4Zc0vxQ_ZtKAi~pf7O96pOoh)PPEnRGvxdH*eUAspZEXQiQO%c zZshVP2rXgEKleP*#h|RhfLV4MSB(Pmlm}HC!nr)Zi*b}yHaRf+FmO&uU^fW}D*C`& zs=(s0fh9PACE2~Y^aHbzK<4@Oh9(1M4vBiftJ}F=rj?@v+NKGR$!SVAwGeD`SSC`jUKfo39L5Z5vv)h)`u4^S-`w`xzJ>TBCUn& zh6=3J0<6{y%&Jp!7}dFK7?_`I7pzoZuiC(VsywHD=hWnq3G5XP0gVC7+jelxIuK*; zz+95RzThgmVMEBVh{P7wx?Q0qlhe@nr&;6CT7Tg|Sx(MEW`~7Z$`yuyR?d zvDYqOFKGx|a)9|?*}oK%0G28S_A5VfY7^K)7?^zn*q@!~QudrwCCKT$LTJ_o=0JDx zi3u!B>8$mg%Y+s&u-kt~E)?hR6yTcKz;b;XOQE~ytN<2AkNQG^B;N(>`dhgcCN!~_ zvfDdM(RO6FT*mB@z^)+5>3Mh4d)`tY$x%J?jrduh_tHq(Y#gA=zUAdtgD% zh85F|A}3AFoLO3!T;$1ab)mFGak|t~u@wrrtj|l9a*7w76xfkA>xo$8ij_i378I`I zoV|8s(B-t*6HW7;T&q}BE@1!f>ddW?T-!YBw`)${q1L^~lS}&PtS4$*j8|tJ**Ryr z=G;pwxk?n;DheuR)~B=TNpLL;NLpkz_o1fzvIV~1j&MHJoF^E}>G`19_gnN!OaEmX zIA=G^yKFLF=ZgVv0>k_*;-4eu3m9v$AJF|^X}ZFJ)7OJj%VWX&#jN}a8oL%Uq^B_O z9+-byWMNbZYgPyc{|5%qSFC(mw#>K0+nK~CF19QC$ja>?z;=M4y%d&>ett;KRp z3{QfzD@qu0o@gvHu&6kq#L&Q?w97@UWxm}Kq1g$dqO-)0Ph|MNlS}QCxQUbE1!qNl zVM7C}#gS5rA72uSOHkPB;?0-9&}SseoZ$Fxjsb`1EH}YGC*}k5bsb&$8wCqziOV(H zXg`$J%M#C5VTefJ;1_YS53Dy$Ua}-AYsEB4q34Vaf{xyTjvNw&o^1x^rQ(ZKy2LLh+Lb19G&8I|W#U}_-Eqa@ z%~EU^R=s!RU=di$|B1DAm-sRRj(CH0vWqw*8Cd6jU{qfq)U|=pZ^LR{Grg>hCLK@2 z93AyU7CZiK6pJqum^n-Q$H^6Juf=9BVvs7?P_R*o&H0~rxPV7#qurD!@nsDg6d1)9 zEn3BEZ5kk=@zs%o^#H?M8Cd5pU{u{8INyLt`2*+IQwiU- z%xf13^%gIGc2H#EB?h%bTjtyA1uwF${vr_>z_DxsD@OqX?}r7m4W!vOFytQOjC62m zeZau6gmu}54SKU=IHoMjW8AXui`eDHRUv`GHpb$q)eH(eOwxgD5)B+yyEmKO5))Q*)LJNVdXbQRkyGGBhI(!@meXbz{vFo6tSBwn?8dU0 zb7C=rtRh3!M5lR14#kHzF@0c&dMF!`qRq0wJgffqt_j|vidVK-ZZZ~$c4bKvE*5f{ z80gA-z)9I!h3&#}P7%SF1ck7N)@`p>Vc0>j~h+nYZy zaImbByR_%?Y=(mFB?n7()?E}nwb(f8A*c2Mw$%@qQUwI(8?0Y3dshjwD4WnW?T<<| zi-qKxHyul?7he6q@bShqArD3Fd{W|SU}#QQ7c68_Fj*-6gX77jJu?QQd2DS#)hyaE=T~15^^|p}*cIIDXEw5o^DR8>~ zQJC+-fgESa?jHMmN26298?Q~`VmCY~xRFib0lUne1e?cs& z`6#$!wa7j|sLwsoi912;OVELjO$_^!HCYab zHYV>id?YX}d*@>vG3E&j?ZFIdUyB7yV4Sz$WarV75ffQ2y*5{yEPV5mcaVr?=S1OC zi%;<%`gbZec}>-135#ZB>4{D%YeZUQ)ORUe+{ClPBl|q(?UVaAo_qdSqJGh&4N-vy zR3@*9C}il~!o@jJ_luH|-$N;BUPB`xGuej>CT9e`So=QRb3E(giIT>xiI4X)-#-1= zgv0yn6~9};tO`PW8_uzBWKt;L`rQ+;*UG5Yd&xMplyJIJt zs|l{l2t2de;q-&wP7w!{wiOCqIU|r>|Ms-}S|8p84E2AnH!$6pGU>>&0@g3wH`W9) zG_PfNvRjB*&^Bk6xwPO0_KPxN(Q3L(k{eDdAJ}DJu~%i0A%pQ6DfS8GQ<5~-^%#cz z5_5g4WaiA#BCs&-!dm8kN3Qt3J;A&|xPI|+?Lwxo-mC3XSFD(&s9`MIx@X@K8}(&p zl=s&!ygp~LnSSlc??UV16_j+nE}oineG0SXu1QWT1;@)}w)P(JShPoQTEjl}O_E%T z?#)(YP*36FzHpDjN#R|uLd9Fjhl|}RHVd9L+~R*|#f#Zefr-Z>C$N^Ek@~=+)A7b^ z&IQ(hT(QsA>W+oNUzD!wvK3eSXw9R*kYcFn%ydomN&Q2XKnAWl1EvkauY}g+KV*?! zaQ>ieSj;Oi)5Y3yhi?i_6i|_|H#Jn_Rd8P|bC+}CkuS;Tb}dw7y1;O>MCcjgD(=;S zYK#nQL8@^_ZfU)-4%~C1;*wBQfMkW!qJKvpJ*}7|z!xBy8h5)@;hL7=vu2~a`yN`l z8a-feP>2grb*-tt{K$D;#6p=gN9BtPS&w!*t=h}g>cDVw&Ib2|60Hs#(>5}&6xin* z`b<-J*|vf6+V2DGj>>0F31kK^b}~FRj9YwD+R^XwY0Hh4XL#?ne7K{3$8_!KYdS8@ z#l~yc9Zz>DZJ4`OklD$2``#=2QiQZ+H_F+FAF&ai@bN;d^Mze^r0bt3T`Zi(uxHYQi)t=O_qFxB?zw|lqq1<#1= z-dp5ov|{p|6LW=x~;u&Md`t9{(r9dHtwskI;*opG|NzSZMC4%;!7{yX|E1^vd)Sj{=Dk+ z`U{Ne23)r9{iSb-6$;&KX_znUxYFB&f!Ru{uI1GXWu+CTUiDtwrMcyi;6uYx#d{2% z2(v6UmTI}Qf67<2Mj4T_Ynqq5)cUxs3&f4Mmu)`V`9Vize_~2wPdS})tl=b7(C_V`jk%#e>@x!sGX;E(0sO9vJQNZGj zP{ILbJx&1?jthkf>Z>?5#b^pld8D?Ad4iDyL;Zn+NA&s6H0gXv5by}*W{{{TXg$!> zXvJ)B;gSLa<7D2Q3vfr&9bGySFA1%Zl>?7JNP1U=w#(PQP2XgiU4u<`8bT_PE`3MMqN zNnKjBVyQrV2d_T!wk(eBQ%nX46WDofoV8iHPsyQsjts~9)l3^S*6;F_xG|yO--ko* zRx`hlJ~2hx%%))i8=u7m>q8cMR$0juUnz8#tN!xQUBULz5pLZbGd3y)bG>xx)-zk! zA)vSA-;YOn9cDibRJ4>IsdxvksmbteH~ZMst-1fqr$tUXGU|(_>Yg@E6)^q0*~3%q z>79?hdOd$WaqI0VFjCU^oATMm?B|<9=M;oPO9I`bOTPqqC{Ha3^3vY=CCI1VCUt5^ zlh4x2KF*@0Awh}1mh=c8%jlSBDDiShk4s1NOA-51AC|a>Uh;S>Vt(ca%W}744o`%Q z|9qGj8lJfJgovJ9Hs8d0L%qTj9@hk~B`rc80b7sz$0#gh5w*(nm?%7F#kP==%c0+c z)D1Eg_O@MXQ0R40t7x(iGJ0{Olk;3@<`k2t58Iap+dX(NS=b*TxUi?cUZQeQOSx^7 zbE{C8NAi?5KhI@(ERMBG z?G?~!NZ_5}C&<_m9Cl&5qO->oO+l_RFIbq>yv)ypG9^`zCA_@VlpTd7;xjg(bU1Z7foIcw{O)CN9%v zs%6zsGl+d7VpD!7+ia@H1IB+&9GWhoeq1m0JfE0p{yX0&vheR@9=oy=lU>ZVX4DIs zu1FHycRAksj{~E<1rzfjZ5Bl_hX%(b=RJFh56otBT>7o`NabC_me1$5bn5do)vfk$ zek0<@Xl8Rnu!EuVsloFJFQz6kD}Ru8wVBu!UwMexWQ_;!T{XS-EsV_W#V0h(Hf+74 z8rbRWa#Gdk!`{X_7lf0QmEwdP7<8-{6l3cv4=`~VFi5WLFl5tcVEQzfqrxzW*EFV8 zUh6|+^w$khxeFLXcwe-IDjX__(_mm^Flb;BVPI@~@VJL-CzrlV14FIKc?X8Hy{0^G zL^NkGc>5WditKUeax4;M2Y%v4el6l+ery-<-7K zGK19|>U<3ijuJ}TwR>EM5#~7Q#AxQo!DQf2E4AyXi<%|l!^S0o67?I@e0e_3W#U=XC~V@u;ML?;nx@F` z$FPN&O+la}?co9`M-C_X4V*oF0ZLXZ&)hE+G>Y4$h{!)s^l)QjIv@E&xUayOebu)K zrbqmi%b$ogoBJ!|cI_fwZ3ag_%|opXW+{wp|2*Ot-xN*kZ3uPbaSCw}m}uL-9ao)i7@Tc)Sje2d zLMbG-`gXw2L}t+&(_DR=RX5FARJhv1fhp`_SkSaj47=(T`=SD~FEUPfp~QB8Ns%QX zfKBIs2-l77Fn)#eGg=zUk7PDHl5sjHs=7dT^$Dj)sU+3>d1;J13%nvk3>t#;95f>i zcxEVW3KpEBvXXTThw`5dY(hB-1)ghj|5{zJy5kmcXo}T8*Gn9)1s`1C=VmczDbP0- zV9`hrohISHw4tD$RVTr5>5+rai_?X+Z#QdMC#mU>a49IJ-9v1TzF@vfVbP7xQV$NV z<}h@;Bc1YUp2g9$ol0F(Z5GaoI9Da$sFta#LI(X_Y;w%6Ah~JMVy9P#MGwCDpnmlbzSEGo6^z00hOt{p6;(Zvfo>lF+ti$ z*O$MASF*rqiGO07>G^jBe3iKmCfrOlVUNCHQrh647!!Bc&J+I%*o`No#xE3T z3z+YI=S5?j)fN7_h9;Id59-a6=QA(cSzNNZC2f+qrj>3!2_ogy% z?R}w8W;4OB;z9YUwr8tuZD`{ySioDyaLeI{K%>AF(9&II>3^}V_Y)ghnd<{vl_U;w zm`_Py<`qk7UTvAPM18K+ZsRi7eG5*wnti(SD&}YnfAP%#zL`p2SPmXgztqW};P57? zJl1&*Lu2*PC){iiDq0sM73PX07{?@7GhX>DC>n6!l8B`v>ydekJShq@R?m=S`?n_R z9a}=+l;G>H!nPzZxFo7fNV)RP;l;js4`!7IR|FWX*^+!GhVrxUB#ZxM+tl81;Cm2{ zD8ru{U-x$TcQh2N|L4GFw1H8$rcN||*)n#mRV5GD@2mN_Fnin*_iLAEsyoGhSwYD| zqf_J22jQQUUnLW-n)>9avAf#M`d4z%K=4tM!pjyVCE1DI5&xf?{yD<#aN*Mokw-tD z)kprDZ*eiPQ|3zZbJdp5X8m;rvpZ&6?fJBMpIgD!l`mI@eqi}pEZUyYxIwZbIDp08 zgT=kTwEcl?`;1w!!glF!0vrxSN^ZLzmgEJaMCH5@$YUUJR6nb%> z^GAzl1moS=9flT-roTG!Bpc&bDY;5C@<=!;`Z$~RaJV@zOUF1{_;9*wG#g1Yo1dAu zap7TOjm_Q`%;pyREqGiUWn7$eT%2uOTzp(yV_e*FT-}+`%-5Pvjinj~r zi^(p2Z|YtA&!}lIG-?)i7-%&5c`ys!usItPZ^&O->&;cY5t(&!}IKF~_}Xj=Oo&qCkP^!6&x; zxvc+=t3l#36O%^++l=+QUoh?dti)u{!(!3Etf9x)u`%>O)5RM{s`hyFd^zI(pkY%t zXG7Pj7d8Z6thI@lvDo_%1du;yko z;5_Ki$M!&L-H#phGi*de&s$7}r` zFH@UV0gc94drm$HURrgT-+XfKd=)*x+g{8OG8^W2?-FtHzrY|{(%IkB;V96sjA2Fl z?R6Hx`U`Csv?N)kukk(_=g|c=d)0S(L%4AtI-PcAgEC-iL;@V)%U_d&`c z;{y%WC7km@CO)0OVP4tsPNRis#hwQ}elJU;>`yrM8?Zb-eeTT^c|C;|7bk}98qVO3 z2`ma{@{y+N9DgS6HLY3~ivIUA&VH%RYokpABw1Kwam*Px# z%xn(*0tOw4vo5_?-Tb48?rh-IA5t;Na-!=!o!e z$i>s?X=%m9#nsi-1^ERDaq*XQMJ}62U$KzCpvrZ{O8Kh2#yMH0YfjoXgKTejnJiVw zU8z&N-nwRuarp-O`h}8dx1-$dWrp8L@O@Aa|46YilWl?)_ar?&&>hpJ;xiz3Oj|JZ zsfkWAk)PwBJYDV=qd1%0%1EcxvC|tXm_+J}<9C#WZ!JjJQJ%7^DsxX=T~qzDu9~N< z<(piZwtBT~^XuFh+P6Du;=aUbhjZs1NSSfGdy}*K zxctWEmEe1)A(u|yUUBr^hEs?39eA+i?Bm^+w%tFt+Ojfu#EEC716#) zj)h}F!|U6-D?Y!v`+Hi%jGe{$rY6iYnqv2{9AvoHwPWMs;}evZ|KYY^U~S7f$0Vj> zcI{#FbRLF2h5DUaUS3`iEFKawb6s@H^i5%6%HM>TjJY~3SM)@0eSiNzv%To$s&$OM zoXM&ha%yYVurbPMq}Yld^nG|^bN2mrpL(8MV_)}AT19PP1%pANrm@`&Pm_c%cOIXf z@4tW1QpN^$9fmUsiiHPQIyT1V$F-V;*Ru;Mizht1`ust&z_sc1CyRrVkN+j@}StOmHAymRy*RWB;lkxaUmopO>HwXr*-Cro) ztu`yAh?8|H=L81UY_61(<%}IOpRZUlP3rOj9UCwR z;6$~SMN5w{vQ=cnm1h6roWZ>QV2LLSPejtI%@^!;C?|M{ZFZ|u;WBYcWv_3jSj)I{ z#g^wW$sQqcJ2xJPn!~_c5%G2hBgca`&hvQ>UzB>+DfM>WA1?LhF=siytY>CBI!P^I z%h^rxk{p7?CnXZLDBhFI(php+DtXStwGM3IVILhf#Z1zfvuVSl21fonD&3MoGBJ0h zW@Z>=hHf;GbST~(k;JB!mL>hc;qaSJ^&JxF4w6O7Ik%?ET>5MFc1y}V+1Fx*#^;u< zces*iIyH&=Nznz#S4s*umUHyj1gHspsXDNyvrv1U)M-|)fEfNSPCaVvlGfq>wz4Mf ziqI(yiEUUXwdwXtgGmQ|86Qtrl6l}b=iJ#3FHZ^Yi#S_cwkvDT43U=5)V2508E!LY z3N_YOYKHUvbU4uSP;PtaqR5#nObgfEWLUy~BU*ykpl;&!f_>5g!rgwSRpPT*+67>rXFkCpNaC?@wbeCZFWzL4$ zzDccfszSH5#5frn%nt&JE`5xdd}BiAUmXWt zHl^uWX(bIkh931b96zUj_BwIQ?4OIUUNnOgyVB01qL1y>rP`({7;IXhyDXTSiRaQL zwT9xa?MC*KV^W0z7^h!tRrv5Ik$-iVt00$)n1mE>QGn@mb|IEJmWb}uyh&Ttbe=Pw zn0QCI@%voHoHM-}dQ!dp%*F2<3-tqkD; zzZzEUycD%)VnggVPjSJ#JiVR5FYfU<*%cM7X|!IGn5|FPhj9ZJ{FG!qK9@V#pElWr9%S11EV6#|c4y4sy4Dh%$_G zq^S>IM^t#5u)%*0~(I!0;3#=U$G1X&xO#c+Jt8Krbq z$V|FHN~>VnwmEN07fau_ncm^OPpYMU?jFSxaj9EfcC?+EKXc1fheJEA3Awt@Ylyt- z>6XZRSx80HLV?9gLy-Bqo{Ff$3rGGE2WH1J`rJkz90jThSmHTU1dMJR2&VrY}eb21Uu8T+5Yf3F!qYF#0ma56Q{q~B|`Ui^?k={>e`2MCmg)G zBAt1v)7JXb{WlslD$X{FBuG_F3V-6TkM(3L|E>!H5gLx{4DwqX@+Pu2e0LCt`PnR_ zqR1li#X<0>fD3=Y1*Z1z4xC%uSb6?L_t+g#h+z$6;`_HiOJL&tM*gQoVM;@zfLq~XIe|unmLC>M1qmFIKej*Rdg&^d^6x{tr-ahBqY*7U zQye&*Up!!s6K>%yxzK($e1^m%iz9qB4IHi}VG0wMvZ(ekH1qwwSI@7kq&PKyJqOB;&XLV1=lFk1z%bRS?h5GdKnz~Z35xp)Id$n&xlg53P3<%ciH z|4xzRH1hj<#PE%>{o^Et^;?{7ZIPO4=xBDsmsQa+y0BuNQZmazk1t_7y8~kHhla0B zREfM?&g3ZLE2=O5*7G)W@5`2mwmIfuc5D#rjTpr2kMR%a9d1Z-J;gCO)Sn_iGh6r1GfNUV+uo}0%Pt+{i4Zv6Q?&{Fw5KBY9sL| z@ZS{`2ca0f%L+TMYB#G3G>QaWoe^>~Dac2IyTDayDYNsgFF6d4{r3jtU1Rc5+Q?zy zz{M8GW#Q1qtH@#SfVpl#RgD7k>iTQ!%HcfG3o?#Q;6Bq{V;I0Gw6IV{U0}lpc3TGK zEkC*hH3YgoFily&p&ZUBS<%6vSX7|aovU7A@qpD^oq45#z@!WHpOsl=>~QJ6z#hBd zA4~hO&g2`;_601=g!9Kf?=K?hSHm&$Qg0|AzX4aM6elzCMc6Y3`z zCM@CHz3T>37O+?N;_vxw*DZw@<8pHY0Q7j zILtN_YkHRIaH@MZFuNaM^~ zfW;z#nfu?(Da#D?syU@+1?F8f7O#jj(EF?y_%-R|CZ}wX7>Q50EFYc2zDiaFH#0FN z>1xyqd|;k`)WOr|M{`3W1Rc{KgbPSrXFs}t#mu4Thyjc31MZH1nMW6J z7zuQ()f9*|==iyfSvZo*Fo8p`eeux=lV*AH?DiC>KWWav^pR_mr9jEI&Lba~g;!2K zVla!{kn74yft4F-V~)?AeoX>jn-vN*r|+FS)niFg3Y$GsL(buZ zWuMaoUX=EEFY(w@9QN;(YKo$nz=9*3EP>NrD+*)<*hHE5tSZYG&%Ff6SX|`GdD=tKAIKYw{F=hFI%nb$ADKjQ{ zT*#=~Pm@*(Z$18#=~7R%1AqaWA}5;z*_k7d?=TgrNod;Tl# zof}w<43?#ENj~^&&;4~N)*@8C#hw>K<&%*ayvLSV-S=I7>x zF$YASJufkuz`E!vtM!Fh_VuqySeFSbJ}~FZ&It@`1!sP;bE-32JfFeV#$makxa|Rx z?T1xI9XQT#ZeiYDD}0@Knd`QzR-8r-rAsd`n>}E*c4*tVq1OHa^9{>6M>eq7PGEk$ zojJxK&BnK4dk2UvRbW19DX??{v+acK784dS|CX4NIA4mXULr@h z>W|B`a#j0T0&z)BJPi%<>^X}J*bR(KMK^9eY`1l_vRY6y>%uVMQ-)Ws z&XYG?$>PY$$iTq3VdJjLQeU?DUsvYlXlYhRY*+dBe2JMr6OSQRy8=hcg1svzaNN%p zU$J1Xw+UBU0>?9M^`#RyIuA@a`XRW*pq`^EVC|G_j+O;gJ3dsUsBs=WF0g(BN6Q9| z)owgf9XL7!GOdq_?lj=s>maaQ;Xv1ejGYTO9$Ry%m~$T9&LP87v~)q0{2k||2^`HI z_DxgcTwNB~qQKG4uz&V%iO}Yi*FzO8jpns;g?+rFJ!y)~+J#M<8upyt%_h4z-}^=pnVKj@u2M`lr>t>ccKf74mm(hp`=OtIT_ zOeQu*iS2-M!F8>T3~UBZTv$KKAL))cy;}0ojibg&4E5;&G1fkI?lC+)&wXSTd&pVG z9T!rWwqQ>&<8+HX46_XMypDOF=4RsxVJx!|yt^tmsr&f89;qW6WQ^Wa7-?wyNK~Aj zz!tihp^4F#!+z`fCc?Z?Iwb&F%B zGn@=P;w-p@!K{8Go3WD4MGLtpENn9i*iI`ls7*S#;!efmi9uW&*rqu!rcX4Ida9BX z;IP$&t?bunfw{I~3(ENgrFVM^WFN2#RbgAdknL{I`O6-P><2CuJhGZu#CY?}KLJ-6 zhJ%k(&YroztiX8Qm?yEodSel1ZUDpmJ4YoJN%AFdZd|~?T3}O9ze%PyN??tF-xE(Z z{+Mu+G?_U<7lUk_Ha0AiE9n&}VM}yiyqse8REIG!f$hY_4WTS-p*xl(2QZ2#uuV@m zz9xVTbo;viW6p)}jR%bQ1sGEsY>yUjCQi7Xc)&Pi8{5Ta{>cY)_yQQSCj?GYV6%$| zXMb>tvxsf~HU^;twlxCvDw{UMh#z3!op58W&DBM=x3~=zr(R@8D!3+{I5lji(Au{G z2OdcBEsR<-_wFSrxGU-ZP+c$Ow*JQ(wkGZ_61hhb?(AJFGJS&CTERW1 zV{ZlilNGj2<~))na9Ze;x5zbVMQ)J^^TjqZT$ye2AXYFXfpJx@;1LEkW|w+<@dWWi zg}m!*r!USG*%Wa3%bt;z?Nkv@I6uG$b@G-e!kp_ z-1T;L+-U}Enz1~4Hn1l(u&pszz;uy2JAf_uz>B7jPtyw6mI!laUErSKU~;Ti^yrPF zYzL0+KJ;SpzYFY!FH#h4G|O_&G+;|Uz{RqWdy>N&_6a8s3ovpnxRb)h$ieVd)ZwD{ z7B=U;r`m}dQ%l{=ol^GcIJ0eF;BH`8xR@c+h=HTNf#FLmPuhleoDK3kyOu374Bq3C zKWhU6`v!(RKh$O&U|>r)_UxYZfsS{-47sOIV2E^NcrlM*t`ej8S;NA)44Flyj}LY~ zmD90t;TAG@_j+B)<_`?)4;W4-{(GA3^@({w$d5}#oC*y57s8Vr7-q}0@aqZwTEmdG z=lC|&>j%>q_t$S&b~^8aP+tY#hWC*NAH>=)Jk1TCR6C!=!J zFAL5MPusBkz}!1?3>ZQ_aBX}bwlI)!-bFU1fa#kBuDdK#=w1^mymk4bj|?0KjOT1% z;4%=se~E4H16ds-?zf4IYZbWHH>z>w{n!-nRP4MOL&LY_rzPa>)kpo`$KaK6ZY`7h zr`#X>8@_u~4xE&9vRx`ea;Ef@0w z)`JtKUx^S|t<1f?#C-Kczs&{p6>nI+W;p!4uB7(zkkU~HZZ?N*t7|_x%o)Df3+$f2 zz_3rgL22#+6A)(u|YJPR?p|a5D5|(XyFSs=&S8pE*Qq^3(^6N4eN!Hr2~) zYhd*5-sE$tN-Owv*t*!gb*$21Zz49Oo}I@l?67u5`z)RnybOttB6pR(y?1o>c8QG! zY-~0b#@lDCW=!yLo3p#^fbyozN&*H7jF+8FnXUx5WG=fQby}qT>_6UFt{*%ZXGLd8 z9SGCj$YL!&OYlJEwEL`_VhSrFd3qTPH(!yc{}E}##I%~>4Lra%bpC zGR@kyZ0lSFM@9}C&IyTi57MO=tL21(9X=_xG9Qh!3NZMUczI3L+xy4o$N#Tezmac6 zYJwiu1Fi(#e|#~9^J%gu zHS}$t`s8(14`b3LEuMSlZWQ)`K`LaG=@^7=B z^=Bz(UB(I8&n7WGC~7!m&8}MF7b&)5!;A&PbY{FzE@%p0f zi%Gw_GEYvORlHUuC^6*i9z&H4?`-Ct+dN^$3aJ;VOF5)Yun6n;O7SW4{0up_B}u}g zWa+6>OHTB#|M=6jD@?wtmC1l5*_naa*NN9=$q{X~$?xTylp9RCC7m1eBeTvmO>Ij| z&C=$xDf~RlN|}NE(5{Ut-gDOb3#;hICm8ukB+QXu582(q z%(H>P?0|OZ2gXTj|4D6{w2x)I%8>@pX)cyrVHf;1R-9g}^HFT8j6;qXi{jq;4U0N` z9JR%A4sjK`DR&DAC5x%OJgRN-vCAjX)lc=y86CeL4(B9aDo&F)z#?BXS@WopScp=a zT9RRR=ZQz2oS%gkN1Qkmd7`Oonb!^HLk0}>YmYPV>3F98cqZB=v9jw$6{~hp`xKoh z!_tihI1JsCJ2}^;@Fp6aRK2iWh?9e%zDJQIMd9-zi_RlTj0KDhCs=lRxV5>)Rh>M- zC>J2(8=)jN%i$jT%O*$mj3$YV8rK6)2zB4Oa-4@*Kx~Uv0|Wby398dhxaeFdXed<8 z=vKZY!X&3KKSJQNM|MR6qs6~#9!X-w+W(5@t0{4abJ<*)ah_+1@#jTsEIzMz*jC6e z)wfhkH;m9@7>!moxlf*W)f&?jXAB!X}$;i5UsaQZbq0zH1)xWL~VCL3lo zo2vODK}(i|&(v@Z^*ZA$sKLPT;<;C)GT&{bhqSA`$V3fsCXbY0oi)$y#^5l5}UHch*_CfzkV z>gukrZQHJ{&2P<)d1@8D>)O?IHI-MG35cX zBF96~=YmYU3DRP!32l(IL?y;aYUnJJRccLj7JfM^`?9i&LW?IB@Qp zknG8^u;q1|>YhEa-7-5J;#ikDu{A~HH!1#((fYWM{pr(F8VL(HCf{Ka6_-1!Tjj_T zG9{^(|Dl2muRaFpMnbli0hgW!<^@11uoVAk8eU1FaAll+tg z%#u8b$Ey`v_;!*fcDkih~L*P4yY3U_8m*avLauQ~9(z2*AM znhTDbx(&M|RGf}VF6U5P!uv?>Lp8U>4pzkkfqcmu73|RqI>gEf9xL_yQd~Cgw06pd z=T+bLtZzGTP&3SkOWNm=_Tmc1gW;PxrfSEq8`O6QbOrFtRo?MPWtyj8%7GT0l!x^k zdKXMxU)_1+xPyT+Hr;7v_eNF)k!As_1am&G#x6;N?XT@7Fiz?gVCl-4d2!{2#;dh< zKXwZ(<`6OW6x(o5lvDezO81P$HS&+RWeXaWoD`f40|c3!0-o%TQf%VcaiLYO=U?49 z?Yu&Tm<27Drr$dmonfq4bl}~z=}c@+3brrn|2ll$W}kAP{=VhI*7)#6`P)@CoM1e^ zH>h*TW*4E2WmZ?Z8-FI!(+(%XjZtsokb@p)p9K zRjHvd;c|Ufb23xN0ak8plMoM9wF3Q+85|nL+jv}BrBCnQ-o5+FDJDsamgoblAurYo zF7CKLdym|Q#-IxaeqVOn;$-)9aYx(_#?#E*U%V~4PO!2cVU#$)D0^ai`{$<58ce0P zcgP*sqI2UPlhTA`ju#p|ZZ|4;Yzqo7mTX|uTf8A@L5uu>`bOCojj|d$^k!H&e_#}@ zKJd!AN%ak*+8#?b9X9xLcZy$8z(RN_4oE*Tivv^6Rw`~06?G>-r2URR= z_h1d;cJNxTF;c*4T?4CE1dHd3^>H6e-DOzaqPGYAI1)UABSOJ6M!+gQ!6iw9)nBId z&PtcA4F;26xOi%?);oQ1-JsN_^MQHV17@`!N0VKStv|u)cymKa$+7g7V;NJ9WiC0E zwdGj$kz+Ymj-~(6`}^Y9_Frz38QT6-DQprD5xRBkf)X2dM?;I(go`(q?d3SWj-xG& zN2|!DH`S8ctb$?Xj0Hab3K#-^b$Rb-xc5?+#bas76P^DG4Kr2=8*nhxmuhxK6f{&E z;WjQ{2so^nG=YIDle7Op$EJXu|D4PzhRojuxlI)qo@UNsDPSlMIdQ6r#q`1o>zS-3 zFZ6vC8(N-p&AQX2Y0%*LN3&5wbecow1eNalD;F9UoLC#+IW@6=S&!$bO)W+O&8vBO zu2?p6Eod-cP)>?y=Hh5xlOttZ|Dl(Qp_xC5+2DhsHwW{^L;*vI=FN!{7%LlA%P^}7 zde5rqh<9lAjbJrg!O$()yu`41xdpRf1_R@XCL;~z&l%hYMVix3wir)f^$wUdPpk9P zl-9K>%nNncOa;78>u~xpFjs8!__s@;ZS9*=4;Yu~dNr(`<5QZ|Y_Ot%!Qs@|dJX0a ze->_!;e6vMcr!%O&!RcfpqcBylu0{U3^|(ZoW#T>m#y5h#>`;~n*_rn3w}-m2DX9* zmVhOtG7K()4IDE%Y=3Y+muz4;!KHpnV)BgH3>9-sGa8(;n&J{Bnnp0NYG}ArGPFyy zsdcEctx$GdsOsX`Ft3t>)1skFl7VeQy%JZ)ET$8DS7*#;-8#p}QuSLx1EZIQp#j5_ z$OguShSVqBU$*#hX!K4gOsnt^JM-EE*D~8@jv|rma6XtD@+i9HWLP|J1JS4%7Bs@Oe3B&G`w++!hU< zF7=#OCrrJ5qz*JPTf>EJ4@kZ-Tk7h=W zle)hq-Q-}uoNqUDO-`Aclo7J_gm9fwo1sR7i2|FM z2XAB}?^T6qsdu{9PH5#QXb7(j<@C_#PvF+K?XQoxz-c+F+t+}BYeSc*t5;tLL&L7w zoL0=IUoJT9$Y<%*73IY}Pm0ZbV;?UUbEN0Y&kTNgUv=7MxNJ{gFqPmm-7z(tW0SeOK6-t1_I`lrZd@Zp62Dh;Lp&RWI`zgF-( z)ts(xd9ptHph|;QXVF995CaA+jkZ+>!pa}cG)!n+H-Xi_Lu#GN>6W5y)(tF{H(SFs zIgNfOT{>~LBvjArW@|(RE9(h$Wg(u%6{-dw7GJ+{(`XTog=<&b)oZ!El8+DcvM@A@ zdvSfO;4s&06G)6WSf~R*=EV9LyjnjD9=`}I$U5I%AscKY z-c{jMB+0NchSNx*A*`~MF{3Flu|Y?wuk*kXMuP^9f{5=^T4N*Jw5u*oifCTU%KY7< zYmp9{r7qtDo$eJC^EDkOPdXuWB<41|N5js5li3Fq`emZdCUN`|iE8GSIDbB(;oX62 z>=JA%a=8<4X)xCd+)aAGQuDNx%dx@s0E_nq7N3HSn;y%bbf`x>>IqrM#9YCerOA+1 zdHG}mZ}XL|ADL2L1h2Pmm~drhi@^oC9ZOHVe|RhG5m#hHGlzu#tw07&4z_~{{hnJ` z7*CwtAi*|0WZlFAcid;rIr}z-XXmsM$=GvQ@zWw?+Y3b454A9A)Hf&Y2#?X4Hz}dn z;KM@q6%8}GS{Vg+4_2@;onY!!x)NyEu-mlLTvzzqg=rfl8@vQ~DtP&>IyQ(~sqQf4 z)Xo$&jyUNr$sk)g@z&j*-iTgf31;IT4-FMguXC99NP%r-1M5MJ=_f7Z?&$pMG)_1@ zwSwh-&4Qd#f7TN>886(?zge$zUFDLIVjEjVL*<|NLyxZYEod-wXg0E7sD8x4?7?8P z;xcQ+LU)G%1I@&5GK&>;gSLGQXUb^MUNJ?nsDV?G*>D4wZ-$(~hlh7VrtrscdMhxn z8!&(4UO=cR*+btVd6`J3QI*-pZ-Dy9-lIM4c>qbOTAH&-P4JGGTI4)d_s9<=}7|ygLel*iXt1A2Sc+=o7K^!lLWjcPmnWLoc3?d9M4~hmA86+u4(YDV35^q`z(3S zw_cjf{E+tatqWf3wyjN5`sopF_OnN4Qvc?-&cc%OaX&8GFP(Josz%z^sh=6zrg?-x z*b*Dwup1>!zOm@vf!;L{0?k)Ux=jlh=6+j|=;8Cdeg});il=Lgn%O3#orpZ^eS$^% z=Hrc%ZuhNQby!xEEr8*Eo{l$1!=9tu_LZ7k4DZ(PGNd)0SaVLxOrv3XmtTWoTf(L} zTn(PY_pYJBFRzOBkN7=XlJtA#2mbcaEOd|M>}AIdHCESwYtf`L3lMwj2#? z3-UJ{Sg`18SL}w1-?z=I&unIX;CXmw%j32WT4pA-L99M=3K_E%ACKR4&`4nF&Swu1WnE{$gS|I>9i z8Wi>CD6Nl~I;+)t!m`8@EcZ;h6DRa;n9yoiG0n_><;Dvwu{-&bPPF*^oS`oEcH@Tk z67{OaCl&>KU`g1(>VJbjU_)!WMv4E2mZ%S0$qcMc@+H0}PjdyaKG@pwzUsrI8(Ef? zmkbjwP3>qkHefE8+Ig;Iessc?dPe!SxD1Kl_|C`#X5$Fv@>{|DMT>pE^F&50PTWu= zlwXjc_%*;>bG1UeaRrN`BAfSuuk)hHj18FC7iG?V`Fd}H(!3R=+3j!szkA*8#GLeg zvav<8#dVP&@s*Qqv`Ur-$citqQ_7#`(9m|zo$=oc1}*#kWfsz|-=6OZNMTXEb)Z80l+;I#{f{_!{XL2WcGzzR}Re!+Xe7rx3fziC8!{SE+|A_{h4_snD z7@`ZBcsBevJ0a@GMwU>8Ht!SfCpj?RT-xDn(XePsi*pe7BwbEpgB3dhSf`z6VGiYH z&IrD1nU~ts&0%n~eFDqhkZzWO8_p|dGSn+nFZ+!Uf8bL_9$+e&-^L++@1pccfNKRTRbz+;`z7xg{s$4{?HdSrBa<2 z6;#>l*K%L?l$*3^!mofvz8Muf46T1wwDMOpwXa|exX{eg!Mr|#k#7U5`GJPX+Y_h$ zoW5z@A}^_!&<#r>XS9ZW&|uT=bZ;n{XTh+()O(WPye9c(kHSx#TNtGOUf`H z$jG&^%afzw*aC@06+xaA4Gd=_dOUa)d<7mf9$ay>Nlw5x&5?ooNLS{he+{Jvm^o)H znWUTjP3P8@top^@Zn^qQTeddcR8!|$*sI%#6{&*C+qzW@eT_X|)oO1~Si>TCBFtby z=Gw^pN0Q#goHkz-6S?=qw_7F*J&s)L$J|1L#f>5lZ}yO`slJ(@A6dn{YwK_GS2Gx= zEn3E5c*d74nYB@HjjB(U?xUc_t6JP=Zm_GfIi_}Owy6velW(Zsdy*mRaT9BE;ADOO z*=MDEUzr|#C0+4X$z;5U=kREOD!6;M!AkAwgNnMTLoTgNH!7{ns1vj*RoRL>sC}O*kO+ozs9J zJ1{e;fgvKR$$??gnY2aBqO-oM&3RUM$bp$h=K({1u_3D)6K6x=4M`rA0}YZzyqDV+ zH0yo1tXg8m5apO2vEUdphed;`V-nAYB{M9KYPwbM>MRJ2+8D9Gfk~`>LYpT`mdAtx zi&VBgbePZT5apxBHbEnlMe&g3bEZX)A}{EOs$5u7yQ!sc4Rdym>lv1`j=~()*`X_E zgcRBY_Q>g&g!{<(8(f;rHCH60TUeptK$H66y$j!QJriQ_k<(nUyRn3|GAK4=?u~9I znO!0x?Ekp$R7qczVk(hTKb$UDUwn+2nd$SIl)SfsjS`P%9-Uu%^uh6l7;!$0&?Y_^ zw&de%svMz?(>NFooH!g1#K5%uVk(2S>a*_;88{-Md3tuItyJ)gNL-~7DWfMdRfjEr zGnHY&yQC7wSpo$Psr)4#VFBC4oKqN*C5}8iG1JbshsjJ-g?pCH?bfS}DOaDA)f@f^ zG>AUQ`+9GA0Y-tCREA7Z9*0IrksRNEyh^Xq zwnGKKc-tfdISl^oU}2k5*e20+TeOj}KBVVi14E9;WNxPDX^D=E6NR_9f6v~#@gTd- zfsc$_M;JFdaTMNRbmG`1@Wq9_;7Q{l_FJJm7AX%n3k#U{EjzrvsicWn=LB=Xoek3> z6&yTjb}JZO_|Rau^4d? zFxImcC=|Tsyr|V7G~(bA;#dx zsOmP6tAQcUWx~9O{tExwtqon z%a+Y&@O5w&h;T6IVr;ZJ_wNydn867Hkpq?t4)tCU>&)=Yxu= zz=3MDNeAM;1vKcz9%7Jt#1+gX)Mz!SRWGjj@>`WaRn{$>iA)C0dQFVo342)?IVyN= z>qM{_tjuRFQ1Fo1b9gQ2F5=&t&h2~WAQ0`cT;kY+2A1wXZoZt=3RgDzIfee+*~l3SNuUje2SxF$4tk0L4rxA%hKE#B@Xax*X+17%~nd8%k+57(86w z=TgLwnq=4=Zg9ZC{)klMkH@A;wp;!wq`X;F+woAukFkF7a&K+6n?cP}mv3TfpL&pA z@cGKC7OHPLw@!(3)G26)D{x{EGGLC9HE5WlTcoz$!r^$^L=?w0_W--j0!pYRJ zR)@1%YmUuNJQ=#qj7C$uo2G;o?mYM;oy*B;vx^H;RWvi>H-p(~90wTFX7oQR zyEI*gCqZnlMT1-Yn@bE_f-WYT1LE24&1C1<@|yGN&cm{g8X9wtCNk$Acq?nQpeggz zYO%Xlt}`9|$te2dAzx(zWA61!Gk)fn`h7hUp_jIh%Qxi^PliQC)GOyphgW=1NuS`| zb)e#6H=hE-KBbvF%(oi2B1IM-)p%c}FV(=ydbD@X z64|8@cO@6M^~X)+ij9lpxhUW~bxStG1pN=UW;rb2;k958e_F-Z+>p4ICDA#K^V5TU zP9~MSvkz3Cy>yIqf?r72?z_tMUp9pwHLY~pSR>7RXUjz9h;4~8uC8fYXVkE2%QuGg zs%{1=HeBmiGEHK&Zb$aj<&EW!6nE)-VBiv(oAG+jL1u*j6Rst~XWwgVpTlCA?$|St zk#B{=MJ<7Zs6z$}uP)uNnRTPNY-e?+_Zvpxw*;y5(!etyK3JU_$EK=>;BS^`a6ngiJixJKC7U)Gku(GeKjuyCBNnhchKwI^4?Kl z&t#3fzUzD5nRe?1E;;Dunc*@iqwBteh@ke?BU|h?I&RtaXshA^hGWeq7~jMinNHvJ zK;`w~`omKmH(5B?&-uY)*k;%h?;;bmxXFRF{$DK5PQD#^i{*l*B(C&qp5e%#Y0Dvg zy(!h4S6O(ysaAmYy6G*6FAsJpGuNBzb&82SX52ER%hmK|xAz8XUC!IgX?l!|OdD35 zT=VgXlb}Kp8&AZQM61)%cRVLJZC^e25aTg}DaGwC#F!=4&s)3aTk6ZCn9nh9wg0sl zocWiv)uI0GgZy1BsylAmm_#`7W`9^7a^$rWn?}1zPQk5)8!z0Vmb>yYbR0F(`+7AecPPFue#9L(gNoH^r4thfw^d zCm$`J5+c-HDDh+3(yo(DZVU@`@R(gWdYT!^(DTNSEe5Od0fktwWs4oR6^Jtp2IpWGQM9Xs{Y}Nf78fl!g%28 zO(vcj@du~n{BspoPH2#>=kU2Hdwk!9hJQz73*U4LGdOFkXkdTRZNPEZ^r?d51_t&J z;X6C;MJ~8FNmD*cpjj&7kkp@Bz5xd$*ErTMJi2FMOr3y??~1bqM+8&W__TV+JvE&n zxpijL9w!gU8ID(2e*5||B;5A8$UfENtk~HLHKNW3f{WG^EA%z2veZR9L5P=h8|8oEDkX1I54S6 z^T|3eO*t60z_CJvf$@&#xr}q#XJSrN#+(v7@jSsz+EL+dt|tf_ zoA@Y)gVE%`bD0BcV-EeB+WL>>OOoS+`o?O;d!Jqg8SZhaNJwJgadYPBYJS6VyJ5j? z6QMmbU9U||*v-)_oWj7d#(`@=1H;iqwiXAj6~Y2`jBE=WI5s$NOqndafPrHJKi3pt zjRg&CD;lh98wHd)81@LNEIO(;$5FzrhRiH3j9 zJP%9~-#OcTN9Tt-UR4*PnGW38E1BfT!`%KR+Ht`d$x}C!OKv!;$xm4*Vc6q%Ou|KN zi=#wKzJF1w%3x;RidOYIjYSg9GBw=>C5NOf z8l|5!a&3~8skdnqK623dVz=-UN8J~VdtMxr-s329;GpyqN5>mXayt$R?`hn#z|~WQ z!L&}*yX_#$21h-GHc1}`$u;Rc7bmG%xX$vtsV#IwQ;@~@6JLkr0ktWtT&z=M!{izg zjy#B9V!k7>WoKV~+mb1XF8Vi*ZhaXSS>SYz$1`lhlFR=>q+RM0TEFr%d$uTrTQtZV zJmGt*m35Xt`@v{Wu_MYBydk%w+k#X-=q80cIQ~1c<66K?Kp^ z=SiD$R1@P89>bJF%rXul(^|I|-cP<2yUv3_?j+ON2~j#z7~@yEwgxmX?q~`-%QXF_ z`ou}?llN&>r8#95xi+q=XYF<2jrlN(!6!~t%YnJTDd9^<=eHK-h$m7{9x}^-HL>F&~JZ#>3U( z)vDv+z}mvdEYV=9c3*N1o1+O^SEv%RMuX-m*UuHN8FbX{JFJ|ZxBA`;H;D+v!_Nfk zcT8tAVUSmCh&%JTPPO6k7L9NV)_O*ZUWQq$?G85@9kd!75~s#ARB<*qIOudd2(0vU z+01cZjjgt{+>B#<4oq9Fvz$4$J+qNfhQUoCJNp2K{x)$x-IELq4Sf|y!ZHL!dyno8 z)RquzWeHi^CZOcE=tk%)S2c^)I>`gUyqQNnot3gUFt>-%-Rz8NM8k%bgRw{dovhdS zp_Oz)_i~EU?MJP9^%_`QRtwH*+;cYm^v>6j8yas}H6(;hm-2aib5^_RpOcTnrt35u zWKv;ZJ#tiHiZ7cZ1CxP6tsASh$w4NMpgm$N+93?gE(apcFiEa)Y!z^p*0|!<(YQe1 z)V+6yB=%f!i^yXNVbDHvNMggm#0`yUVnG zKhM7OTUY6Grsv^I)=%&Eyjjbzo|RGDfJxn8&YYB#f|R4O8`_R6soZg#$++M!kF)*( zkzR|)_Y>YBJg%bQmOc6Ws1y zHI)CpQU1T7!sc`~PKSMVk&G+S71TE==^H7VZ<2S_JS4!NWNoAxzDYHHlSF-7Smp`U z6hpOoBaQY=8n-vx;`*pD-$-luCN1g2;J44U_8aLO-=yrPRui%=bQB2f709C zKd#9Eh5=*{*q`T1DS% zxrahh!pt29B~NQg{k+Y2{Ai>LOW>kSRZH45-*0yL{h|5bl6wNotUGk-9YbeK{_tK; z;egN7sL6^sQxzB(MZUN!-{K`+pudJu{Of0*cf36^I&+t;b^owFNYSKs>%`|5mu^&b zF<8GPfPd>8qs7|Atp;5taMzhaEvh}(uIS;OV~7` zed}GrWab%5?c*n0dyo{hf$7^qHurkhf2An}xu33Huh`)0+-(~7+_ZP)ZKfaMqK)E* zQw}j4c@!1Hz{IjOq~q3pDTBBMlcemau8zvi^;_e@x25`jkUGG@w183i&5`DxJn9h* z%pM1lEz%wyibnbR^h+J zHFQQLKZnn1#z27sb$?$=?8rH=H8F(4KXF;>`@P#DS6uk_$gO(fNzXIx`XQ#C52iEN zG(3`XHbN>!M>vv7Ep=Hy=UM6Tsc*XnYHGxCmKrkE^V9@V;C=wU@x$f>SkCuz&2 zOb;}q-%PKGu?Xw9VXz^GC8cT2ydxENLYQnCq>en_V);Fx-?54zCVk^NwSo@WYc03t zIqInNFr2CHOIyY0mXXzYe5XtLA<(maVGaZF+fUmfehoX%_Z_yLWpH5c;oXnj*xI6ZF^L@L{qRKP z`>u|y7o`m!s|cTDyz-&`Y3=PdnSxzgFJ5vH{LRbDB*PYe*mOt#9^MkOB6;bRWtsma`t(|XgURotQVEthseOXXu5iJ9NkPOp}{bA+jeGqYw3!=05k zubq|NHlzM&V(N?&Oby`|Dx@!7D?QNKc}(0z#B)mL4Mp_}f(euN+s#aEhW!)dLHF}dz5*rqs5-0+Dv$T>b)CQW<>^g3|BqJn~QK$Un&+0`(PdqC~7xRtQX}Kdl`W(xA43mDyz9;@^oOJ`cYMmOY)^)>$&= z@_Vl4i@$Ca*c}d3npl(adA4fye7o=GH=Vp~DJpq;;&V^mE88PgJWQ9fN=xou_`51f zWoO5!n#YrG%nh=Y%Y545xVrwKz~|%PTkdl?oUtlM2s3QnB*1ea<-&qyhIEN}oC=MJ z8%?`9je{H6L`^vz6uKAcurgUlh6pzt zbf3b+JR{Pxr}5BKQKmJXl4=Je+L+dgDYq#&s5MV-5lhifbYN}cUlg|G%EgsO*!_+c z@qWH~pfSRgpXbNv3yLnyX-qCFDlR&@_HlN+n_@GwDE0Jo!}M!=W)?r6VJrUNY`u!Y z!F7u`CrDjMQCM@sd!lQR?}BLym$oXezUS8&s_nHdj@M30piDe#^HBk|fWrpY8W}_+ zx;Q^9Pzry+rXRFkj^WI8W;Qlu{x!R29KLr{AUNej+OEe;OKp!&x1V2E`}_OH=lv@) z8~(+&ISL-o7Jn?UYk_Xt1&IaL6Wc0}T5=}T2OnoWFKSIyXF*IMuS%o2RRF%~PID-pXxXk}`A{`<(e084qdeYqwpB)?wh#dUaCy z?~I&FC)F4B1bO}P@Hx}d%FyCFjfKnO)f&cm*2+ABx|*Jc7z7xcc{syj0#pnXVqW%e zRGE0z3qL;;(A>l#^WfrwSOJX%?&9-^i5gPC$a0mrdw!x8Z~X90}{042_uG zS{l}@Fkn$P5<1!YV%DWA!GXS^S3_sIBp==JE~jf@oP@&x?>BR}6&RS87Y18q6{bmdSEewC@Cqd}7(Q8a zO*c}^LE(hJ`Q&7V?Gi!BF&Fs?7DR;oe0%+VJtNO&g>AfY?G{V6)xaC<-%hyP5E%pgpQ3%dJL}Jm@d)cILTG`hSRwS(W^>* zs=|9ZX6{@xFS7n; z{@^klUNfz%yaubod=k?FT@IyAsg2Za74p*36chDSS-3>}oR_BR+x?8s&Ba*H^)5}{ zCc-U~kkl36v_!Y9q1rgy+=_~r>3K|+Goz{-8=MDt>_T!3QkKOO{7h!M+O23eQCw{zr&wMiQ-G&Bh0ogpy&Kc2pH^s#xy3Vrd$JhM)usG(ye}n0PDI6-( z{|8>;j(Eba(qa+k;r5ZK-gCtfapo=aB5DG;B>z0D-ShBfFJ=)ANFZt#V9_0`gji zC^;_RRG_CawZ6hp!gmsf z!j}u|b&Fj@qZ68Sgc!w+Hn0kceYBKKIoNb0z=?m$kAvYnih^D*66NPKb?Y(+O|Vah zHe?HQm1SV8G~Dt;)$rw#&$%0vx(*yv_T9uGDezFB>qqm`j=~lhjwC^^3P-`}h0VGK zE*wq<9Rdjtn4LJB*fzJgD*a+$u2)rH66~5Vr|-`JFV~QXlaERyt9DO3@N8~Nee{gm zim!g0w&ySwT>6JYE5+cX^N)v9lNP!tbu}>iEn;G`a5$v2Nx`Z)g^|5eqg5#80z0>! z5?kB~7FE8F2YvXaEMT2Ghd)hnlClV+>b@V0{{%uZCb*ta5R~U?;_rCaEvvFc!m(bV z$+1I$dB5mkj;F>P7OmGOxgJ;`B&z7bvmo;r>pT`g{fHKiphV{Tp)7OkS0wA#Ola-; z<2aWm@wuSgr!G!4|7mQNtvp>3JdYbMEePHEDztbLhjh;trKJZNl>&meBv_PGY7ZP_ zKg-1(|3aaCdy0l(TL8;)gN5v0wT}e{cL~+UXdL2?wP<3B^>UjqL$Ft+v6VmN0E?%K ziKx*EMQ17Ru;wXDm30#wW&Nd^r#xa}uhnSNubI%&zvj!bqYkXEwi$FLCr#bDwlvqH z=fH&tB?s9BRXZaVM+xdZaA|#&B^oEYM$G5WX;1I8Wm3C$dcket-Sg z&*>E{E38ziW!c0d^wB;f;=@X>1Frfaip=M|Zm_>ecH+LL#d1?jnfs(~KHn;L9@%CU zfkn!0njIIKX8v1$X7Pmijzx@5#T5>TulCLV-NDGM8&|;YoFUJ4@SkR+^s`0WO0~vX z=Vr&rtogn&s$RlXGiad`uh8Q&78jT%7|zZ7_%Ml`@n59Cj17}Qcof+h?i}>!T*G|9 zkg>UgW4Ty!LK5fc>8I^CWE(OG`pN&;sj}jNjKG$T=4TI+I2IH)t~&YZxLicw)i?uB zg$*1nvTqtzC0}XeZ&7d!dBCtoowsQtBWGB_BJ<{MF>b+(2Il(G?+%+{FC28fe>T+j z{Oo&~%0*gEPMp#KqN+zESQR-wnk|-75}2ZKO@n3PlYNp;F7iy2_VC*1?RjIT#CnDu zvo#ZKlXRE_I|Gg=@?Es_EQt}k`=s0>p|Qi^kD}n&IdAmDKTeF(aq2RQaZ$3l_s>@| zucmp*;qBpj8@P6gIxaa{?{QR-IB>D+$J9r&eN1FaP0tF!N#TG&E|=G*G~>)qx&;L=*@Ec?T>jq8l8 z`jHh4FI}6&{_TC;&NDs8^V$VgA#Vu`cVpMX}eR|%p)OcIM2xYg7p zx*EkZl$fTu7z;2(J30NEbA&O)RaJ+PC(obh53@>&3e%1CFPE*CNIJ;C<6wTni9_6h zV`e>*nS~>R*a9A=2Mk-3oCO@1WSki0ypP=Vh=FARlgc9YsS`L4o@bevBChn1x4BI* z>Y;GMLt&{#zRgdC6%Mkjc)+XNDCVamcFuw4*nyuuN@6z_@ZMPPtSj-EjH|hcBkvp~ zu`35m(j0{h6M3#F7+v}IfJf{B!v%$p8~W8a+<4B_KhRfO#>;bn@!A5>!_7ix8F;uF zaSq#G zU=(oBvN)*3?4WV2@XNIX6>B4ge;I+CC!JV27c%-SQ<`?Mo3xA5)F!Gj6O06`8-JyADk50Hb^{3VvuVzXj>AqW3l}56!EBqtlEqC{1Ujr z7$w#*a4}poiY^eZ_xP-$#K0)=tkv(3t3-ov$}#U12@E$9#7qt{&e|YxfI;=V14Dv~ zl7ItmiXu;iuw~LgMj;2`B*r!mB@5LCra6yc}4&7YceU5aqk95US*It+^p6Fu3d&u#8{bQ!A4+5$TOiR8nDl{;aOi^5RnQ=2eqt}+0Z69@59@v9S+zJ?C7P_@f=4D|JJ`nPL&Xm6b z!iJi<{+g`LiVt``JaR9bP_5;k9n~ZureNa0q$`zga8XtJDwALLLf&1QB;Gu=`B0*| zELd~Bp~@N6u%CWT!lJ&b*DHxB)H8g05co4lQ=!4M@CC+76V0W_3JwlU_Mg^Ege~UjTIkXLC7d^uo%a#b22%m$ z21c0%c3A~KA0^=f3xeLhXLEdHGWU?9Vu-4YLaMnFgVg!3f9?XRM@{{Xhw>i!Qg2ZC zfuq|odaaPpy1%!x5)hglhaKnZGpwfyw^OP zOcTYgDabr@l}zF~wO;jANN%z-!@H~Qf(%Tr4*8utpjFnWJIN%Xy;N7A!AymXM{7Z$ z^z?`;>`_XKEo_!p?GkcXQR+GOtJrM?k9v)SEJr5=9{;StXg$ zj6yPvEGrmOK{&h79?{OFAP76HsL7X>%$s~!FtAXj70+S1iJ^KOgZw(CRoULXp5WZXL zsj23Za6W2bnbZ4sAB*&Te_mpe_^Qy5TL1HKaCW^)h+PZgAJgK{W(Ki_*tYMLUl$85 zQs7bu;#$EVAl=B7vOz*Akt^ehLf!i=^+_saicRcFj1T%%^c0gXe|P3fRnSN<=xF3( zd&FpSQK#;yg;65oob}>b3#!Y6)XhFw3pjZHf6R2L;>)oG)p9o&=lF}sJzxm!mT#xV0w*+<^R*kT^lv#BuS(!jOb`Ii)^gV3|5+x=%#WgvheUsi7PuJ zLX1_)82_9InzO%Yj`pMZ=Oc9zk|pj;Qy`NB3Bk>6JG>d@BmP7-D6l zlyYU`41N~tx=C3NmCD@>3>&`9yxb-cmmwxKYw7ySsv5cXLafB1b}fwmr5cjbyLA0@ z{wAk?l1kb8J}H|t*6V!fn~}X(S!|I-y~`5iV7*^gD+70BTP%zfNstv>uu3+8S2ka{ zbdu!mD5eKL)3p{bij*&xf8h4*66ftlN=pOc|1Dlz%A&^?$ta=VoS>gwCZ?sJyy{?D z(v1h}8E5n6T>KotxM5`>@0^V`iB)YU-wDYb_|kFEGVw5v+yf!ANsRS7H|MA{$jp4~ zqpl+Cx5NF&f=#YUfj@q236!qB_i1+K^m$W_RofV~T@1En?%wwGbkyXV+e)jquh){D zKV`e`QLDg5Thp6#9?q1wreLFCRu-$YNV|ClFO%?`>q0vOcPw?YGPtp8X$zC*EDrI6 zZHb43_!!vzop^W{{(XDbvN?T`PQ9eV>P#guv4q~om;SXK^puR=-R&kOcaZ0Vz^aeG zJ&he5b63T;?5C;BcaRVo!suE8igevOjl%-a42k_<@7H)vn^3VMKNMi z_2IcsbT#{u`Gu#2CrQKvtKM*ppXJ8!-deTIO?A~fw+~JBVlmRJHxzC(FxZ3~nOyHC zELFatF~;7=kx8lH=Y;cq=U7=}7pP=AGf5n%(`IUtWMEQKVA`T2yvc^C?vBzS1!0YZ zQ?HNka4@)9MujIfZQ5*MgtZie4>d39P4dEjo4BXW5W8CcfZ@x-O^l~pg#Yw2JQL(; zImD=uz;Nf5g2I9H`e%#+4T8~+cvKEBl~{JUKkDIc;L@1jw9J)JY{9k1g$xP{IA2}# zJ#%M2|Kl3b+M9;Fnew(X_!ELf4lp((YW@w=kw^&cKIqw*#JRE6<(VM2?gM3?>$X!b zO!joDca6$YE4Zc-<0@2@C{Y!oeT{)ZW`V-1lGD5mTqci1SuQB}314(nk`{NzPG7ZlTuyLl*W<3cIFAh$LJ&%;af#>tN*`hHqhNDUlCcANgE& zcvN1j?@^KO?yPm@kA>PCMF|CiSPl<Y)3oiCDz6G<+y60KXl*fk|FqCpr{Isl`oPF)Mn*M< z=QrnVt+?l&*=Fzao>6Q;CZ_{atd)@l17p=U#%Y#}7ILq6OHG|*9JvzeyASOx=V$bp zw@0Z<+GhMgU-RI6%mJ1puq*N~1 zF@-#wYrRLQEBQ+4<$&!eAufk}o1aATIc)TAs@`PhcyN|tNJ{!ayA(gE%%zJgm=`1; zPZ6=LVNftB;I{v=c7ExV1q?ienoJC*Y`5vFIB>k5`|tSgMV$4s4lwHFN;Fi-${sMd z_JC2Yfq~}%lMaJe(?YJS`B|C;BHNb~l`e^6T;#N|k%e1IMuV|&O_LClOowZLSPP?o zmdB0{t0HDGb#;iIRyp8f7|F-x;_=`BgGAFbmL5xs4NZ(;YzJ8aIEkp^N ziVF)}x}|KpOjcf6>NC6Es+P-iRY+4dTZERzYNys#ma8qD3W+?|8)vMrNw|>WZcU{cX{aXmzh&7h!7DnqBhLCt+)%Ymvzh7%kzVpSUsq}rSm zIwq0sv*AWTlE8vQ!z+ei0Xp@3G7bmz{_f>S?m3zfkJEtdPj zOu#V9q9SEZ5mUM+1J9YCm$f-q7BsN_`kNx0w09$CuteX(&KGSP1zw5#Gu&8zZo@$~!~P%H0_sUEg>7|xSx!|i zbB+lukZ@Tq`nD&x;arAVQbS_f^zAbR-K2%YjJ?%3>p3>Kz1|u3sq(EU>wzs9=_NcD zwM`<;**l_n)RuxZ1)}~9f?^wQ9Wx?Yh2hQvR+u7S**;;Q9L`R!SL8S=A)nH zzY4iOy&=~!v?16ri|2!R6Hl`!f5n*v8X@gE91N*8H;+!9_k6OqfP+=wN@mWCL=|HT zhLmHSM;VT7|5q=v?Z`2O426k7=M)(DoKhvGDcn?j@?F^UjV1$Y2ZMBv*@VO%4F(2< z*_*o(B^U)97?>muFq}IuNs=vrA$Nv|G>ZV6pT@@!R>NjSrUqA*D`yqbEf~aPFKuEM zVd!=-Q3%seXwX-3h+&(3mTBLP25*f7MjL4k>2)1PnYZMqaMpV`sL2R0+>Tk!$SvtC z_3(w#$Bl^$wl*S;Uyd~RG6;3|cC&8WM%iQDS`#hMf=95|3**w%P3am^x8mYLH}F1RV|A^K$c!6vbn5~AE; zSxiain>=)k6s6sL(QL#C?~N49Y>Wz1cQzXs)$urHAtOVz~FGNQz4_Cqk-|(hPF19 zhIEP94oBGp7*x(>_=^TKOR!CFYSMYlI6Lxi;Nq|uj4}^+W(M@Ab2f1@I|TAZY8+sg zbCu0x)~Xc-D_1gKD_~3N>{4hubtolHxPfIuA}@DC10zqsac>1to@|3DjCC5^ELYqZ z1T%cqI2JU_NnFIlxgnVKzyrbh$bX&+j3E<_9NM!vh*?H~iPz$=<13r{$9kzT_)p3p51WR%v8*SZT(@!py{%z`!EXDUl+e^LU>z8+(r< z<1E$5j%kezYd|)oYEHUYTVz)Zfk`s`W#bR+S@r(zj4(U3nPi(f?}7t z@+VWbHEKWPWSGih+M2-gB%D2>UrmUif%(IlGi+1VWD6)Tu>8pt?vU+X>s`!jU)I;y^`) zHiJRRBcZGZGn2FmI?un`B4K8EK%(eM_7?$X9@Zag+jIgOj=xb_ma|Hixw43j`N|sg z-3IUL6&;)Yh%s{qcCctab7*2+|42AOp;6iHBWL|Ap5%XA5eg?nmo1R>=wRTA_|YQc z_MtQB!b6sTj3esH6k2ni9hsnU=?Fu|PGR2&Cmuyj4r!~MZ_+*=QRCS0jpQ4-ItaFABw5q8L0afU}hphRrJ?D&Iw7cneINMLu^;Oj9p zJ$r%TomVE`lVTJYs?T&DpL$uXUs}P0adp+ICa(!WfsEp1X;H#5hb}WpJV**s^;vk( zMquyxvc!n#S6w+TJv0A(seAPzUj^k&%irsGPucnJq`@M;>iXshK@IJNt+_xqgEDTpo z@_4?jXhJwo*Fyy(cd>ew1Raq}+(rvI(-bmoo-<6D&h7sxkVC9cCb0XU^CxOiivJ{HjTfzmFhpH5{TWsAf z#xF z>Y#H@k(=ppjrP+JjkL7flp4kcPS(PRN!!GhE~;WVI5Bq-17m=>%v6SX)7mC==&(9Y z+ThM0RMgJupt|hYl+T;hMHU41anuX%y`XNjv6|VjRs4d6s+E*1R^~!=l^hcTqLwS9e z3HSCX?fd^-ofM7)DIG3|dM?(nt*t60#Kon>RfDPRb~!`ZVZ%rhwmD5LY#R;wFIHGb z@}zB0f0LQ!{n(o$VFJrRu31x!j|i}yXr5mmdeYs=a|*LTRX}PwhHjFj< zpQ%o(-@umfz1QHO+CQUhMa&DPM+Zf_USd0XsV_f_kvo9r(~Q7H+r;iGX>BPqU}kJI z2#nt8A;2#%^^IY8M{#M;Le72z?j@5s=QMCuH*g;MAUu6TE32T^XE|Welf=gI zp{e0iiPxzmM>o`S2Pv@5-@tuo%0Kgo227<6+@jp^SFdnIC@_UgC{SXU73IYg^J}BA zCPTZWG#dj$#PmS_5Vln&%0E=N-_KgMiPMF}U`8ywt#cS1r`AVw(1S_Y?%Uer?_&$Gg{1k zu3`MV@~Fe)T|ynEKU*0EY9f?ECvKWhP$ghy$S4)g;~mKpGGon~g==*;r|y2WpfQxe z*;8On+LSBL(s>S=2TorjW4dtZ^Yw=8+nX)ciY2X;c{O$C3eJWnTOMUC+dZu_vVmcz zKx*LA)*}lT1P+89{2I;6pk6;sWg(k@JF_C&fq!A5>>dJh6#BA?88sC-&o5e=V#L$^ z(q#8*;XMkh%xMDR=}dtNtbqsW?_A0MYAUcgAugbRH6noZuPc+Xw?K&k>y-?qbDYAn zHnbdHvX6B`nIJ=qSt|o`lG283hE2PR4zw+acH$9oVA%C^ZO=mnzuPS3O>Fhzs@zsg zsvry2U8OdT(hpt)PU>P47hp_eU=&JV%RVq)bJD`y zn^PUt7HB_pEm*XVeRoFD3gKFIMqSJ81{c$|WrXE0d1yGVuGijvL%oD?LVNC0!8lL$ z$wBJf-ji~aCgnC|x;!qdkzkOMu{&R1wQ#jLL+O!SObUwsp6pzEO>tr3Z_gdmh4&n= zcUUo{H*MKx>kh6@{5b)i~|~T7O>?MaZdWc zvA%u{+c_a_t|YeFIesBZ+%pvBR~N9&a^R`>CU|-wXS5Ob^ap}JEW$s1K0Pm$vqg}5 z#T?T7qEUT!k2cv)j+pG!P(*qbm2ai55SstpC<*IO6DCKB?`rqRD z*ESx~3=+6#r5x0%x&P5NU-eJ{7wI&Po#&==#+%h^HheMfSe8*O%@7&zPvGh?V+BLu z?aM+7noMSv9AnvNa8AnMIcIgek3ji}oee508mCTNbXrbn$FYzChAHOK$Bu~}G2p(n zk&R`;!TTZd*9#dt9+$XfUE1a(Tk6bX^zg)IW42>$7R=EbJQcYYZe`zP$erWBnEK!t z?~cxy4_t#R>g}C8R5vwAbS)1&^2vPq1cnuDhpqlhI=X>fNT|byJ6t4Wxy6*pKeVegQ>Xvd@y<}(8*sGq$4Vvh z>%AVPVVfg`91OyY7ncA#~JFIZe4af8^SMed(+w7 zpZ_Uxw?w&TCorTav2hEqZCN4QA0X7MEUMwU@^<4stA|zhKD#f!dd_SkLxgwHza2-D zZQ0Tc*peC4_X|x{`tG*3rLSPM^qLR*T*xppdRfa%38pX^MNbpfvfK3`2p-6 z%`-V2rrl^0D#`uiCgfmMFBZ_+&AnDt+GZE8&3e(D)fQrn9SqLGkufq1vo*NABi3>q zSa`g-?ZS%c!&}sB*`g+zYKyW(D6`G@#Btw|C#^yJt+4XJV)@gPuPoY~8?jh4 zqS;haMt)<$xd^2dM;gkk3pr(*j~#1V;;q8K+2B<8TZi{ysCP*;??>18`j)JO32yBr z76scnzxOcw({tkCeta)e*996c}eL30h<*h{)za@0937hHG ziHRuaT`XfuQ+Snj;q<@D3DXX$ZLVMNa^1(RyCw!(ot|s8kWF~O=2ml_BhM`EN--vE z&`5VsmE2)9(}B@So0I+2_1sNtTh1AMbjs;?V;6md(;#fVd?MTKW-FO3Y}pI6vjkqh zld-yEb#A5OqN#rGp60!KeolBvWAN`C>-rDe=RY_&7ELe}2>UycS6(JZj&YjrN6Gac|Hg?H zx-#CB@Q~R5(Y3J1)b^8l|EIrwocsqo%#NyP+KV18dUIZhZ5{7t^Zw7OvpDr;e6Xw+ zd6p*7XtB-C|BGw>7q0a!3un88lzj1h|HZ%l-GS%zwMzV7L-W6e-`C#Y_%-7E*Vy-8 zJD6%dZu%PU|1CBD+fm0EF0UABtG?yF|CVnr)A(zfC)fAV{O{%d%^L(03uA9ry#HR$ z|AW18Nz@;mFH%3+`+u~be^!(xko=*@Z2pgl`tJ`X%$@XKdPSmj@`tn2&j0-B$0N>= zJ=b1zlfjck`M>J-HTv&h+F4uwYwi1AZcR={{^e?~{{L%h{%`jr4dZ%|O^1K&4s5fj z`+ZRV&!L5!z6?K|E~e%Dm#(}0`|$fe=g-Ukyp)z|r@?gj&xQWKH{)deiWHX5Eyc?;(R>~}p zEvFE{;1*`s!g0N0;!@A1*2GOh96P3bm^8!quu$HU8y6qDPf&F2o8BMBELoqvj`M-S z!exvcd`c?Q6dabdWV3N(EKoSW6q&`s!oi@>!00P;n`Od>VuuEI&Z8_VCQLXJ!pc^~ z=lVn8fFzr3yXex6fXNpP|5<%~_w@Gl_wffBS^3psZfuA*wcV>UV`@MWgCB>gP(*M} zxCG~sl-N}Q3QbG9Wb{Qd9DEc*4LR$T_qbMM9$+xrYvRZukhb_X2m7&y&|yVVilaiqg)YfsYmMJA3oeXRJ9WgA*~_KCO)7iKM>m<`FW!zXS9oVk zXYHG$=hm;nqPb7Rb;*Jz#!b6a8rTK?Ey_Qd)DhU<^jqgfhn}gFfP$;+VUc1VqthnA z4)Y`;J{)Hg?mFLKu<4eE&4e=(`X@7=jXRIkY^sEVU`mVnNLmp2l5Pn~WP5dVI~0U}rmVr14#sq=zs|*bxj*qAVcW%Dxh7RIVrG@LT{_A`A!^EyGR{Pcz9^}Ca{RjpTkJfCLtySGT(61uu1UPv&gndwVcVeZlG z){k5mnB4TfX~zlP%3|z)YjZtqqu{I5MJF1XFJ0WGz5P$onZPRPEXD&8$&B2OxODB< z&it@xaOvi4U}~$kne?=QK}5pq$m$F4TC>?tBm^}a>W*Ancv|6o$&o9@=Km_5=&D;S zj0{_RiqT(?LsyJ*8J9x?mke*R7W0H>9!$&|N-j6BYs{a$>K_B&j?%>jd@p9M;1+V2 z#mgd*pj!Fo^Y#0W_H_m(^O(+Plh`<8#=SEQY?6Xch0;A9OiTMHU!Qa)NnE7rh{U-D zvqeXmiZ-2)4ooxTKK0hWMOo$HVj<>*LdybLwNn;)RTMRf9Scxh?9t-xm)Ie2YJzgx z0+(X1kL}Sf0@M>aW(oBEm>9?4$Sr5-Bv|x9##ungpWSvYY* z_=HX3N{Vb+ZX1~ur)(0rZ`rDEQN-mf#5{S$3uX5J$4*a=BIT6}TvWd{bJfScxHMy} zOe=qbf_HS>B%!%aPG}pfY}V;(kyxzLswz0iD_KcJyz$Qy9l@rqAclwRi#1a9Iyt>Q zJXj>MT*K95e`j}YkWz=VXR2nH=afjT&+{LxIilpY@x0KnLyVjg7})q%9u9uMASk=@ zDBnMWNy<5l9A-b91yeR0NxJih!|DZS9kzjtzJQ~E?TJR710CF|FCMU4G%)fliQsXX z5W;?*hf}9+0kilX2X^PVF0Kzd1R`EI2p)B46)5;{MW^Dk@{tdR0@|&(7X5j+(&FC- zNB-`KU2+^s%Pcq!=@u}u$go^p)$NcaSa5+^_DiD0jvI#p3NJL}w6Tb~ZfN8ynBZHV z#G=G*S)m=>-N+&TXW>zIc@>bmp!Fe(6T5D#R$$iw7PS`()-Uxq zp->{la!Ks5h?T+-!2$(lr8%1+nu^e4{zOS%M{A2>`_5^Um$;%>I9 zNM!E~Y2xSe>X5iIgMOpL?gg$Q{B{zCHV%yq?Y}6GekY6^94P;w25-P7f5smrrO^ zoae)Gx!@sdTWkv-(@yu6A4%**dTj0O%86^*T>3m7)N=@II?<}|!>M;g#1S5qi4$g= z`lj4f(5N8e+GC`iB4RKhNh{^S5iQO}ZvTCc-P{zL&z+jsx1u0((Ps%ErvnczM>8=k z5CknxUL?_8(D-jMqs&WQenpk_8ystdgW}c0GdXN;s0%eD%u=e6R_thC3=90oq&h>b zvqr;BuOxt_zGYM7y`S898s?TV7`4@d8Y#tPtAq)fJ02| z;;tNe1qIP@%^M|ld{`!H>BJ$N+l^;|Vu`cG1;VEuYqyuW_vvrDK&>fEkBxN1xzPy*z%wIfXspA z$Guv@D_VmRHY8abXgSd;|Dw^sg2h#$HABc)ufjQ8sZ)0Xql?4x;9aJY6Ifg5(X?zDhCxVG`f1UdT=RCaMpFH zf5G@uxHIGgqkKS1@B)_gOe{}|R7teK! zV%@Unxc!OU4i#Gajf{^!Y+9?;6j0Ur>Q_g2!Rm!ZYl0M*THZ9C(=w?NVJVa0^eWJj zIng+Im5~08Rf-;KU0yT>RH^>m&AMG`jg%5wuZpG~LsPd>+l)($k_(ROD77gY*y*j< zcVLs&sn_*JOJ8w>XlNdK)wo#6ef<&%!yfY%50-Xg&Ik+D7>-483zlgWE)9IJbk^%V z`C0qoPP9f#w4`}=L~FEqy;wHs#)_2kU!>de&1cXHKLnQ>a>!&$TJo zf%OoNX3HVgLY|d@3F`SlzWp22f|L%gmpNCW*rvO{vhM-&gkRmE&gUE(7!ND?y_|DS z=ocTCU{8z%lcYeCG6&OSF2`3q{vW6KCCzBDzp&3k+W%{e|F<0f?=}8Edi;OR@&EPY z5YsCEKW{`|&k^+dAW`4yDzsS;_)wxrGhiNOv-Bpvk8P5Ni6Yyw4 zYuq6g_6!BajVxbZc6e)a^mVW@{N*t0U^o?Wfh&RGy<}%Z0>d|t4la)dmRL>`kADr} zH#-sq0{2ERvsbh-88tIANNZX)JX#o_?AsTa(6A>XpjDvZrLsU%WkWr?Z%3r%)Rr49 zTm}uCf}C6lJu@b>DhOVhG@*fcf}n2z1G`1wv===e9XNa{7?>I6&6a3hS{ST5cSa&Z zGh@Yk<+qm~RkSj0;EmyE>yv0RRcP2?(C4Vi$z{>N@>Sk)qY$$J1H+51i7OZ?8#{e( zFmr}>eZ9%CRH1p=1J*c)j>!6m=7lp@IVBjjp6H$-(H8W!!%Sd~R$;@@n^G(<6zuO_ z-P^%xG@*fGMZ=m4Ee07(j2;YH3z!T(NF;4&F<8;S&CuN<(PqfeENI)z^+LfrqIvhm z7N36$8jf|g3h_1zU1Vw7F`G+cVuS=U=Yj@<1x&^YAxRO;+#48-fAC+|kV~q+FgKl- zIZly{TOpjeB5>jg29^^nh7%Z!R`8i+TsLOmk91(>p3q>x!E9*2o5R~|^ggaeFNe28gVNK`3>erN7+5qK zY-jYZ^oY9UDQjTCz~<1v5~1;p56l0vn^1|+_VE8D>#%;jB-BHiL zD8RsN(P3~Rn(@X>Kg$MIhv12l(Jc{CX)ife8YoXGXyq(mShF_v@&*=$jHrHtR#p!N z?ish|DPCrYU|<(uIIxIeeQR*k*$J9=IoKi?IBTQcns%;!DfvO7Em)%ACv$&*Y+GUi zGt-3FpOYBa4=5z9XkZlxR@$Vn>A>VuFD})uQD|$m>M&(!V16OIa>rC-i3Yoi_gNxT zeG;Nt9O4Z&@`=p4mej$@QgO#mlA(#W^G8R+u^aQ|hH@E5HhGFQ2MZcv71|mtIE+`! zN{gIT|LMl1J^^N?h>LIMCQU2gWeZ?tXk}$y!Q@mbypJ>S?}>%1z8&8zLz#B4EN}>2 z>3Si8qgg|*ZFQu4w_bGiUU$ABa0FILAkVLGE40V$onNzGqV{n5#S+QbkiEBp3`{B(-b^ z&EF~Y)t1v>!ZgzZUA>Xb5f!~n|1L%|Gt6Gi`0S==1ILaQm3b2$I54nkNH7V^kNokt zze1KvuPt)Ior(1?g8CV|t`v0Vx-l>@G|zTzV7t+5dLY`}vDqgtcIwJWEISzTI~iD3 z#QoiI@6BJ1;Ab6gSKOR%2G#|v!imjH9wAdWn6vUGiN!USO>6M6c(wRiJx9j2*i)emEGrro zHr%s4!QyA}YER`{=VPKQAD;LbGOWAS&-Cij!UHT!9uw~zU|DjmrCC8@xnBdvfdwjI z*O^Z=#TwjaZBT4E5c2;?$MKyEaT*H(#5!Z&rTz;!_QK#^M^2uG--=hh2E3de40m5e z$@?-)Z+!UXK>7rWsB2gGJId-a&)+-9cHpUiWdrAf4jqXGe+jm*g07d!Y=#Y4)e9MB zGQO&OJ1={kz>$|7t6$3g@M!S8(DL6PxS;i3!aoe8n*~YK&>}`@n zbKW%;rcKjBE=Qr38uMz9HtHpX1bi$12RL@-Xw7}vsTQnkL7qP z*xR5`_x|&Txshth2P@}t?(mm5oBwx01M7rG=ks2gPGC5{vBBYP$E%4AIt!R4mG!c6 zG(S~+@Kb_;!6Rz1qpVTgi!8SbwylpDBN~iWTywekR^3g4t>9k+rvvll39WSt8w@LQ zX9_Zl{5#KF5o1`vuuf5)E1`Rbz}qlRhI(#|KxU6A5i_Et*qd{BMHmC3**hAp6~5(q zFe~Bhf>?!`?mqo8P1N=ohqYkA*K@*)Ry448aI@@SsDJmW)sy3kE{Dkasg9NJ z86EnaOB)OdvZ7e$hb<5|_3ykO=V#{pOw$Mr6WQkf8IO1DWypFID14t~@jpTC8@FV6 zn%U|#CYml_NZP@|*}?jXlea@NPBpieW5OeqX$@Q!af}{QA{m-r$2PS6>SX?rwZ1aO z;6ZHMbcSsP%`7jT`t10`TESqa8pamDz{XMZ)_{Ry1;e7FvpA+Th?O&N{3~dPo|(LH zrkD{!KlhKs3waH%L?_zVcYdA5!_6RZFSWsdf#0A$qT!w-n`cJ@YeYlv{C9666XM-D zj1w4CS-l8zkANxDX}rM$8c#r(oK|N*$`A|*N}Zv zsPj38wO^EGU_zjnLf}0|uAddl0)Hm`_}18UyZHhKBNN*OHqPrGO8OL-d5#DAKKRk8 ze}z?yVSZcvot+E?hI&;K3M$^;5PH$ebHtB=V7WD!zun@lQtL?L7U?hz16Ooh+;t^$gdizMFHQg}tJNrQz)~ z1vae=rXy1uUa7K~BrqR%&N1cSA0FF2?}Ub;wYU0Cv>2YKK6d`^Qw26(hsRgTWsjU= zdBDbVZ~d$L{SNLMD<->kCeC2>yU^14tef{z?W^^5ulLuzIbZkoe%-tG|K6&%xd)_7 zeerkZ4VD76PSY1pjV0dIPn*E%ZSimR3|8+O3I-EqMldu_`C9jP|3ur$hW*oo8YGz0 z&aO*h<5x0?P;6Y&!YA*fa?GJYwL?Hxc143gPouGzy%UeH0*{k-(vbuywxXwA#%xB4 zDryf8EN!0kPrxSQM3MUWd3Nzi}=6dV*B zob)G%^1U$eN@P4Ucax9>M|4j_3-j#0ZH^7c6gC>L3CJiYuw~6=Oy%v9+@Q8_7Ng2S zCBHQlhL4Z+$vgMySQ;5dZYs*uipY_eX|%bjQ|8Y^CZ@cbxlZcY+|XFP19mHrp;u`&1VoW(Q%ebg98))pQ9(4 zxg=H`U|yrU#DTf~w=`JfIMX9wK4YD%3flxePWOY=?n*P4O!79m`6MNKOJdsuH>(s+#@q@~ z2e)Ji32(zqIvWm1rE5%J$liQr`7tRDo(8w9tQm@p3{Oil9GG)M6d0zl%{6rB=8rWx zQ0s8As7*4hC9pw~f1;tfN4A7Rqm*Krqj$ZbFh>J}M6v`!qt~h{=Eo%Ycs$QA@kLw_ z%l6xJYt`!Yhon|lZ&Gkb^~ueg^i-mT%V5TYR8yq}_i10U1SFlMTG$v%cwm7e}B5Ye*b@_Hv((7MX|RrbT_%o@|(#K<-@|ko7 zZzmmKW%mq-a^W>ta5vyim3KG`TLP1iHk(1gBnf^FgGVe}C&F?KpU8uqt$V*j=?5J z)zzZH%sd*pBBwdt8kKd4uY4EAKb%yD?3p7wAz$T)k(>5 z`+h!OeE;47N3MiMtyu@wZ((KhSnwr$cEIxkOuQQv9VC{qGMgS%U}n5^fYW!6Q|hK0 zMY$gjBcfN{d{MKi8Fxr=88q0gW2u~8FW|ty_F*xjfrI)ME{2097aJJA7%*O*HP6w4sXHk{iIHuE z|FM5Ui#{nV@wnaSz+f`zNbn+~sjIelwEKAWn9f+po9oald2YcbpN5C}n>V^hpK53e zm3<m&nuJm3k)br?}~ywGsz+Ffp=-oT`7grLFfs z3a1)d!fAcUtXXM4COhglvR##Q5zE#%yzEpHXR=g^aLx)Ywc`$lBGxGC9O`8F`DW4j z<{63%%~7h((yuO@T6w0VIIxGAOZ^~A#Rm1w9FwDNC>?Ftlf=Wa%x*^Q^l%>DI4rEo-?+ALY0x_ayrvx4h@POCkYk*DfR&tx4p4%IMa9 zJ|V79u$h-VRa4{h>dw+OSFvdwOFs)O;xe1zD6~6(v);V8Q@k!kJS*t1WAej2-fM(Q zW_2tx+RwVQe#(s{Y94hiSw;)lCN?B>zqO(5_8Q-kO#z1`A7pl}Ihw++7}hMs zVf~PyA;{t(XA*z&X*SMei}O`wUTXg)H|SSs@~}%ZO#2`t_bh>x@z&i75?gNHeVrz{Mrhq?v_aK7e0_-cuqj`a$1n~ih8FEw+&7WE2UC=*_;{* z%a^$NdO4^kb27)dMe!KQ9AIGFahg%@!i2;dPtSAx5LV}7Xk+8CVm!8)f$70YPKk%E z3~yXdtnbKXxG6MY`_YUqwcm5z6)UGMpMIiM=Rv4+^VUdVE5S*UX@cCso!z|5FA|*e z3L98fyvsP*-d;CP^$wqanjbol!WBDel@;^YAdC?(ECF3mF{_NF_No+UKP) z@^-XluTd2={Pu{aDsp<6^*^IY!Z8sW16sFcw711&9NNRHc#C00K$quq#d%x8&SrCM z4)9fwWPGoCY>BPVzE%IWUcYqQ)%@yezKQ+9M-;zYP1P4t*ptL?(dtuuT?glLsfO;0 zuU^kqbX(A5*E8eW7I(dk4)yj-Zc}qNJX{{#EoR7Qn)XRxN&P)cWksmcPKpS_*T zQWvbWtqhB)f$Cz}Ssav>l!>1c_>Lx_Wlv?kKxBdH?U#QZK zhwP)w1>li^+eE=2g2Vt72e6ZTvt87A=fp%=RT{T1KUQq=MRrDvfS6+api+W z$KQ_${8mSn@OGU#DEg<>T`gx4)7-}JwMV56Tvha$?#OZ~Zbsi_-b-AT2N(sW)tqpe zx8{o1nO@c|4tdT9r;da75}USp_MZ&tWR-2H|M%sJLg~V{6(_QJ8+h2-8D|6;2s+3V zb-cLQ!n$KVKi8spa~Y*0np9gFH^{JTw_upfdE&;EOH2{*5fh^Cq)ac7aFJqR5WOQ@ zTX9l3r`169zXkz1)p27Rb>eO|EJ!cpbT(eh-Gf6O5BnFjONJ}_0>|nXUTrpw4 zZo{iNhnOF@K04qXd*Crs10(Z>>ym%i!#dnp9UQV&2u9Y|ut=q_+DM(~*wDDeF_CGB zAoG>Q#yjV0P2sW8YPigK)pTB?+RcP4o@U7nf?+NWQ&kV#E9g;*6L@~K$>ZKp){fgc z79H%o%q$uX^_=Yt8BNI>lY{HTN>iNFCWP(om5rTpHtONWnb{xAgb$)2r z)9DPs`bV7Z9zBv>zamvfr~TCqxBM;9Awo}oO^vmQO}07MA9ZAD;=wOiHhu z^}KRXdey4uRh!bQcRjB@lwNb{dCjHt+FQ?SAEnpjUDMNH(&u3|447HR^`c=76Hjr? zZG#YpTEQ1hMk^-IIe6@>)Bl9}#O9!kR<)DO@7har=e8DQvE(33OW4FO)e^?a0hZ zmjx_~CK|o$JtQD%bGd~#b8=8-FB`L-$-$!`2eyS~PT!OfnzwX%*UK4`GH1?uDK~Rb z=B!mOXKl)yz3b)dLz#0KXOxMMOkoWMp^+_>`5EwY9ZP zOiXNSY@D5)y}i9dLPDaWqmz@9v$L~{i;JtPt1s$^-0(GDsaw2UqhPgR*?Q~RHKvst z?CO`QRpj*WkaM<9{#T z|ITjz{R00-#r_Wo{~wp|KQ-fjRn7mBvj3Z0nznkiZ}aQi8PdBwpnFgBqC;CtXZ=~ ze9M;IyLZ2s-gTyV?fI^a7yGtcow4iHnpM+%f?1^N7hGMpt1E&71D- z{d8n+d&mE2GyeBa_`iI`|Lr^euix;0-h%%(mmIpg=EVJtryp)T_hj$oZTAoCxPNH( z!=w8jo!Eci|B)j{&YU@O`SRsEckaA6e(USCD@UH5Iq~fL$>$f(zPxhv&F!1-?p=6w z{m9Y(r_cO9e&YY-EB|lb`F}nB#{csd{=dEa=>5&7AMd^VaQpe~_YdxUc>LtalQ(bP ze181q*NbP5K0SN(<>jkyZy!JY|K`pA=P&+$d-?IlyD#s)e|Z1n(jT- zzrKF?^8feOAK!of`2YX^-yh%qe0Vq6k?G9zixO<1^+vO%ZdrMGdB9??xn5Tn&R~jJ zm38;j*45Y7C+JS|Vn|@TydmTAs@T)pa(#6f7!)j`H-u;|S@L4n-P7CG-`_7P%G+Um zJwcO|zfa4Gfo;R%;}euO&)uq^*TBZE$Y4=0{l$&blbpNdd~aolpJv!4A)?H1pux>` z`;pKE+qb;Ey`y-3eNM@NPYiCQqDOQcx?U_|DwKQ?cW%$l&z-Y$tqo2bEo!=Dmu|RW z&C{LV-#?i7kNex+6$#4BcRHIm14XN=y zB5Xw~Yc*di;F)wudOp)xB{r7&l%L;@D)mme5vkW(^6>z3f{#~#M4D8>0ta!eh;Rvh zg9{82>6)JoEZ;fhQ!Deob|En~Wz}b{0m?}wf^4gqYlX5IqPar4lomC0$uY3Hc)r+l z#;pBO&eqWB^Bk9CFuusi7g9+tVxGE*wJ2K0gj<4RhNQ!e`H`LhwQqSd1(f;fW4awS zFrQ4D$vC-dp#wv<)|B|Zvurvaa(iQT&#&AlmN7wzgT*p}@!hjc91{w^dY%&JJ^nS? zsn;Z7S$>bl?gLqANof~!Vq>cFx9vPLsW9g9(?chiCEI2MXtw9sd^l%gFBTi4CY-1O}qLy~yTOr}}SgpS?jUecR%p)26chg+v~YjR@P z7R)*=zAn289y=dEkC3B8VWpG?#663%e#lWm7A-K9( zu%%&zXTzpCHU?%cmEuON`?r`busXNqiD~?b{V&zgz*?W-$g|`}T+EfPrdPJ))oS=W z3`h}Q*R;VehsVWXibk^JEmb{+@~o@d&V^1;TKJ6NU#54+;zvo-@^}py8?AY=b}gTI z{ZF?Ae~z#C3!^QYSXNl22{{Oao;a#^&n4gg(bW47)Exi1tf|^A%<;lSeL_0p0miKp zV{e?Aew6R2QgNnCy~kIE0}Y!aHZZz*O?xomGsCWy#v~&fk3Z|&RcBXzoH(JS^G%oA zgmll0*xMU>KA%ya?s?asU0~1ri)XGbZ|eA9RPu7})2w926S;zwD-0VXwlFMa_jzR_ zxF~$P)?o(2Ip_K&@+>oOXL9??n%Bed;+{iI<$4Xp4YrnR`~{0Io_bNAJ2B|w;<>k! zwz%3b8H*=MJ>1<^vE+qsp~4#_DW_G3&D{cY+7I_Ew=qxJ9mKVE=CXe-zTB#1rjI%G z82Zi}JztP9L1IyVRk^%nzlnKEVoHen8Tg(h}N|&&u72e!lN3PHFM4- z{lrsRtjt0OI5yc#DG8BY8M1tr-{~hG8$*Pie6&j4)&DUtvY_#jgOTLkmxdeq*#r|A z-e^uZ=Q~;9;g>6pGum~&JWa~T);*EQwqY*ghjx+cMRKMqy>3iA^(Fs?;_8Hz>7fSo zFStDzEf~a2j!HGX64~Uu^!{Tes|n8QCeOdMy8FMCC)7xZl9i88iw`7Ux~+mp*-fzN-P zZcaJZIP352B}LwDiK-7;w(!1JKDjEY@yZq*0nvKlqSs8jZY(N}RAzL9TpZ1{VPU`dG~LOe^C){CdU2(`hjE+eM*S_%B8qrR znYUk%{-moERu|eahimhhgE9{yGS{sy@tAn>sM)XUXR1nOb5A!~l7A2oTb-oL?w zp`bD3M40I+hA0JZhF83A>gw6o`11RDykk>1;A+FLKw!t|jXyQoTs4}wIT>E85@AZM zGj!sand1=m#Dqb&Bi~plYpK{jld2D!4lLt-b5Th1OY54TqzVR3kGLlin-1Qb=ydnQ z#H9{9F3e)kY2dz{6~uV%<@-hYuP4m3^^mwA+`u$Lk5RB$x0>P9JVuiRN7xhVXMDZU zJax0l*G#^SOPBgn8m{puJnURl#+<0az_x)WRZG}`dELwjM|s#S?b2snc^=Zhe&Ozm zhWD4&NjY)pnKUp8a4;8%if(0R`S9MnT9jEP;GkUDLB_+kb(Oa)Xkb=x;NEQ;$Sk#? z)sfisKzDkkJ zrv5|!{y)#}{|P!VO=U^M2Dh-juPde~@ho$%XVMUCXUx!WOtxMom{gF>U%<_Bk!#ig zF1|+Y83mlP9|+7Y;GDjIa|eUqY=K6egIu!~aLzSolGQM@xx}!+ph4$`K>J5K&4=ln zGX%K~gp@RL*BP+bUts5*$myoQ;vm3MRnWw_k+a@KfyGIH#p42(ga?c519qN`?2ZjB z4hAf<6a=%>jYRgjVGpoc~;IXt5_G$DU|P*uXI11j9BHfnEki z(-jPsA-eUZKNxf_aqw;6h}z6>I87j$p>u*nymVlY$`P*W1)S4AwDB}@^UdI%tb!djh(F}otiP@(t>aQg!R2e6hhbBBzWw^VMgK+`F(TjF3I|R54nwcLmuq7~T zUpDb?yI=EX-<=Jd8-57X3$TRm5Lmr|-JOA@@ifW@((eMd1v)XT}S98(qx>oYH4 zh;Cvi*cP(+fnPaOgl}b{=t+T|4IJGEIJzyTa5!>B2Q*(6o)o*YUSRrxNqRE{Hf@-+ zdV;_j0~U`3oO32{I8I=nvtcINMlOd27Pn-E8BNnGeF}AI;7yo54PD2KPmd zzMC`pGTUZ}#&6ou*SSJ=qnW_WN|rww+?Q9n^K=TVZD4U$XnYpRkki7g9MM$!fw`!n zN&iND?Tb0O%7JW*Y|IUT?|#-*t>oDAl7Tyb;ct*i%~l5OQzE}SeGmMs_WvnZzsf^k zO#_RY1B)F4i>tu2&LGJ`Wp1|z%q{^esXP0bAF|Fi)U0h_sdSj;>@a=0D?`L~E_;Li zBR2wB7P7lfV9nXV&e^rd?XlGN>x-VTGyZV0k20v5;UxaAv2v2LZ}bE+y-9OkADaD7 zAu#BdDtFBW_UZ-fRU6pTH3j@OTUy*$QQy0Zz2-m*lOmUayZDR^ORFES&yN(~Uf{~! z$XzpGE>oeD$`f|?3G7uDIMp97`#m+QXjk2o!W7j&gMHHk!^)yK8@ZP_7_Sx2ST?PP zeIeI+vpLL-+_J@a7u{UAbp(HIrr!+pv|Tklk_tmrEm8*as#(gKaU^n^!Gh%1jX0 zD!^>vAhOkgS#1Mb!3MUJ-P;Va+0_y_*%&!h3OHO0Ih6$1YrHpaHDIqPM9rF zs=&GG!PfGErWFb75ecmM23*XJ?2`jHvlCcbtOXW-sAmh?z?S!bZGwWp)&TaEw|DU- zawsY6W?|%9oXx({Kwv@u$A$#%W}O2}N(}5w z8`(7f2{0QaFzGmO?hN48VPMu{VAf$^DpwGga)3$CfK|tUNi%`{t~IM>0kdHOQ~m~l z2?ZPx2N<&p>N(04IGH}Osa;?)4q(z(;9{D{tXIIS#lWm&ztD)lHnj&k+1D^>&tO&y;AAS~uoO5Nbf-0M0aKriK4Xeh2!~BV-x6S4*yKtQ8;u)Pe%pY{lGk2b0 zPh{0gILFn!pj?1C-G@D_VaHYj z){wc}i?s#(*DzZZFl!_*O;iw=+;HGr&XI54%njZGiwm}?#-3-o$d>TtN-W1E-@p6$ z*9z|VaGleUQ$gU`ga?d?clT}(I4>B;t>k;E=5A}@g!3$k?C(|!wN*1uY2cb-z^Y(S ze{r(yEzXZ@It@&Yf0$*>s(dGze_}z{Ss~{lb}>BTis*hQLAt#`FdOExPR|Yl z(+&pC1q?}x%~R_H8kRg#`pOw3z$#(D7+CPUrQoUO1D1ac1#Ch8Zm(-#jI3izo4_c! zPvCx#d5ZvRg91m80b`?rfd2s&W<^%d0`3I`Y^er}0T-UvH*9#Y(BVm~-s7-&0wudx z6AmyGn+P;9K4MKxdA=eqrl9h%nZSnU8}s>|e^z-uE$?}d0&Cv{Zo|B%eFlu*bGalE z7!THQ`!TTcD9+$?E0P5Zsh`cGNASG_)XSUSlWCb|Rc6~k z1_SZs-~M^%#64`xV`DDl_HlS?%rCfuVFsHZhYKHTKmg;pdE5aHST@&ZywuD4c<jYv17&6x}nC|e5)(}c`V7Om0|LLnB#^0X|?muF7NVm0&IB(10!F`o z2UsKuUNHH8;QRQPRgqQn!yjk6FMS1!F8jWFK6t=X$R@mj#qR@4!@WO#7g)p`-rb9k zVOShCW!HO#I62!*s|03Ee8gGk;o`QKf8uL~iQdy)vsjesZ(g{l(7cXqrs3m^2fB{) zmChv9AwZ#u(Z^weXigL~S!mR~ND68w#uGB}sGay<2G>)GLO;Zkavo1P^ z&EZN?LP7koURnD#8Q;iHDX04P^SlV!sVmMNEyMHgg42eJjBNF?T3QPlyfx3RjosfS z8~rWk7SHaCwQ~*6G_i2+n{m$7>vU3kl8iydl<1#D&(6-ZZLRtTuQw@B1OwV&KGS?$yj1$}{OOi}6jFf)%Zjpge@rba3EJB z%aNG0nJz+}Zi@djrt<2pOcoL-oXIjtEUv-j9JlD9)=5sUGBz&=^vWn&5Vas>#Wc@z zGAo4i5@$Z?v(_jqUSRFQU@Y#XadxRtAjhc?p$M);OZZ&a&l-hArl<0pkm0-Z@NjEZ zWqo3ov=2jLtJd29MLzL{tBglHLmV7iq&d2pS#?4fuDOTA88kBU`57p(DhqcVW)TTu zc-Z!fO^UU}tgfYGVPxElgTA2=2OJf&cCFpEzk@AzZMSJCv;1;!imMJ2kj|3F?n%oQ%?>1$5I-Y2~CXjd_#%`(e0%rx!))Ol@ zwOZmELo5$+H5ODpOf~n};VkMI!XY6fa4kU9H$rvU?!4WKr>>?qUJG~_)0*(}^Bofh zi_Iw(^(?bmTAgHiAEq|m`*7fdmBR|5>5^G9G^UCik@J|cgtw`cb@^cyMc&4;fW*8; z1;K-SO?IroQ_r$%MJI^o-JQ*16}jE%>+ba5O^oa7@-wFCN_q7C*ym<>@I}+Jql**| zEEYMzC!lsxl}|uOZgSy7_DgpAW4IQ^D5$vSy|9x?D5yWk{EF2pJhN#=UA>}|j>}P& z%dD%8a7o1_FtQt&O<32+DYiK{^6kG%qDE48{8?^DOK^lFw0daxn{D=BVEADq5VWC9 zce4U(=?-Qmez_%r%nS#_*_;k-YY1p5kCs@;7Q`-`pdX}LabMacq4Q0yzG82)7{?KJ zJC`0_w!Yg}dF%Z)uvw+7sQdUk@Un~(yP$*w_M~cln~KVNMtRtJm0k5vxkfI5(mqaHr*rxhl~T8Ihbt}6qk0K{7}Sr z;_!x6ZdQiFvgT=SO&1grq=fG}6eTE5`uRa&YXjr61K~}I)BNid)ST`+X?!$m%y`#1 zKU#|W)pCKGPZu;YZ*)FYRM>H?(04l1~o{@X5Ag9$E;4h9ZyRdW

POx3Wc*d(yurr?OZj3*N;&5xUMBw)J0IUgH54wF<_$Vo97LTMp!J zzTmh$W&@kpmBb#y2VtE5cG-JK=&)vaYLcv1-^RUgPd6j=jW|U73|GuiBJjZ z65whPNfJ1~D0T5xqXCn4(gMEh`ui$uhF89E$1pHkcwc1Avzn~1S-@F**MeJ*x0MMd z{NUEC<8E7^1zmu3paWnC3H1f?#Q~ai#3O>nrDYXf?;34sq>72KDM|oY!MIlQZdBh4?55*-A@yD+YFoPrIhPG{8l3gUrLW48}=2 zHC&lk7#J9M5*Q}dTow!9Xkai%Fyt{{P_9=HXkcxSWXfh^U<&a*VaT4qz!spZDJ8&Q z#_hm;;NhW}2NRyn)L>#{Y}mqh;mm{}i-rq1We4IV7B+Z`Gpu5&Y+w{Alr-XZ=x3UF zl$nL$C4#2;K?%4Aruoq>UM#Zzw9gi@vtyXCB3EI7gHY9 zi<^u+H*&bGXcg?9P_DTuMu2_E2j8fKhWWA|7_OEnGO+(Rl(%80liy@l#)*HJst+=- zu@waCE@^Ps$oqhS<4lU!-?|^-dQ$e+R2Zl<{>xN zhh$BW2H$s0)t7c=FfeRsV9;$*d|@QnQ6v5#m`x->aOnvPhHsx5Sk@abvIux9D{T1O zTOOnEH;zGKUjqX}L83yh#sNk-g9f&W)N{N7);C#qcCh!@FwWgs!4!43n9;;SoSUOz zy6A#Khdiq41)~Zq`+_w0`s};?Q9ScVk*DEpw=+(w0m?=sU-+eO=uD&*9JS z>8?Bv7*tJuE`NHvVZY0s+srF1n2i3G*6-KcUB0_HpmGmm3&+C(hK)OHP6rs2ud>YIf-lANtt40d|X-pegw!2860#Uy>k75id3>^pC4<90Fi z%QkrLeXy>3TjPlXwnh8v#c%D)bK>ARw5!oTt4Y9M#Vl68)%$`B7`nYXSR3|E(pF#1 z-5{dV>K?pgf$_fv7G|3$ zt>8K+nq?WqY&Y{X>pgA7pF;Z|X>OZ;dohy$Pm{uOx2k=Ul{tPEF)>T;tzRYGv1HX| zxjnmXaNAoQ+1DuHzmakj1gM{ML3d0^dp(o-7I$Oe{i_zL6f01gPw#3pAiFN!4cO(9!>Q- z)Z%MA8Wq;bu2{<>)WCK?zi5g}1&{i**~^SJpXmN`>_NxLRkK^&xfuFewp6pY-Q+&r z^uo1%&$f`}Ei4R2+AB|f3^=gi5673AtszRMn{Ko&UeLOD!-8l5X15u8s-sz41)67u za75ivjyBmaF`0p#;miS*gI(T^H>=Hb16tf})Nf0wIh<+KFv-S(f71G;Djco_4Tjkb z87%9UnRMjtvR8OwR`AENS=c`40n;Y!hJPY=_C1~Ka)tZkv6^jc9A^$3;Z?b^*TrVX z)1(&1&qr46S>_?rvF6CO7@dwt2Id3YHnN?|oRb)YeEK6Z8m4@<-6_G$Tft&7fx+g6 zGOLD9TSYw!r$lq`1qQi@J-Z8AcjUBKF`O|FXg2t<-{{Vf^OHT^OK)#7aBAajU}LsB zW}~%5y5XpYR_7Fb$5n2dew(ytv|e6)e#tHOhc-tpy10BWvdmH8Svu*6e2wolYsI4$ zOD;*psu@9G*Od7I;loeoL4a+L4! zZM?CJn`eh$s6AtaPrZ|fRsEKr#v5kNTLjr07+M_;N%ZzcCbUSOZFTiH-Quz3mDQ3P z#Z#hogtR?qs_x@5_V;JmC`CQN_aavIo{!Hu8pO7m?Z{4r2GXMH-Myvjc&>h~J z1Ed?&Y8hOUSkC|GNigmE6~n^ranZGb;pUtzbyLsYci8%S(q^^|H)3}58piOp&tRRx zeAT>i$vYd4$5YPgE#NafeA+pSfu&xdFR*~gA(_MELPPKYX3h#0J}U;M(zUu7EcLoK z8a0AUZnW}BG&e;=?8>~M%W&20L655~hlOgZz4pSluN_2V8V(+~WNZ`i(aTAw#ifbC z?ix?u5E-rnSOxlHwb zbzc^nCpNJE;Jz)>ll#eaL&Np-(y)NpcOE4NFHk<`F2nQF$R#?s|A5CGHjAF1f=mCH z1R7W!V()M;GkY|!-PoC+yG`LNE8}mUMuz4s#j(GtCkGTau-)kHHf~^*Fk=;HICEeD ziw6U1g429oj-U*ykTqKv3p~p?d+zmGx;(DG+;+o+`Gue3W-}jMjwlP(sgm(c7n;5+ zcYO11U_P-;Tjkbbi`G~Lj+h&k;!8xcbl1CGIMaOMq$W>;-i7!hPt|t5X}WRf(23f~ zNz#385e$CDM>u5~c87EuaPK*(eKaH}+8{dKuwrYH@p2`e%a3naF34$#*kYbCrOP!S zq3J+$eLky)^Xmm2i!VGdh&5QT=abN#TSmr)8M>Fb88{qti>zYG&%~9BH0U4L^yICz z{@KkBh5zZNxID`I?S3ZLz)hopHK8Raf@O=X+ZR{<@-6X=4IvK%wxu#}c2bIF^$0W! zXzV`NC$>%PfR!xdS_Ietao*2V7}nQX2!5mmBX+idR4@u zC8zJT2DC7HG)$bkjoBcwbHk(T&2B6P+&7$DTXtBw$T?U%y%cj<+3u66h!(?s_=4 zilnTpJ{~G|D5l;!kcTUHMuPEj<}2Z5n{B#nkG;JXD!rHO0aJCU?xx+x?gyuWu7j8D z2$C@Q9&O6R8&dZ#wt?wE)6ABTrKuN<_g%9N^<=zo=((_|TSAM0hmFb+=QS0=PyTir zSeUd%++{6ralB^S&cWmA@WQg}ic5CnnjXtX0?qfhUv?D4Uak*dVY;9kq`{!iaI-07 zzkY$2UP1#~hwZ}v237@&rLK>X>KNEAF#Y|@^hc=gh%Aq#cN~*8hnq&$($a=|KO!8a zUT&UX%<93Qu!=J1wwtSA9h98HO!Ukd(6fB zLaW2TqVFoltyRe^>aq1Z-CerZE$a)6?x}mqyTiCQ_xGt!87yoQOxX^spU%o>9i}U> zw8Oeu?SS{rDU;(~FTQfGq2r%ramZXAhNGn&4YzX=zC})Zx`*LMitdkxy#mb9`<}YF zSN5oByH_LA*Gh}gDwXPDI|30fqiabt<&>3VhY~h z$?L1(%WpPmxRu&JHDz5u@UbJ_TUVLwYKm)N`(S;8$t>jZ$$B-8@;`45m3HJi^DTXw z|H_QRdRo-yvJRKxtxXKg4_x!wUoh2wKg;SWz+hsncqgtycY?{EZGD&S&D+eAWfBf=nPk~Ne zy<|DBy4-<(yYfFMwC?b`w{x2(Tfn_n(k1i4&dmSa#2S%&U&F6HG;T#!_S3KLCd9tc zE%56|V9|YG^iZR4T}A@y2P?Lsmxf9oO?@cIeW$5;M|1~xJTiS9CgZdvuZ3a)im3_F_&i5*hFMF$*IX~}NMtd& z_r0FILVIQ_>xz#J=0BSI`PohswWR-OGv{|H|Iso1$HxklS4!VHkN@b|aHacvg=gv^ zmX5D|;+1{%5ht@{D|;k9w%Pog8qY0d(rduM-1oiIAma0lf-KAF94~Kud*P8e?R({f z1=gA@X>-*)!U3;Ytz5E{%GR6)O5yWtDZm{>+|{rdN2Go#3}CfXJC8b zcSw&_xNfrhd*$7I>3RoVZ42%=5v*%ip~85hY5BV9dkGD_U)J+AHT>0P{dZVAN3=DU zIba>j<;)*)k#paNv;EL>b>P0r@#RQ3!(Z(u`U|$6JKlSu`|j-x<_vOwp3J>hac__4 zs@I%s%u;Wf<{#s`+?}_5di~4gLIz*fn%K`i_DGfIb9C692EUj6r~F^S!xQoDhL z!Q9zJCG*?nqkWf`X_*-{Z&}(?_x*OAnBT%WZrdP+Jxmqu>87?u$(tD*HtVr-FtGA4 z7%b2bKNOR|VDUo8;eb*rGmDDCiG;92JyOLJqZkqz8X1@mr2IK#psd^_vA>>$;epYC z#-N=$7%m)2IKarrAeZ2BLW7}c-cBz`i3=Ln7cuHFcJ%D{sCi{Y(DI(U}&$_lv)8Ik(jK#)p<@{n23=bVE z-0qT+@__N)CFTVEq)LSziJ3bk3{+gRxC1V59A=1USkSmAatR;L1Fu(%=U4TbPk)u; zu=UVn&U!Z4RVxnqxpo^|^PS)jsASp+(T`YZ#+|ii=lZgDt}WF%C-xhBOXMp#~<2#2wL2(q$5}9kicaiV)}A z*~IPC+rT1M_0P~w^%gVdPg4n}%e)H|+k3WlObWq)cMgU{no>wNeV1UeAy?Co|mN-tuK~;Dc5{hgm|ueyT5M zwDx?k56MMDRW~DiChwe&cDAH4(7rsb$)`gDpHgT=V-`Bo+mK7A2A(ivwVfdtF<83m&7|G3|3XZ>#Ikm9R));?56qH0Fr(Y$W>%>5y6VJv9FA7=7@jQq zo$K~7&7|9X*DcK{6D|s^);+De`;XBX!_A@M8()}SU_BR`QO`KpXS0gJfuzkDOYgLs zmmh3BH;?nX*#4a+P8XPx8eRrETRLx8wr~DBci9Tp=X16&dcWU2QAxnU{la>mZQ3Oa z?7FMt^`g1D1q#_q6k|e<+&sPQHn-sG9H-LQKhJJRKE1KwxXZ!0+{N0b|5!Yk=xz6N zOX57z`@rwZpxdOG`Gfbuh@hK6+^NBi`g?3gcX-|~19C&Mcf zMt`**-_Fi0a_SARSqf;SMHECX0Kw_yibO5;-!aWu0^Tk*vp< zps%IE?C|y5Vyo@BXYAyvxi>voK9T<=N5PKAQNNb3?pGAr*x}YQlTWxwt~&RKo8!)? ze-#>{JWfkRj_iy$xl2i^Zt9`<2R8*a)tea|_-pVW<^UH1N9$8#W2b!mRi2?C8JBcd z=@eEfyL8+)GE(Z_s;OLhQR;3&hVzt}YEca~N=m{jPq;e$J5f}p6B8n`L7Mf4o_J~I zEQ!Wv_E!iqE8NZd+EzC|E1+e83^fv+$Dck}Vh0KX6R% z(Wy_#v*3~B+H2x`gwr)?S&@wLc+(j}@MWHgwH%$Z}!KI(gw}F6ZpCdo5|>%TLXwY%{&KT#!rPz@sKp{oYMm z*XB)?asQ|x#8Fazkn!Y6jy8q`HgQ}I3<5uzVg(IU^XrtW8_a$)e>qFx6f*ZUZPVtUy;1#br-m1T%FJhBR$Js*yQIoU+ zmrF4+AKCVSwf{_E6NASA@f{5ex(`_Lm8BZQ_B9Av-ecq87wBZJzn{c#LG1yfeY8#+ z(}xBN_d!Ap3fZ^3d0ei}VU+l`?DHly zt$zs`3?C#EooWwF*ZjmA$@qHvNG?vL-J02o&~C$*Elqjwp#_6JYZP+sL3xw>Yk$T z&J%)KteV$eZP71L%b`3&XY29>KQ}pA8P?bDbC|AV z$dul_mrLS+%@mdFCFbR3M$3%XW`5hrw?{2esX3!)r|;xlSC-kC{*g&=;^>sRx~|T2 zO>(U+M@suu(|;39*A=gQ9lQJe%su~1H#Fza)8yW1`aa<|&()c2Sv+@d zP)p>kYx~T$ZC?8}w|MvMd;iRK9M*kTIJtiJoo9CDEm;e@mOn_ko3zqZ>(SZ;Av>yd zJ}mnl?h?pd@_G0DoUKlL^FFmnT=}h?>A`r2-*AD~h6c9Za;K#P@|v7Vp7N=A9CmY? z*u`?SNyy}r`3Yw|#lQs&eA11q+-nTPykwGil?;wFXiQ{kn!Hq~J)@c9)df+j4u_|b zp03>W_a-PvbVY<`lM}9{u4fx87<*<^CmiXG(3{7{Bd>TI>EK-ON89Mb6po? z>YP)3REYJwtCquqwkA*4SCX9neoH$TaBaK%_m$^<>r06bndWD=u$gZ-rEyJxSt{b; zYmS9hXM~lwv@bBQnO~@M(nxHTIP!pPO2D5d$qvjO3iT?Y!8;D}UOVvh=y?UUhyrt^ zWez_zJ)D#$FdUR!rPL|YaF363CJSH20Y_dH#LB_FZl| ziA*Q_TZMEC4vN%E=>I+3?eLIur87^&L8&7QH=j10*?T~0O{3_6c&$AQ+$s-5ROV@E zC~$3PxaP=oD3bAUY@FT_M&1NQu@w$n1q*KcYh?KA+4{t{k;BK)DWXaAK?D1n*nhb( zx=$RqmN1GfVBj^8KedyA`$+>|#{nsYBT_X9Qg`O7K5>%qY2+@bci@XSC~}0+>5e1k z3_0G00|L(u$u=c6QT5mTF|cpy%1!5of+B;6_Z_9fm`>1ep1ctm=}fjg=# zS|)e)J#6BeaX{rBBm15MDt&WBqMA5*7D=bg7WRyk@;mhJPp*sB3I{R2qZ$(!?&q>x zoht9Nf=T5LqwEp}UWFEw84cV=4yvdf(b(X?wS$o}%|-c;l9KN zO`?f^R|9uNgHzHIo`wcak$Z0+Dst36Ibf-F#9EEzYUO>mJ&s%(8kox%jItKlRV{LB zQ8IdVh_}Fjn<15ZO|sS|2m3S^nH3G8n;h7E7E3oYJj_(&kWq3v@^8`GyNw)g;@u*g z_+~J0++p~$S0yClyyC-KI}DV6FFeE?cb9v~(vSsA90`sgA5y+;aNv0nt-Hs;!cIxG zKH(r&R*S|OM)6&DgYP{x%sZme&>*^kNw4FO?X(AKZb$9-lH5Gh9G)?W&S6kp(UiZ8 ziN9#6TL=@!4>`S-MS&9EG)#JO;WM&-T4v|irHnID|46%skkvdGwQ^fyl zS@K*UO=gZmu+vgb7xmmr2RIMJ>t@VNoh6^GRDVSCnBoUj7M+4LRV5eR4F`Obj%2o_ zaC;~@ok>wFXgGKEkaUGZSe#1em1S-UDttTU%62sP*(pUSEmC5Nmnk@4BKG9hzud)K zZxXaFF>tS$9k=Rvtb_S^iKT&?vexCcN$J!b>h`Yt)JzPe$0{QMT4k_s#;bekIh5gJC9Ww=5cl~@IGPq zBih6{hvCIh2ca$}t`!WTXBfDTB#Kqg&Zs^MgPRHR~_Ja;=m^n zt6QS^(3dfI*&>BJ7Ojp4pI0`xD6wd5Y2bXqz?ZU6wxOY(`$YryoCCiKmsB|&nij+; z7pL6gceIz!qgQHTZ_jg2IVR2(>Z&siD3!TB5PT)ICi+8QBU{ix5uKz5cMmXKJE-K; zv{ESUpZuPDf=MRx@0S z);)1h_|JJlB2D<$5CD?K}sO2Sn1G2y@V%g5BjFLs4~d# zzF?63k+F&?>iC+gIy#4x=1BB4x@#IVDV0R7esonyrY$5UXZc;GW9w2vO%6?&(sU%~ zO{j;Cv6<5`qfYNWA7ve;lW`npi*%F=(!cG5Mz$7KxlQ|Cq#ESOSh*Sgg^YWZ>j_!sW}A84NlH7Q4E-J2*7*IP{!3Bz9vh zV*%rgoW=)wOre1;(sFrus;q13jZQLg9Jo~`-f!!mnd8XVp?kNjg~6gBDeBZSyCZ24 zGsSxHj)(9on=m{#lh`mv^oT^Bn+yMQK8M$O?HpgviM?2JM#jlH>QO@2+D}y;QzHZ& z53qcVIOSr&z|z9<;mMVXldO+992hMQFbf=6{vo%;)w3#6=!i|jD$a(wy{%$%>P4AX z9MYK*$Xw7E`!G1f;-Z*K=NuC@CI^PMpRTZk248nNP;-X&rwGF@rGhh7XRqlou&n6o zW)TGKEQ}Axp=J*@9KsWlGkWLry2W z=kgo~(`+&8oy4SYV8Kl<{~AYMK`Dx*g_U%a~X`N^Sn6$X}$(=VR&AK{qk)WTw& z>s2AIfowTf;>@+VsKGQJU= zWm8ly?!t2N$dtLOvUycKl z{#**5;MC$;z{Tt9RMWA^VEt?pHifIb1rLn=xk`E`yqMg($2(z7ROp44*)<&O{H+{U zMJ!Yq?rqTTZjjPl`9{6oSg_V3%y!Mh8{Nw_c#Q2?>rL1LS3H=K+v&FAf{UKuIg?;k zz5PNVIt~mv*V+ZVH|`DKnR!I!^?AwPM_2u9RSPbjn!+DiYZ$V}>zhERgCgts9G8uA zCoJxn*v}wnQNBg6bXmaMJLc`I|CscMd1)0TqgIgRGq`E@Or6d0P6IXGGyr9{4$ zwy;F0+xwMQls3OH3)MN~GTC+Z)siJV`g<0XSjd+}Hs7d`IKZgjke0sf+KXat-6jrA z2k+XB?hPg0T@uOM?7j*0L7D{zYd9K;&tGyVnI2bjAJPl zg!jjO{E}!K_VCZv102Vbvt498%^Ji%Ew=qR{S4DqMV998Eh#lz8TKE2<|-O^gG#B)Hs(1rQR=J{`~J!m@UyZtEBgv$*Ehsqz# z_@>3t@4L&b=6!y2>mxIVvt}0=E&AB%D}HwrOLv+u$ZS9KLPYPdmM;&V_w);k4UhkG zGz^(`d&-_0#V)>_-p>#DNpIUb$2>LvSI2{`c8V?m5Bn14=*)@!wpM)EejTym8ZH-I zzxuT&Or~7kVHIxee0$pODUL#W4!P|(q~3C9@#&7&4TsdP{0^DmlM>6SIYTGzL4;rM zne*S)%qV2J{OGFJKWoOnyAL`?im!OT-#hGJGpFVS4rQLV=a}BM&In~PX*$W}swNd%{`BHC4~?BkMD?3kUVhMX6BJ2=T}7@uRq6q%Bbn2R{I&@KhsnG?5WA0 z?t9$TByiPs9*^}}_3lR}uRgoMc>Q|s(}BW$*J4V9w+78{yfS@uOSgi_%-h@Tc2@ZC zZ@D8N)Wy=~qWaH&PVvuB5r#FF&g}C4GB2N{McmvcU1*m#pY9ze5tT-5lPV_;CgF$% zR)d4N&zrOj7!~SgI10ry2+v>&b?B_Sd#Fm%A+Tp^Rq{SZ7q68f4fnEqm`WP=-;wyD z(7?#^E;P4Q-c{uF?VXu5EeSHe7t1g_`~NPW(UDn%_0_xMRjwjT6I}Xw^WG=abreLn zNHP@f=U{GV43ju;uiIlKPs240r2vU4EY7%e5yLs(K%=I2<@-YQWRLvYG7})8eHe zhgcbosN|?HFdm9o!pHDn(!T&61~$&(T*e0q57)3T98!70xK7aT~^WM-9`>Y~sf zc%ogfn9nCQp}cd-~;NS(;UTwiP`rEoyQqo>l*Ea-|WL-N}wmXejRX5lj!qog_w z4=^lLVq}%lc+^xYHr-&eu+99fC%*k-G)xltxN-^$A4jqv2g?nO>Fg{94c*WBs@I78 z<8jDY5G2Bw-0&kqd(B3-1004&^y@b?8jRwcQN+qi7 zf0f3({zx~Ez=B5C9USkMua=pd*FC3UR@NrhCHuLtO+u1;b&yzwg8ve;e?o_k&bXlzdMbTk?==$#hQvor z#w-4+h-=I$NL}EsWuYt{ZV+*3O5=hCr%kLv6>I9nSVLquc$jQzwHarXtTwWAJLq7f zcuVT@*~5)@l6~UpWrG$3ZYqjYVfdzJrQkck#HWO@Ra1^ZH&{DJWOvLy2JcOgX=ge` zn14*+>0#zGXn4vTG);%GLor!ktpSUNXZH=Mc_!k98)Q1V8Rz^>YLG7vTCi}HTYprY)lMYz0-e7Oluk%byz8y!IBrF^lb(tKz0~!9kN?ql*@OoIo8(pp) zS5EB+(n(lyXwRcc@6{frqDzl6DSCZoYTH(@K$nSwfpO1=dQ~xo^}H7}uH8E>w%6~j zV8(+bEHyz(8rDj^uzj{>VZYr%jcFH(?x@5_znH4JNa8w^v5*n#loKw0Pi%~Su-0`s z>zj8;VGk>FYF3;V?k8WscAXGBsK2StK3_>2B$9 z>ndQ7Y-bU2-C(F5+pxIXgOO1`@;RepljN1Og{&M7x!n8>d`15_W*S(iGbZd%=JvkC z%HmPT=+Vp&&69AlMW>08RpJ2S4u@T~W+xaEvm&&YOPp4ICzKr+(De1h)V(nmk~o75 z&VFB%a_IO0)_Cz(P9nSl6Wy-VU+`ir@DlHE6L|GNKi%@>bs_(<2KF9dCIODqO1m^? zGb=buvJgs1~tp3s@Vn7WV#Zx!x6|F;~m=Bcp&q z`ahR-B^#LUMJa77q^HIS*P|Y92-1 zV~(F9(Q&DHS*jpgKw#*Zbcy+i#y%F4WrTAxWmgOO)LS0Bd2h;0v3+m!RsIH_ur5BR z$ItuLJu-9(tM4!8*AfqkCf;1~OrY9qrfI!!P`t-$<{$}~#U`ItBx)QG-*KUJ>$`## ze|4rN7@IaMe)WW*wB(u4^jT3?*KIT8m2ilPl#af6ZrZj>pO=0uV(j3Y<5&~map*@( z;~5Q6&aJ99wS@mk3SM%RIZz`YaX{STAP1|$0reXy{gq6L6Q?cQCX$k^tm$!4|9hfW z7#~A^{fw?HtrOg)CopPccocE?+7hm{sE-_w1{ zF<}jcaVNIMdpeZvQrI+~cL85h(Nd|^kM2#{QdDWPGFjz(gksB-M~oehm7P+)-b*N5 zw?%kbha_(TL!B%`;k7LsDdqoON$4r~F{Jx6=w4-h%Dl$3N^Rjyhkw@^4yEiYwg@^I z9@Vzzg~u!HxxrlZnnDLAe-}ycl<=JF`HCa#ctDuhB&~IQiMq+Us|>Gg-S&0ud={?U zr%%M@E3hc;F}+&sx$t<3ee1xso8K8d zHy`{kd%MIB|Nn`Xm26rR)A>Vr5(>il7P)Zc220<)Cg?07axfuNw!V5rqQI&$9+M4U z8V=r8oN3@W)pU7|cGInT#*GUuMJ@S$>Q!@rr_4ITd4;|Ca~{jK^SFt9$hoU=?Xl|e zw;rX=fiE=`TFW;YZn2ma7IY_f@qd-ACkyBOE1vs)&hv=i7RF0gIyUMqVBl&fJU_9| zR93g)h2nixGeLpF)8>jsIX!=%r`i3Qfpv?;%h>O~t{+^N+_wKIH{V~U1&8N-tEo$z zlm2~$(v}MW-yQSKnrcedUYY(VflZ~}f8KP@)+zgnbAG1mn(}Gx_dn0e<=R*SY{fSu zT=kaS@MM*~!_z%6Ei$Y>UFIq@JXtf>mBE{qz4ky`QRlhfiq1#D9-!r!UEC}e480t= zGjheYE$B5dV0`#QS4)5~L7j1KtKb?=uWb(=@f2`$)^Ff&OzP%SV9?0w=5eshbHAjr zSnJ!$gD2EGgdT)0+E6Lx!2b2o6h2i(mIawR4lp#eGraQVa9mWVpsB~DZM2M&b>=bE zCXQ2V&5a$8%2sHoo4oQo7VxL%13#nSk2FU$4KDE%MIH_YzYlpS4y$d%9{9;kWZbp> zpqp2gLh^;4qxDM0*t5#)-j8;^z^wQms*rtmk85C zn?)a$7|!hR%F(+}pelXX)}kouz$LZiY>aM?Zbx0{U<;Hv`$>0wn?SKsSkos%3B|P% zikppIGa4E&w}0YxJFnBi(WEpf@zxq4J*R?QYeK9}87?za-{HXc%Scxzk)b|oz1AK> z@t~k=hSRe@oKjWh&~rQ#%5%b3>CECY%Eqq6rVCwpb}%q8B`_*n@Y>PAz0ZL~`7rz3 z{QE+m^cWNly>VyUrNAR3pqQ}O;IvY`!~*UJzV!)*k;|32!#m7tf_hrgx41MHM{s5lXNVe89-nJT-!iOF8-3 z7XB)aV_S@#GDP|CNTtu+!l1aXA9S%{8*+H;TF;>~R0H>-;BTSqsAo6u)yk_7pSBexR;ikhnap zexZoPd);ZAYHZ8S?&xmR(ss1rdM~EKoPQ<%oxahg9Nko-T?tGszmf#a-o&e%oLt0o z&n`ee%~4P*^WD8gf-X&rRm~*_82XPSBrJM;XvYID?M~*zFMgrkBJY|7yt@EPVx?)&j>kAQ98rGP|t9!EimmNW7a=)1|FrgA`2KK7&Sv$ zL}VH?Os+DlN*0`!9>lzW!E1@2oKmoC!z49T%OquLLxiV(iGq(d57Pp%c*V>s9IvbSM6tM=+ION)Bmc2DhKCn#bm~fs)ir|(KRX+{A4pAO0 zO}#nWY-f6OUFy>Rk*{iTf}Q!moNZwr3miqRsO!2pDlBjj2~vzoNEGqYS9fa^(nu7s zStTYgT`1(Be7!bfVc@~VA&iCEiTUrvuC<5-bzD<&VP#-ZDDf0!$a$m4wTipyc@N8h za*n24^+m>#3-uF{RBs9JxE!CwVpjb19A5;3VKI|X2!qg~C2U0t3Kk#X3vwtdb`s5C zV0CC;C^sYE1xbAF65KI<88x! zGo`UFC;dpW`TE`YQT?GGUKQ^Z4zlnm>S{e?dBotAwNOm#hP-dS(E|n+0pUjBBwjCt zD)Srp^OuONsAvv#Xuj;kmc~$(@UZZ5l8{3~%R-gT%ZtQ94tADHc$t}}UM=} z6aFpW{bR;gav=Zx12!gcKA#7CMGdSO5854>y0j}4vK0B^4zT7qR46wK6&+xWc))s( zp)p&r`!bVw#)D?%!(3|^imxlMUvZxl=`cmySnJCX}~;H7S92 z#SEck4%1>CYFI73c9nH;IoAhs2zi`UDq>MhK6|L|_4SOm6^_rQ`^hCMb#0q{d7V&D zLdW#!tQ!)H-W_1cW8k~Sz#?HG{*Hm=-%Kut1}?THE`qQFy5zv3l&BDJkfpvPLE(-9 z`#lA|BnFm$ZdQs)jx0|YRN@jA6e~`-+Ab8*!1jirYrVO6NaECo3s!p0oTtv5>dAP@ z;Hd2j|3W_BOx5&RLd#dbi4d%toaC|Hx9N#{-i!pHr~STyjICbGy`?KmPOmat#~YHc zn0*nSOO#PUL9QRG!7WrXf_pktJ-_V#fzlG!L@e zanKEN=vH4W7IR=l@xy8PR_a-a)2~|eI4bb6Ikl{|Qq*8%v67y7e8!62DE0`4+BFTV zS~qwd7@CgmnEA2F>(uwn&&+qSF~zKAD`MN+8m*y`^&~EhBWOv7il=yrO z=uVSpDpnK?da&0rYO%0W%jE{XHx7Jhm0KN|MBgd!-BDmoNocm;ZJ738srq8JkOzgC z3non5$@eIM*QH?xJJWvQMJt4r*rOJ7L>^#$Q-6T(#Q`ph0|H+CYz_yw_!tk}lvXj= zT4b_SRa#LmYq{$;x6pH4f<{SJH#WLVuMYZaVs*i&r2g}yXUb_CH1j(a+3Tw)&wJi) zUtDDJ?Re>$`SnsNRX=7ZJ{E9zz$c`{Cb47F!y1LO>JI7O8x^g@nQ9b579Q}P*(Cgk z*Q#MwvO+yu+<^nqkNH9zrc}>jF_xlh99Uf*u*TdxV}IoSGBzH$hH$+n+)@h|U5fM$zxO^p z#lY-}*E$W6_NX|cU!0jHC~K#xU+NblXB7K zotB4!7i?2)K9JAQTVJ|>S>i@V|(p3{nwW=1=b)& z@jC~YV;pKlq>l$mPCXjS?xQf#_usqtD_l_xPuQ9G41RguNx0@Z^JslBqhOE%tC}V2 zt2shJ2UyfBmk0*8L_T1PQ(!%@LntGG&8LAmj)Cpfo&BK?*zy$EUi~p#=D?Doz@}Hl z7NN?Q@PO6E;cB5m!TW}*jtSQ?9S$fe3pq3}d)bS|9rze~fYo8a%;vbSmJX~!v9(;Y zSd$L0#wBboW)w|hU`czxmQwF9gL^(}$^*891wTI8{fQU(CmPalIq)|tpIzho16=nM zL=_f((R|1|Bl7$EYTh*rLRyY|EQ`eW5_vBr@G=|nWEprm5iZQo1-q-0>xNt(} z&(lM!3_Kwwr^QZ%UOBtecT42MERycxC!DKM8f3W{?#Y*gtHF@40)-bq;YT`x`xSU`%>)QaNfq4;Po~ z`j(<@&Au9^)Bhamo1G>eSu~%;LO_R0!{Cv_(vrpl3>*c9@tQpkPTtq)X)!#&yx2%d z##umQL3&v43ylMl)>`f^d3@eE8|P_Wdd|SBb17>M^8u?1I)z*e z4RcsiW=_-ei7;ps?&W*pA(XC@=*SxMr0BHpowNkU-45GAPB6sh)E{5Tz-eMWL4sXG z;Q%vFr=mIolSIG)MpM2cC$>hJG96@O))6?iHgYYKi=0TQ-~lEf>C=VB<)ptQ^$2K0 zCM$2|6IfkS^NaIE=;oS(u4fD%SBq-Qx7m1P`%ZyFdJ4;?7&a>Jyuq_ly*X%Bw=io> zlALpl!3V|3p;|jU82JoR{?)INV0M_0eu_u8;lMF%&)ce3xMEg_syY5BEIgJ}&r^P< zX!}zcmVaEgk22f~T(WpW=+sLLOijuY7RFPE1!5 z$Am`@*0aahrcTw_`|7*bx!M;GZtFa3Vi8>PXP3vz;`4shZ{t;uUlOkhzhWLBmmD zKAvPg!NKPNPfOAXagK(gYbGQKc4-`765F^v=8O{~n}D;jh~may5&F8-FAfU+YB=t) zCr_bX(CGkgGsg*sbsZv{3O6>dXxYjh!5y7Z$ik*m(8wL35Y)AJiKrpN&X^raT;df^ zb{8pftrq;C6+PjyqVNG_!;)1DJc~Fa__m0}NGNhRtVk8;Sisq4ki>9Tc!_@f$$4%D zhf)qdxiDAk*jz!B()C>I6=UAW_so8q6-=%b-8QSDsH9=aenn&AhmieTWgDhP9uZ?{P&uSkwy`(Ug-Ik!D*V_#ud+=!imkqy z-8auVJ6`m(dp6D;P8HC!|7K)4rJevxh9kFSkXOMg2!#i zdFEMbp0J;eU|g%@%G@XNRQ9luc(=xqDVyFTumx0##ab{h-(XK;H9y3Vpux(_RAAP? z=AwC)H;#qb=cqn2!!+)ROE=exng|$i-8|o-w`C!J?+X|0s*62&TNcazz1o0${<#Jt z!*reswtw}FxBn?NKV2!jI`#8`)$#KK?8+voq^virs`?dxe? zCWeFujqFc?Buvx;0uDBd`dnzXW(?D~V0Zt_CJwn`o}f;>XCFRauzPUf(Fxi78yh)v z?*3_?Y^W}yq0GQ75-edXe1_uy*PD{3=dBJzY&tGo%<|}@VZBJyj4<8QIS-diP7P3c zm?@y(T}G zOc&gm+|tMH_u!20rWuOQC#T&g>~lJ|rtrm_)+Nh@`m8>k5VdH#a>1dIoloE(--HE= zpF}n>>~gVVU;Egdwc%8Kg`>>BCn`_;l%%#)Jz#BGvp7J5nc>#~eYS_fM|zlQgakF% zZk%c~HUF8I&9qHpO2=A;BMZ)XO*xm58TRW$5cBf2d<-o5!F^iS6dH^c_B*~vxTw9A zjV*y?Gh3^%E8_<#3kKoaDo3(c7qeKiY+T?_;xDpxp64NR^S_R76*yl8*RyUlim}e@ zyY;POs%^8&g!PSL8A0oI#xGpGco*wQW40YXtqS5DU-|s`*ywYl>cakpZ2^9cKSUf2 zTy9k`yx?vRVB)ml4SvmH$1!m+(^0YIQ`Yv}j#|pE#CaxX0n6eEGSf~PFY>vd&YmI5 zAhSX!#a~LNUZz3()15!-`q-8P1=!WspVDyncaZ<-riMNlnaz_AZ`11$FyM9Q)jbxH zog=EwmyxT$*jvFXcEhMkSHRNPU+ef_%w*&0|a3nDN z-Y8hl5zz3@VV>udbcM5D5A!rM9gv+B$d|JqiIZKzL6IXuz*}HJsGNYa!UcyW1Qrq>&;{^7**Z*5hBh{#4xXA{LDh6x9> z<&^p@EEu^0a++jkOcRW<5$p<>aL7O;LWqsYq4@m?#xFk%j4D`|xDN<(*!EpmC8yKe z@NYreYlf}OWg;x44N6XTSQhcC9hji_&U(U2u|xb-OPpoiA8=>VU&LQ^CwU?l=aN1* z2EJwyW~O@Um=3!qfqg|Mnk)HU9=CnvX#HD~qn`aEyWKs-zLE=veT6@^+s3^VsK2sU z=1~K?hWw*`(=AynYYr@Qcy+K#n1exJL&yoM1OsK63(m?DXIy0PJLo#8BCz<0M`NFk zKySj$iwY+b=Ja?OXf(w*w_9Z~eB)?xmvv3(t|>VrFPK!{ms_%!x8a``i^YzOz4>A( zvKuU%`6CjTBsCTaob`})I=7KG&tl5_yBm(%zbNF=d9r{z)22fueM!R|(IrAZU&%WC zy4dR*@sLf!gOP9D0nU7fAjJyt_IdS2R1Z+Y37;ywIR!TLVZ)xg~Pm&%>Np= z#kNl9J;zbU{E}V5$;-a!fU=O0`OguIhqcHm99adk(%hBA9@G=t1N!HEGJ;oh|u^c-Cz z1-F}ho+&x=bk}T7D%9Utaka-{0&n{Z=0qzd$7Wt8zT8(F9Fv4RtV>0h1OGlg z*stqhFZ0{bLEwp8JHsQcTm_30PLA$84_sANO=tdfZCc)U)&rL~HuarTTv5d?l<9b4 zBCEpd7Ywl_)d*9841Hog^O~ zlrrI%{!iX*n?U`W{7J&+I_e*CCG>FY2xigy;LfKrA)hDTjWr|D`NGF*lCg=?|6AxT zaC*R7rWWSTk#V$jiNK@3lPuyJB~I9hecWDiltD`G+C*lfk6V}p6W5r}o5eH4ApI%~)5(#yS7LpqoSP0ue4>4ik+D=UY+^ z-C{^+(3hF3Z}2BwK4e8no<8q-A8r>hx!E^`CQZ35e*Ohx;DPIn^A4o-#@*;=f2HBL zO1ECwbi;vbd!M$;{aYoy&T)^)#j*!-T3;F2*H*4qID73PZ%xhumNQNYGV?F;9N}DH zZKIN5CFOA4%qfp~=IwJY{IXjXH62TjzvE6IJ zUoIwb4|@&YdWK2-4Gb(C41bLN6;?6`IM_8zV$5CYU!Jvcq2eT+rgy1dShRLMW-~H! zGzeh$^r>)RD7%Hj%gY9voK<)jh1fNI6!T9pQ)XjeTfc$RaDlS1gZ&(LU7-U!i@(>W zGHXa0@bXRM`q9Q@_PDAwt)x_~+B3a+`*giCkNND9wV4B$>laN(WO3wdXkxrILEx!F zz11c5xN-%v1WvbUEME@rM+nsZf53mZfNPaNft3>5nh9Jh9C(FG?W`^_&40jM5fEuy z#ISlp{L^wL4g-eDhB_-Hma7M{*n^nXf8z;EQ}Ca_Td$_P-Hf-|RVToJd#eL$zZugV z1A%N74IT#ey#ZXA^=b_VHuH3wE5{Vr{M&z^*l=6rIkOn{35+)k8m%TVWF6q%#K6+f z#PIrvz-$H$s|QUIAFDQ|3vOm-U=FBO=@8uUoqtaQjT{Y+7?+j`ym`RX z@QKYbL%~>qS6*FNSivGnp@n5*V3E7Pi37#gE^~`7V*l}t_30)4=z0xhr2>u}0^DoG zJ*_@5zdcZ6+RiOCExB2MZ);h_7iP{M&zSeM^D!&?&NUFYnowhPi7jLb&&2Q6EQ}Gx zL5wF21il)$8!2)0+|XhbU|lhRdqY8trMYsVLg4=o+%s4*CS4PFwOH9r!DkN(|Jw@_ zdcj=1PIJz&`4xZyW!Ag#KbH& zE#qp2f}%o|fTE{u0)K^pa>H}}A0-N$0o)H6n7*nDIIK`+dBDjM$mPbykY-RXuq~j` zXcFUjfeN3M{Y;Jg0&2>h4OvVJ*{vqACVXm$Dq=gnx$ws`hCK!XZybu}3Qgr!bhg@* zETG6A&A@D2Fl$BSEd39aY?~OC&78G@lR0*SJJUuk6NcF zp}r!3>8BEl><|7w7Rm}Ave+N;$yX@UXE#jI|G;-3p_M&|`T4&IxdEJl!J5jUo&x(! zVwN}v2rX6?zQDuFuED$^Qc%&;x`2PRKm!8<>kk3`+rDtq zVyx^Cc#%+H{Hc}sqMzOYzE27)#*-MLpCC1auf(VxIbw|J#SYe@02&OcUAL zLIv&|n0nMq;EY4QaT8OB0qYbmR-=Sm4TUNHKP+TB#LjVX0{bQA(qsJomdYIu1h}n~ z9Um;<{m3^*bMei{#s3R9El$~5?OM!raq*hN+;yufUIRDz-%|QaAbUSSr7{EU>sC-|#{9+Fz?Sa50!Ftlsjgexq^G>K$DIySxNGC2+A^ z`ln?VKD&BlAx9&Ru%+_3?@KzjGA#yO_@JI`M&_$1!rd#M}8}Z z4O=eM{+z_J!6ICfqAzWgXII(*f&Qqy!W#=uCThq($OYxO5rGj1LM;Y{(yQ5 zW!Z0Yep)J<6jZ%E(#TZE_mA5{ca`?kHPRbQC#((Q)G&|UEv+LsNridWrkPig*qI!8 zowQPp6>MNHTK}81)_BrhCP((;;Q~zF8}&3{%_-~PAVF-O69jeyQ7Wv+%&NkjhQH44(J1?MW9 zjV(W`{FJvZfK|M9hJ?9ta)Q7=1wMgDfg1~!vv1PTICGBOh-EJ;|0j{X9j3~v4Z%!- zJWgC&TGl9E{l%ZUK>2^pykAzz0w4ONa#qQ#QP$tE=D$Hbr^PPDC!hJx2W;m1%l{(b zNb9N%wcmEJEn+r1#x;F9i|1edT@O}=e&&6yp=|Fk`_l8Xn|w|)KRm3p_B7u_9>H1# z`+$SYf_ysy3b`CFmz~)tI`MMV=F2v@^UhCTKW4(vZ6I*#!VRNE>}(f#9X7Bpd&^lZ zd43jWTA3#MmQ4Qo4b$rx5}3|q9$5Qq&X<7W4MFGmVovD)fOdNUO46*SK_TxU~CVMw1ouam12B4wc0kWeo|aKCnN__csr%uKoM@8pIehA;!}3lq2#9;`mOI`!?A!`;<; zXIwwPU3i|wkmm(2gMT9?EW3k&eST+mry?VgA>;NcLzhw1KyVhxb3+a_!-zv8yGR2d%i8^ff%>oi-vV;H!-LxFe@hP^kcZr z^YH~+(Pc@)movg&+Pvl1dP}RyMd0Rv>&D59#}euVIvAdOP+}Lo?x#3mNr~mPwM=)N z_5R&uG2~P!XW(-v(pj*wXU?0TJO#}QjsMD1?SAqfHF*1_nLmB4GWQ0CrPHUf9OTlP zvx_(2OKx6hf|fFi0F%~%r)--Tx#k|e=5ce9hVu3~r`h-f*DzfDsl-s&@SHR8!&RY| zLJL1!-g8Sjx4zlfnBi&^e}tD++6M1u2i`9^%+$8}&aao(nGCtD_q9QcUh|$?ZF+ux z_NBUgU-=XH3-v9z0-i07z098fO|bDB&-u%fHXPWtiTUw$n+5l^>eU_Yvob0#In0<5 z`kFmx$A6XIak=N4{@DwxF}Sx@iDhr=8>YQKJ}$rd|GJp z;J1C+yZ-_FqQAdZJW%^u_p6rgNc}&7M+y^+gBe;MoMm?W#?ddxaM6>2p^1T|;Meqk zhfZz0vUV*Jfsb6eM0Mki%m|#Gkj27MuYS(hc)y&OqAVVD)JtJv^4>Yu_+?-HWFITA{seo_!K)3iwZQ zofCT}<-KXm;etR86WI?gubp!pV!CFqHm|$ecB!Vmp{%bnPwJQUh7VGgSR9(Bc<3xV zDs|gKT0bsWo5}9ZN{#t`OoB@eJD6;2-;&Pua>HTAd6BxVqTwkUUBz`5EuSpGmC?zl zUUze?Vr|pTq^4O~0?MMg^K{i3guHkHc4`Rf zY+iCexZ_h~eQVoyuc8CpS#qzQb8~LmlECC?67;Wy$sl`%zG9?FLlKj*LCA~g{8}f9 zniPLzcg%INvM_4k}E)=380gp1EzllxuG>LXL9%bt}l_Haz@kWBf( z*yT{wnXXjbr+B1O++srmv*uTbrN&GO6% zibY>oe@LFwF=9`sRqpMO30ybfAv2HPgT}u27o96+r}306Ti?TFwqsV5=qz=q+SxDF zj@LhGWJ}KZ*4QyWvtG=xsg>6(fw9wdndUp?hyy5 z=-BJvFX{72uXL(scYp9aE}gT>P~D~PgX8kq**h$k-`{O}DqXfsBvu0;@TTOpGoB&*|?|lcK&hO^1J2F_m;&H#bUFFm1>H8|5&u_P@dbxc0zN**jkK0wh-Tr*~t_f^z^?$c7F88?5Bz{EU z%a4i1T^|n1TK;s`ahV{S{MK1w{-F-5BM&Fk&Ty7yPF`r1RLGSgaZWcalf&+T;r?=t z!}%wZj{8qZ?N7~EB(S_8G5rf8ufI=|_?puRBC<_f8+4Ay-}YGK6!x)IpwyX-^Tg4O zb&gH387cBb42LfY74^roIM%a@?`YJOdc>c#g^`7ogMszb29>ri$^v#f+?*XIw)G!; zFQ~7;zWK*ScI`hKT>t!N71a=6U~)*{PJVsD^2LNk#smhI42LNqt~>c;G!Eup=x_{` z5bEKVV3hwE!OY;Wp||(NW6{b@9M*jW4F+i~62dnQ@(KTQ;x%AU>sKvc?5Y=;#2+~0 zfP(f8X7z0e%qt93B&8V+$Vpu46+PlG{ zrqCL4;}J{l0x9=X6Q^-)i;ib7OiD6mD3ClhP22GJq@;6s7G6;R-4`XQK z`FVsx-(*8qkBJk5;sZCgcL!M+6rR<~|A}Db;&{|(W1=jr>2Wykm174RLjqGZhr8by zMrMVUOL9Go4Pq82_^lWcxcYkTnRpol_FZ7s^T~L=@ySFnW1cOpuN0VjgA%&V?{sDp zmr!^AbdZf9K|yr$Om=~&0j$6J)b#(eb*hjo3A zKtq^Ii+ta2b`uu{2ICbMm3B5TFtB{&uMIim&bGkGI8B&`W6J@ZA1@APdwt;I`{&HV z=FsVs6d24fCvm~S4GfG&QubDNFf#PK@X!=-Xz(@27UA%4@QJ(9r^nO6;pBC~KxqO) zOvw>(!GHs54lDS?Ll}1E9$jFhRnQQj@uXg8>aMj;9}?La4H(p`I2;(h1?=hyNn(%< z;B#>>Y)#8yv1UZF{oVh&f^ds8s6%55hSr#i6Pgvu0C$Oc- z$4v2agEoJ`j6Jny4zJ>w*vc&B;MCia%*JrT@y?XczB3XJXX~^aZ?`Vu|7X>a!g)W! zL$017q48Id3*Xwe;`$N~7^9NJn;RG!xX(!Hg~93G#-z#wqI#m=~pfnm=>`CS=( z?5A!_F!^%Rn2m!sP^gKERpo$)-X?ad8`ZO_6`bn1HU6~QE@|wE`SRdgQGlA;uY>HB z%bFs)1r9KAaZjvdIm9Xbjz>dlYqOGiimVC40l{YnC)U|8vRs+5TAU$)MMKK6X$cF1 ztdJ6)|NeB2X+PTyoebU-`+Pljx3|Og#l*?AXVj$3D;$`Z0vfn86!_mfb=TP&AXED9 z#&cHorogCrxdq%6IwFkS0guf>7#Kt%m}Te19mtVf#IJtDRPjlN2A9MJhFBF9*?IGv zHm=RsRQE$yzVGapZT~Okw#|6V?SEiPnZdsadsL6f|J-wgF>J$=)*fa~fq(`Ewtz;S ziigD#fox{m3qH5MX>R^EW6O$_(|UKtFn0Yc$gt;gWDqR)SuZdD?6^Z}&2&+Q2Ij*F z9VU7TQmqBbS9lWH4c+?K?`Wxr@+ml|_0&4X=qzB||Kqsr6@~@@i{PnGIG7mx4)oO5 zG@Z}VV3Xq$Jk>IVS;$MmN%I9GNBp0~^4As|u0B=JTd>0U*smY1Mj{8l*V`m9u)k<= zOA8Fvc<}GA==z<9*42v&aWZHySal?DN(n^&sFhbz?B-}-7cCmZYjeZ`5Go1~OLn3|`dFP!{S?XSHQI*xmYunUA4>d5&ySSHPXc;;jltyM-U|XFgEm2x(w5 zeIc+tuVW|2w+F`!`5MpVt28k(BrusAD&+fit68kDf%$+JN40_`U;PjLjvMW+4XrIZ z*lZG-!+)}uO0>E;%xHPhp3c!?tk8P%Fne4Av&Mv$stbnP2X@t0wEM4UQqySd&t%I{ zGOMm=wO?_dN~7i1q4p>ZW}g|h(VDB6GFtdAv+-Lna{OtpVPIAYux-m=5m{l{n!ujX zZI&L@G$DF7o7O)q`5O!U>H`=!elYV-XwW#^{<@h#kCR=JfkDuqS)_x3QDgT<<~CV@ z1{Q%vagP?(2hA-P+Km_(ggI0?PPFn!u(n=co0`?cw40-91{d3lb;cW33dz`;Ff?dy zU@us)OX$VnHiv#DjWu~U%q<;S8GkUW6=;`WXfTo3+46x+B7kw)>(v4g^$TkTdfVB)S|Za>uSJ7XIc2cz~0Ce{PH zf-3q=6WFW{Ffe>zZdG7m;Mmt8!EU_6o*|+!DWc;l6NAGHt5$|K&J9L^6^wSPxnek) zSQHw9W~}yHz{$|j@aSJOM{z-Y^NCFjd=4xEFN~*MWYg4ONZiQiXd&*Z&|xy6RXc&< zUQkDH1cP@5yQKspYeB=aDvs%hqM!>a8=dt3%1 zLqMa(>O;xh8qPo1(-j(XcCj!BFrC(DWs_jAzrkM5z%p$GgQ7$0mIF;P6Itt9L>dD= zv?+8naQtqMi#Tjn!cnHc#4w}f<7GoGg^k@ST4zNyRqkkSJ;eAinT5}yt$s&KBg3io z1_M5hB?}}Na}KaDR5b2LWN|m_U(&I3t5-+9Ph-)K&Flh=6K1s@xUMm1P1pSj+zUH88eu2C$Rrh=wPTn*S*^@qJhDnDTSkrN27tw;dp2Q7tewQ?h{5T zKV-5a)|gowZLwhA;l#jP&}e?4QMIzYbrNGq6-Pw`(;MR!#RDzEpP4)!Fgl(%8M|F0*vy7YwPP7 z*p06=>%C|)U}kV_;BaGTU<%mMc7wfU0efjcdtL$)gGbYxU+gtEq>CFi?7eI!T*Jc0 zz#t)Tc3z3XmlX|Z9qn5zn2IhiF(|auPhgumiRoMc+bj(R0|oZP3_gc|jyMMop^QDH z3a)G!>#8d*$|PvFuV7({XoxFfQxE>f+*7}b<6qX^Lx-BrqgS=!mRfV9;m^?`;47U`20oi&rC)-sx7a&cTA3qSS~yyn4Hz1$JNzsd7&{vEUbICr^zdXb zr3bLGSujL;aD>gcqIH6qX9KHiqtuRakImc;$7?f~87deo zAF&B6Xh{Ch)^Ug-{V#hwLywApT0}`BiwA>cQ%BhX1Hpi{mK$w+3Jf{ft!HJJWPZ0> zGc+(1^wdvaSDMjW|A9@0fkB}{G|S<{sag)t(9nPNwH&QtGpx;iu$Nq5WN=`bQNvMm zU@OChreY6vc?Axo4{U`U8qyivg$K6EaJ1(XFq-dR5cgoONnrN6)GV-*tz`C#?9Lnvf(w==J2XD~)f%GOoU>DH`&^c~18qAcnslPBWJWia`E(>DG=Aq`;N)oJ zQ(&%RU{|hpFk#4G5ctucn4n#Ipe1B#V}Qq@zS0HdHy9Zvup}O6VBWyeCB-0gRBniEF9>G2aJ=55E%y)e_rLAM8(1}D z4rmpGLHK*3egf<51&k)ficrKA4eQr!n^Q>9osG+6B>H$P%% zd-kE}NJT4?0du7UGlM~cyv<6dYKFOg+k-n80~atbS+sVXXlYx+vRQe1;Vm}t395gY zF0ATq{CS~O(1ERH$9lmIqk0K`@dK)DE817y*i^rw-L6AjJA>U|m-< zXlE5`a@oaxY(muh-TT-C^x8ez*aRB1E=`>Cp}p`$Gs6dl=nrjq674q=+WjjSSP!)1 zeQ3+Su$e8Q!OSCtB~Kx>qk-oEt1<(F!2*fMt;~rR8Wcu&G_^H0q--!Ywh&KV(7^H{y!}I4ZE%z9t@fS9jKL|2p+V$(KZ6;5G)5gT6?V`o?pQJJS9{Ei9eqf&VyZxiUinf4O#upiF2igQZ8e9uBipv&w z72LJqXb}6sS#hJ0=|Ri72&R^ctp&zg>o>G8dNi1qJyB;kF0`lpHy7jm-|dU6n4D$U z_2#xP6f|6kVzYkS5Wt|A{orM5{e+flMv_$xt2raQqklK+R5KXuaA{U*Ec(|Tb7GTH z278IcMoUZ0#LY~9H|)I_+Q67l;P+tjon`G>94yrh+FS)2c5pxDcbJ&K&?pwbRPGVe zS!9!C@u0q8FY}2j^$KmzR&eFa*rp&cWBR6m86j*UGgvDQ#Ofr>^<-!eQ*bI(s6W(_ z@sEX}gYmW)E7OODoF6Sr0t`|+PA~UnI~3f)V8O7JJB`7i!TU#hrAIe6Lt9Hi8)pE+ z!P*sq5?sCl4GcdX)L#f^sW7R(;LKamB;wJ)WYJ{m$ga4e^ z%`Kb_92zGqYS$KMZ9T#M?ifp(N9#rp=5h~Kzl64$rX@-h{8AnIaSjY(8**D4Rv0#0 z*9S>3i2rj?57}mQ8(ukmDR~;f4cM65;$ON<0LT7hYxGl+|!$7rXwBrkWM3EHfH}mb9xdG}vvJ zYLk()o|Bm&gSj<>T`?oQ&XQ2d}p%%8*gM8hnTQnsRYNeKq);O72`txOE! zED}%a>o2V1wD|n5-lLdF;8vx_7iJCrv%M<>cT@x!Fw76&2(xHhAI!$-!0>QZ+qtx+ zuAnPE42{e_9M9Amu6T76Y+#(br>&eJf_n$Es5eKMM9YauS)Kfhwfz6qc`$ffO7XX*tS?XDP_%;3!xxG3MktZI?) z-k@prU!Xz#8wXqWfd}FT>yP_gIQ3(FycokG zqcEj{hck3o8CX94WYC*0Df`x@Pf4Khx_xaNLx#t<^YT*jE^>4&W?aB+-*nc2!6Su_ zmBF0l>ruvp29bKlbZLeoAOHOjyv&no>HJFZg#L=|0&eC22e%8-y#8_jSFWCzFg?7) zkKxNl^Y8izO@}@_;LiDB@aRaFxN+W_ABIm(Oi~YCmt(2CU4Vh%$ct%)A`FZSd#;?m z!NDL|%M!`^V!_*Vm8o*u{&qi4Wq4Khf5lb?hi2J>*@h3^d|r{|P~Tnr|IO5!Hfq-z zLk>6`37q@!-XzA2M%RLwA2434zuCkfQQ#6$*z|jY#EhkJK20%lOJz59r9axnr?R7R z&F09X=8d+@j%=6zEaqZms7N?#|2ku0N8SpS1CD0@PYAQ+C90(Iax(}pp0_{aFu_4* zPESF%`}H1$26o>&pZkrq7#`F!nZGY^WMKFgD8k0e!^#rC>3C$%0#3&wh6n79@7_Fh zZ2i9=nML$-#Zh*~y#gjY!R1$kg&5|2D0DQL9AOaT_NRuCLAl80R<%Xs~Z}IA{MZAdrC}yJAbfx^c;u^R_+=6S(RfFB@F- zaI0ZpXt6mxG4ZfPy(ANZg51o_!Gg~`-1t>iX_QE=-FmA^d)>}gyR_F!uH|%KUQuCk znvr460R_juGZ+~SC678aa6bOge2O!{B%sOS-4VwlA`CX4&YOGu*wDn8)p+@c$jb`W z?#l01f;+qzJQz6{6Sq7#YE|s1#2{B!fAsKiMsAg)yZ`KO#RTfGWwRuov)sGIz|}_5 zvH6hD{U^qJY5}GX+*kbPxy&F_m%5}gqea53m&I^JagSi3!i2-tZ+0XeUnAeHaL&58 zfV)BIf5YM<{LTs&PTEiBU~raEbeI(4R?D!UNz>*J6AvFlih{RAT+aelhTtokc?1g> z>Kz-Z_dGH1uw#j2a*+FfrMaC$FF--eI_1xYS>dN^CV1NI{PL~E>P*ZANyS8u05*=! zC36LBEe#Tu9_Oub;C1{NqNr~B%fX3B!z;qk-z8GX$+{Gz_}Js{%Iuvw!lTfI+(8#RgC7XcdE_ zLK_zJ#-}K7PUbiyvTI@&?-WHLPYY+uXGVN784vhlUNA7ID6olaP+(BCIAZ$#IuOa_6Ms)i$bFsLt?$)w+AiEJqc|J3ICc}{|g-F z_iEtKzjHwBfJUQ;jv=eI!fEY)8m{~e3XLokj=IeTVq!rb7?~b0h!*~Fx0`pN<0ccS3aB2$Xm}<*dkY=ARs5`#-``MVff^MsM7D#W(O`XDZN?1tp0*|k=kJ%Zj%QR z&wi^rFl$|C?8}!bJTTjR!otqZiYL-{&vclHU2JoWIIREj!x4o9Mx{E2WWIEPqi)R) z*&W|BEiB&Yrt~9$OON3J$J+<4oEibU4jfSy&79yQt~9Z?yy{53{4)zynFR+}OqLw_ zCtELhT>U}*ueQ_;jk^4KGC8QQ!J$y%5 zYK?-c{)xcQlTVa|$`}M44{P81IBENyxRXmO|4;0bU^pQ3=%E9jlC(sWYplKhwbT{2#+12D68+Vn6S?zV92Cu1i2G>yn0|{dq_baWgzuAcy%TAe3;xN7<1zK_;j4_6g$-hKC7o%x=}y6-D5 z@4okKpZUJeYv0#?-hKbyKl203dLJ5v_dH;;w>TssyzWD*@t%i#^%h5z^*(k6?|CG) ze|q97wygTOum3K%*L-^2x7Gd0{PsKkIqkcq_kGpv#oQthhcz=SzwdS4DdEfwKnveD!%vp_k$yuYwIr;#Z?q1AKg`r4l6!+e$tobGJbuj~HYEcd?Q-;c}d|9#!O z|L?nc`#+EM|NpeEmA_?hRN>i(ycBF;`Q-QEP*ngQM)5t)T0D)Ke~#*OFkDn&)9*N-wqSnZmuBk)hu2iJ+AcV3wPAt#gXVhc4T?Hz zn=SVo=9W8Vx5n8jCEo4KVapxNzpgUNR=K=6!K`?S*|sCm?MJii31;qhhix`2u#adG zxN<0|#YuqYpuiJGPP;bS3x`?vwTe#gba>k&=yAxFMYR6HgC0XBhLA&6D-LjJv{zg> zAP~cB$I`5L#!*?M+1ld}tB#YNB@;uvhm-Y$ZXGu^s|5~R8=6%rPXCLsXy!CIXej4q zGvOfXj^jx!hh@(k;N&@|eu3Zqf|Kx)2JSVCPJfy0el&@FX)vyEF^g#Ap3%U&D~e8U5|ZBD`#jTRLxx*U!CUmW;991!(+9Dk=-_KSmf zeHM%G3Av>oI%Rd*^sXF~PGJyy5u5U)S$2Zse^ob=2!=@17n==l)5>xFSB%94SEMakgbq)iY%>kJU&WaTc{(qd+c^EWq9OgN~P~hQabAW;O z2(t#y0aqax8wWK+z@&1(N07z1fKkE3Nz$f4;KPE%n!~(18swfda>g(``Egj;q(RukNnD3PVoICc z6DMH@2gaHMmPJiWF$bl0I7+h|@{wS(m0)C8Amw=#+WH-f;=}e=^9A^^+ zM)n+L>jw=|FOF%+FlfIx%>SXGX6a$WB~KEs9OnDeV7tYsq@q>Rgh91L!BWQAFoXHE zXbbZUpQJa;ItI=00f*UNJhR{6%y*$7{fD!vLW4@csd~{K2jz-`jDMcme`qfK;w-Dd z@Z{f$XPS2==$SM~{y1vd;2?5_#qJCvbHF027Y;lLhXe{7GNKMV(><2ub$~hKru~IO z%q1@NHO;08&SnLTGR-r7FkBwrEVw@ZL$f6dvvJ88`z_4o zZ=9_K4jUG{w3j%{WO2y8z>)KeSn;k1Gm}GRH9?v$*i@D@SaLKo*ED)AJS48*rMRbI zSI%LjkXM>BoMf&#iyJt|T~SPU)2um%$-dyQQjMgYgJaPdSDShZC$5A8Y!wXZ6-RAE z7HYC$NTr;~NvRfs@-ACT0W2M2o}OXBrtZR)kwLF+E^Sp5V->(3q9c#B{)E zlTQ;v39G#fv*nRXYqXu+Q?kwa%Yojlw~}L;*$y0xc~jpkr@m1x@fR3d zS+e8<92hhjl^;46wW)mybhgNO6m#LQfK8*CiG${!j0yh^+esYOH8{ki({%M2Bb&z| zlLLpiuP`imwCqq23v10m1BZHM{Tofs>_U&8bG5kAz*TX`z{ZK~Ps1)3XEv7ud@GuC zwlMH$u*>>12xmC4?Kq%VaxnkjVdEE$+7irqDvm5N!O}7g98Vez?i^%vVRCeEVk&Wv z{L`dt(jZ;4=<=}}Vj+(9Ul^GZj>I!Cvq#KI6lhkIkWM||#KaTjCc(^_!&txITDXA* z!*Y{jYB~(R|1m3iIG9Xemi*_^Amwq8eaWKxX{*B<4vTRdWZTfd@Smmj?ev>=3}$(Z zTnn5HLL1~>H1N(*e7bM7d&427hz7PE2hohz@dfLITbOx!QgnOXF*!H9N;_gwa6q<$ zN87+bV~fC)sw3($4xe<{j^@3LkzlG9{_m`!z!0`(2~WvnMT-N^E;=$@XtF3^5In)G z)N{b$Lbw})Gqb@f`z?(OI!=Wx%^WR_c`i;2TN<5CH1mIGkh}MO@>WK{7tCrr4gHs{ zS*>W(u4%|^;#V_hsHt#Ol5n_v?x;yfgN%ure$4^lkfm}l4ysQY*w+Y1H8gbgZrD~o z%UN!UqfkYIaE-rC45L`WLD4gflYce;)3_6q_~o$3k_Oc|4%}y&Y$P1{UfkuIuWb3C zNq2*je8~Zh31JBZdcq--nXequ?I~Pjwb6Y+6XTbIx)VOD7#xsGD16Ho$XU`L$J1Qn z`{sRBi>*Q<_mXG!4u@H`ob~$T=vLyyl+YqmzofycFHB^{s=v5?6mXI5Eov z*E=}uVPZ4OV30OAW-!NrUtx+8j{`HqLBk);_8|xDtB>5@C8_OkK=R2XjT;AeA2jeL zIEwtLZ`MjUAgYii!Et~&;-Jt@W?qLzfzaZF3ICiJk8IB3bF^r8=89m{p0U|*L9v^M z6GP7d?i~%>TMlqIl(=1ZmnY;b8sosia!~ugs_>ePM~^l0{b;z?%FI6HpuI;kE04Nk zg%gv+M41f@))pn_J+_3g26LQn;9bMOz;V-lgCl!OeVFwb29X{U7Ln#imxJ6EFTKnq z%_cM`esNY(Y2fc+GCI;E;Lu>)aG2|hTmKEJvRAg!^CUKUHZ1z?T8R}!AoPG z1G0ab3({CJy3M$^G-tY(a76fs<}_%}Ic&|t%#u@*bKcDH$~KSx%qma5<$d3l^rqP+ z;bs2h>GppdIam(cx-@Z`9AI{6;Ltf_HRm8#&CJ9vhvc>-*QfF@GauOI{-B9z3FBXf z`C2Lt{fcb{D;xw8ewsBn2$%3^=`d{ZGUa4;GtOZUcPLX@b%-s8agz{>fdxb1pB6=f z15au#L~;)BdWtEjICKkEB(i+xII_&$V28WLVU`VyH|$<|u(fH*IH)PKrJQG#H#o55 z$6-Yq2Gw~#(%Zk;*Y}up*B{8-|HEoZgV3H1`xdLd(`LEn9s2+8_?MTjk^lQ!{0C>{ z4-T{BEn8PM3$Hk!`-a)_Mw8|PCyNQp(kTunmD;S|Ffha%oaxGDedPeZ#~b?#%;Fjc z#FsSb$T(e%(v@r}NXlsDmN+2BaY+7;qkKS;{U1lB2?upEoH$-MIMx4a))Qe;`fz|@ z2BT6>QpJ}F&6z5t9Y4&k92Ur6(D>ja+vC7+VB7llJ8~a?+wj?Wqk5a|2T#5g zCYzUsTO=^DbsW@5X*M@FtbE}B#{{PNiyumO9FUjznZ(kxwA$73K_k~09WIUf4|z2W z5(g9$6b^GWFmTi`yeoEypK(sE;{a;`!|}8h`J9Hg?F<|R4cA>tSR)Rw_ArQvG|$_} z#35n-uD*f2WTC|rNA{Ql>{A*)-eKmvx$kXpgN({id7lHU6%4!qmPrBkC3N^qPBd^z z1e%;_;OKDRxU-*I;)L?r#`pCM4lO_GFTRbp)l+b5;V@)6vb6rcRON{Ujm><)zva@d z%=jl5FTt`GI|+yFm;`Ap70J*(P$SAyW_Cuy=BQF!k}om-kiWAN~7!YU07e z{l0cewqF)E-#J|Fd+x>W=O$&o}L%GJN9AeuZs_zIr!8sIegx}O?FFV+1{-Rm-@8#mt0;j_3(_q_*p#1FWvgQ ztv5P7@AeV9JI{F~w^m7AE&R5pH)enR%Ne4<-*n@nD(8joKRtv0_QsqaM!$@g@A|y0 zg#Wy*aoF0s4>tcjHM97fzs&Z_Kg`y@WBapkU;at2&BeU+bAP0l^S>^P4tsO6a?7F4 z{NHL{6>Tz(@ACaO{k``GS&ac9~z-GM7n~|KL1sUwU9>&-}u3 zl00(x?@qpuDU5MmJ(F|UgLmtM1APLIibm#KJSv{}M}1yeQef-!f-l`0R|hJ+SiJ4K z)4~H21WI)-olu_WBeb(VV#bRGan*%AL8mlVuDRs3`@_%VrjSck$C~xG?Fu?$c(O)N zRAknN))PiIb1t7Xf2dO|=RU>Ld$!Y=&fxR5-&4|OU;e=pa>0>PcgmW&InLR>&XT!T zF1joBhFtR0Tzln`x8d24%f6OxuUz(b+y}eVG$O8R~}*yPx$9)b~EzOg#>ot8p*I*nJd>`i`xE3(p|3Z zoMpRw{fZY!fgLFwXo;Pfl-}&w3H2KP7oS#o|Ka@0%%fG(&+WmUQw9i5U zcAo7WO6PvIbLri?+aV}%!_u8gxT&(9Ls-x(a5;xURM+V_iY*E0!h!~s9P$NAgmq;K z4Q^eSJ$>)Xw7K%Y~0N+6X$ZfB(0}Mx9msj^ge~%PrsEDc)_N z*f6CsYlC9^nw`5^8s*v)lv+8b{bZlQ=(2M;n^Z}ix140og!Czl4wV|>>_QJd$=mRp zSTL)8*-IB;akGvklau~cri=KP2rgoDFgwUHb923h;{&lxk1C(eGM_G)& z;HY!l!$z@+#%K$LCf0M;W!1JgZCRHtVvao+xNjmqv7DH z_AiU2=C5d}*Ax4}pZ_LF?#2fejTIAD)K54pI(fwrtxqn_(E&~(w>U@q--p#TS&Ek0`X+A2_<9zQ$QHH-yc224nAKiDu@#R_!`QAv{TE4CLGy7$l2A z#OeeVOZ;_c*IAU&C3NN>%iV-lZXw0S_qHnXJ_!fU_;fgJtzWZ2dvZVrQ{RKlJs!$j zLJzpv6AGsW&N;xMv!Ox!)W-?l9Sa2X1R7a9CakOHX=ankXymeJ=<2Cq=9Xz_WDi=< z)$=7;;^>FtmT40=82C+|HP1WQ{@cbjo`MC;cmH_LeQ`s3^NGcr3<1sxw-0p+-Z{iF z?MIVDf*@mT*r!RcmWlOT7Y})^+n_9cb^)V+%TFnV33K@0xoR;(TU^KiG*q2$dMpn(PGHb2OZN21dopjf3j_CYC4TvOh7jec4hNo@ zUE(*I!l3cHv5EUgQYWJblk!iCCf;pI{IUleq+>kUSjD~z#F`vX)Zh9#_J65w{ShaD zmJh4r#V?A?J+?w1GuxFhWkX*=j^@g*XH@JCeh=B?F?Ch=O((Vu2SqDhG_bTs98r>3 z$jqy9MTkdWx&5*SOg>SM7&TTj*XzGA!AO%N}z{^dX9EluHWtl|x zeC)q8ZyMLCrAu^HY-nWHIH>i1K?_5Q1IuT&gF<`0zORp;daV3lvka@*2FoQz5u59O zILmw0oR&^7FfNrzlN4RRQu=nK=NqT3+EaL6NNET-^`2qou!uNr`)1;!YM(1x_!*~H zmpAu1yBy$L9(k0}WnsU_@)>sNANig#$fPI=pW0r(qmggInr0cEgFCqFrl>Dy2-!KI zk!{yW4ilXT9H)9VwD?>tu-kn5;oGbh5srq#^-P}+%39kfh)ETmtBSpIZ)T#g@>d3? zBmW$G`2rl%Gkm;t?EVR~KIWNup;ax+=l8`fyFZN=d(4hl^l6{lw5FMjp`)qu&ZBd7RGrD?B-`?N&NoVBKPV7BmW&o{sSxe z#Y85wIMlN|;@bA%3zyM@Ht!fE{sj^~s!@OVuj~q!$-L04q7~T2apPg^Uj`PYjs+Zk zI!%21E~nMm3K;mLXWf0fZc@Y9M^84sU>4B1&=T`!VY_LGhVqjRr;}b2nPtBmV7J=Q zs5C``Q=`FIcm0ope3SMt>)%r5vwYCVUvr>YrbS8lb-|H(!6=4iEemDk(-O_xeh-)w zYM7cmCbV_`6=uxW#7N}7k(1p~aV{_xDrt|62|z@)SKtmOOLdi@m`|hJOra{xeio*w`;i?5W(4EOE2o z!>zbR!4=Q{aBN_>c|=g;fzSmbGF?e%d*CE9 zseviWVFu3z7T*FdHAV)rgR(IXSe@!0D+VPps01+0?>1VHz_jL|I9~(rt3!e^4kC{Z zGW!>BbbfHPJILVED3`~;{^qHCfFna%!9TV{U%X%QQhLKe&QTf$EA&$fgmy+bSB(Tpi;9)crc8$xysBFi@gVP&|Q?>!6UBBDV?y z1J?rHf{i*y5~VM!)4szf&XCArktn`$qttPwdTF-=Hs%8i3j&xFABYF3NctUMSj4br z%}1G)7ezP}xNZtEuqe8|YLqf?WM*KLeOoC0eu3=GK(3Yz+K&#({#&o}&XKdF;m^B| z3e15#UktgL4}9C@Bs0f>J;`17hXDI0Rz*W0o|6fR=>Z%vleFs`85tJr*9hX)F;Whk z#9{l8q28kC-!}%`I}iCzEKvD&K_%W$wQv%{Q$@j&1lF2Q>h+u0B9wG_mgxSw!oYgQ zP<`s8-+vU0CBBzr=E*&|`sjv}4yo8+b}6kXG( zbG1nK<|f^{pL8D@={+sdd$~#PZBfLnL@AjR{hvls7Zerh-y0b$_7|^dV3K=aASi68 zn!x6@P?GhtVZFYr+d`gJMv+UerQ;T;KF?=<#8XpF{~8MwuIlA~}ga z?lH+2B}$n+lC)STY{e*kK~pX*QP6@>nxXheNTQkZ!8_+3$p$n&QAm}~SSWJqptRk> zYYLmCW-nyyV~{^nzkp$nh8T~7@pFB(8H`MQ4RTi;81y}R~&_T5**GqN$DjND5%O$ zdcbrjQJhC%yF!Wh?ndT459FB|84Z-385amVVw5|v#phw7oC_l(gTj?P2bs4#kY`c6 zWx^z1k+1V_0b`$|jKc%2WryqKza<|1_fW3r$lGU$KYlgJe^@AEcj<6bGJi_LCpjmX zs0W9BCEC1t_*d@VqhnJ-ls_fPz3cO2cb9*qn5}hHp5?3jzmU!^jdE`ieYL*I|9Tj7 zcTM6u#(??Ey>A}IetG!!S7YeZ4EZ$-EN31{h%8`RZz6t~kxMLHq$WYypyc1R2ldL| z83nHyUb(`^wX8s-MM2k;NpeYoz^->XPL3R#4$3Z35Rh|{eb*rIrh&8Np!h5Wz9Yxv zOB{Lo4zRCSAY8ISUhg5-mIiLShyNwMD(-M(l~Izv^YHDK1>AoUMgAO+W=Z6j=OFU# zoqUL+!`lfW%MP$FaS&l(4XI}2Zc*Ty^HsjyuTdz?k@H7_%%=p-K0aB2gK(7hy)Z%d<4p91GUg@eN8P4Y^Nq7Dl=G!{yqYT$A^FLlp>qwj#g63#H@ zM6P>|(lrZ2`a;EjGs^irmQ#2V$$Eg3Wnqf(A{mi|ToQ&?_LXHExyJmOfx&FSRTd$q zS(E_QC!Y>VZM61kT#FrG<>Vf!X;q{w<` zq11*2Y)uP<-zjjsJIHI4z>)HRCyjwAB~e+gEck6ApUMM{D+kym4)A3)OPMTS3vl4t zwt#V2LdL5H`EwJPHyz-Jd%zx%DiPPfb>{)M!2{M!^$!(qF)+6zu=$8Hr9D(sYh>z5 zU_GV4A&?++CP{u713SZZmSqW?P6|BtT>nWXG_ZYW;4yf>Iju|X!9n>S2W1VmW|tc} zvnz;JG4cf@W_)@mcE>@qVWEWcTb%+%_A3vR9v+f5a$wzdke?-i|A-^YtBvv}6y?~Q zWos1J3^EOl)h}c|)lhWY=hmSIT(=TA`yL30JrEXo$o5Q;kHLYHW09nu1MifKQqx5Z zzaE&}VdPO_kXfn7EXN@HDN+7L0#kx8Kg$Dw9gWOB2c&o!S>!zAP9z#RC^AlaCV!8C zVOoR2jDt+q5)3pL88QxN9cg6kTaaY#R3oS$+OUwZ?t#ochkEu`59L-pVDsf7iIM#oBcIv=zkiLgDGXdiE$!=@xa}OKv>s%f z*Da;> z8QG@D&vIbPo230skt<6>VAp|F*L zG~YtS`wN)89?9k;aLV;h|L?e}Xu<0PiOlB|&d)MYc5q}Yc_{y{u3YxiL1qEPS<8RQ zKYJ)V?*UuF0~RKS*|!%kyIq#eTEMxaNl4~^O%iy64zQeaU_G~d)7+;0OO@oW zJ(RUN$l&y_{^h+?F&PG)Lks2R9b}Jdcqs5kvFz6t$(R+ge`Mnt*bY3D>ucm>II!~a zZ+U~5?Hm8iIxK%kI*ftgT!N943}@4ArnYLf7Z2suJz(-X`0-VvjMZ7497RTj1{0FQN3mDWG*s>C8 z-Z1jU9AK4bV2nG!YUL;!=OBFKAosEZVrLF;gd8-zQ)hAQd57u6jP|5fDL z_KVS;fnn1Fcc(ubW_vH!^EXRoJzz{bz)|JEmQm=byn!$JFZa_#?z}y!%?B9IK9c5W z6n$l)`)Hx?Id@5yM7e)&97VDo$!~Zl_~?P)7DXvL#rRhbg=HQJswfJ{DGC{R%SSB~ zoHg&Iw4&sfg`8dz@+>U!o8HSe9Te6Rk`Hnei)oftcqpjgD5P*u&`!~({?kG6KMZ_I z3)k+MDQs}~vJRt0$3hXN_rhxqNje;Sk?6?(sX^>Yqlnte*N0u+q#rb0#3+1VwV2Ps zH$ND~{v{kpoGO;IQ2tD!utvXlK%?D}hr+KO@cwHM`SL;M3Il`3!zTwn$cQcEnwIb_ zbN;u*2l!W52GyO~@km{MO(J_#Lw-!IJkNJU`JVqj`u88yYLzKd;AnD`S+`I`Z%XkC zMqZZ(Y!S6Tw#vKCbL0wIz?R^^vE;Jvn z|L^Vpe;@7tf3*+(@lYzNQG}ss%7I3vP|M5T^%ov$<&mEL;V!Fu{nArYm4D|lB_=eS znQ6=&Bhk{I>Q--6{p-)pN$M9Cx^zp~cA2aU>V5Db;#7GT-;*+O@eNmm4u;nKDduGh{?UA#aaTfr(9{(m->KZE@jzxgv`g8i2pmphnuxLBRjv@OWD6qmIooJI>lkzqMbWa-qxC{LcaX8B+OY3XiL9 z6>eAme?_UyB9n>XkO|-1Wahc=k8C`7BDLc11RcGGjj8pnn`aoll9{Q)(krgNhJl&a zP~(%oZORdY!#s;Lw)lw}l^7i0G(NH5-{FM$NfS@;E5EtG<^S`@Mb`aK6+U`6<+TKG zOQ_FCa6cy;IoXX{ea{8BJoVcsMd_Qj@@u1O@S4F|_hW&&)j-Fi63iF!OI13-U@~F%y zXwk|0H`zn{XhPyn`A;e(r-YBJnRtjZbIRoa1M!AM0#<=|h z8Jhh5b3CwTv)E97gONdcfuF0wjRP6I%tva&|{xxV@Xv!~fXps_V;AlO=EZmxL zi19=~hoeH0^#6o*ZnFR;Gn+-MDi@B~e>m78Df3?b-iZboAtrYAB?%n87o3=Q94Dr2 zX<#m#(IWe7gG|iZrQYKaqYg)t%Bg||`!AimdJS<-PbPLcD=5_q+OJ?R z6LIS1a#<+6#DhhnZh03s%R|A=21YiS&;4dD39L(dnwZ=c3jE`F=Uo5)^)mDQD-D^C zF)B?>4?}CE@ z-4#dbk1#UC1su1(^O0F1K~3q~jzg^VMS&};KeUJoo^UQRX>8c?Fp*)706Tk1LZ3^| z18MG$%^VpkCYUoY@GiLM#(wI+y=gT2827MZDjCT!OM^-5N2kPz&6i^iNQ}m**Zs{rBusBTKUEW=T8oe@oFsf z`~n_s&KDAyzP&yihd&nf0Nfi4`oCJNNeSuAzI!BUy2OJSM@4Gl|k4m8BvWNg;72-~Qlx3RM~ z$$|I7%6i4y1&%3^pLlpR4ocptU}lNC7+HPj1>>U76W8)YdDtVIwz8Wp%C=^>-=gy` ziLtErgkHdl3A!BzQaBsi`RW?@tv4jdKKegGL<<^BX*LA(Z+Qb8dVJ?h+ELvICf}C$`Xgu&yoXzt>`?Q^JQlDr|Pw-4=nj@U_Ol7z8*_>yO zZ6^sZUr>4SPfF~;n{6NFFxY;sl#%yPT=4rM8;8UpiAxEs%uIq_Zr=qjG0ZD*`X$)v zt$jpPbcL&n&E5%h70Mz(5eEb=eB_T(c_7T)c$igWb4JAZ2m3`Aa<8ke=lilidx<0O z0cTM@1J(;KoO#(#bVaK^>I*Yy-XtN|!ZBqbPx6$*8_uVlP?u2X&P+dki{%&-m&`AI ze~E;7YrHsIDiyX@B`mta&FRkB(2#jS?STl_PgWL&kNs9TJ5R^Y`)*%X$e1%t@?_rg z?OXT+zRmD@Ai?$V2$M%*da<`o{lgcr6^H*njLYBR%<7(TLtmnyFx>pt#ffpMOP%{( z)+iC%mol3=rGLHWnI6hzF&tPC)BJAEXJuUlL+LZ#{?gWO(3B0!&1dbFi zx;XIMyTGO9z%rq@fOBH{-0SIl;!O7h_{|#XnT|5>Efiqxm{z#@c;TdPRZ8FaPcLAM zDlOu3OE{dsb60`yQUI%@0w1Q4AdkcY2KfVwk`9dF27LbocnvNvN*!Pjy}+my zAa?pwJ-fsNM#TW8y$>=>AFytB;*m(OmRZEi|AA4nfy1nUoimYBVFIHX1CvGp=h-$M z*#HI)e&3Qg!#QsB&5I^p4iGMfh0Eo~YNQ(3-mYqvf*Ic5@njRMz|2L9s;;Xg0%?rz}Pc!5{&2>;;^T%IRwuRCxroxuGh zK>W!Et~mC`z+>{6_s|BJt_zImHw3N=@PsYpKT-dH$EJ}lX6MvcO`fo) z{I@4?&0WCFF-_p}2X2F-F}oQodsp&*7nu3qVCJhs{1*ebmj1g?cVvO`tdld3f8enZ zDCOG7CZ{kt{}S(J2Cmr`xb7~9{``P@UIN#(3Bj{ghW&Dw zbMd6W76XQihIzIx=e_?a{lMbQ<~89axIkxH%ho)t>P= z2e94w;=9;@>ET6zUjp(k3YZ-YTpSqr&n2)*Fz|dhxls1iysrVQd=BiZE^u`_n23cW zeRa@KxyF0uK<0J_wrLYM{R9|ixQq0EV6=F^Rq?W@H*j`0>7FsnB(8C|GnoAGn8 zTriJg0+WUV%d!hO_JX{-7>Yf!mWEd){XM{U?*Z@Y1B)YGseV@Ad%R$BLe{c>>0Qe* zS1rpvwJi75vV5-Pg<8vty_T0|Eidm{Ub$*{^{M3_Gr3zPuvaOpXkNu$$-uFC!kpSw zE4ojuP`SqclMHpRfm5DqpVA8q3*U!KZ?zvw3^rnPK zykZ5c|0b|=Zdk}x!Z58$lv#nLK7du@0AtA{UdaH~`b!-Qu@40+CNNCg$rvOc|9S&U zNWjtu4$QOE1&@B+DBPI4x>V#H1GBjT|6B!zE0;GVdvE)nsGj_RzwH7;QKEyb0;fGU zgX4wRZw|a64(bmDnBqV1w|`&|TPg7U0Z*={U<(7|=>$II26fIxPK|(QPD2h$2L7)T zc$Yomi4u1VtDn8<_XXa=4LqT%qCOh%9dY2za^=5Qz<-T__csIo$pr8J3H)~wcn%lv zW_{)VVzBee1D@mm68M}N`EN7u|8(Fz@`2Yfl;1*t<;MgrPJ#8Qr}v!wE&j=Y^Lr;x z=Ys&Y6y_HVJShQ8JqrXbJ1~_P@lR=pJaK?SXNJHW0Y;~UeM0qxJUtWmz9w+~{>A^{ z1M>w%z6~3=PaWV=Uch^J0n?HTtTG0SMhRWqjXSw7@-+xBi8(MDPvFvS$~AT1)GJ_= zaA3c0#N#Nysda#H$pki02bQ~`{7DVnk_#9U72N(a@Mtm|VA5f}*uiTez*+c#Q6zzh z>xRR^0It6icsnkvJ;z;t#Bq)Y8w+##3jSvg#5o^w`LZ+kiwo8@zQLA1q+!T)@sbk(=uPqpw5#F{5v~mp3qq zA7EbjflK!Q(^~B#3w2I8*NEyARC5)|A9*J5a016hfmNb~oVp5pNgtRm7ceJ0;88T- z*;~Nic_H?%1DkZ(fvh*NVi(wMKID;_!1^cPIF|sI%|RaihW>pU7_tuV$1pG+W8jsX z;GVxo;6uWm*HgGz7qINNVN*0vt-n&hXkZZgzk!42Lds&D^Pm3+v#~HFGiU@{W{!Ax zMEfF}?*v|D2F}+Tn3@!LRSJ0aZeWz4xG2W$RDl1w%>tqcLJ|e0@sNErppY+?*8Gg31AeMdo27n zf9nN?(;Eb03{rmu1h|&D>QC?E+@A3k;SFm$@c*UCOu|Qpotm zvBie>O0(|`g+vFg0H*warQa8DiaaQ>J;?7{FTlROfbrx3ZeazU6&ILZZs6ut*cQ3> z>ftw6X9rxYpUt9YpqaimH*@c`{}-<1`xaZzWxtWc=kzauxpMFI>I>Ij@!SwnzR}8i z=U}cNTM1)X0MES!-VGaAc@~KN{UdPSfMd;q1>y(!eH7StI52JvVCP@JoxFhc{{rrL zYXzdtUJa{{7C-cXp`bwf?!8^# zo4#N74r|^6o{d}^85vj=7k)4+{BBj*yZ5qk(F6ay2bVuE{$C|}$5(Kk1EcGPeUcN|9US=oolM}oet~Cl z08gF}kGesC7aQ~4jeO1mOiB+J6%?4%1u7pMU_08u=#{{8QX^nuT;RV^73e4RL1Xd?7{bqT(knhgl37jFy z49ojot*~PdVc^&zE%?KLcflUPH4IE^p9y@uz$+T+6`ZAHX@O z;2&Ggg!4@2Kk%NP{8xb|djU&O0Q*aO7fTdoxsnsa)*MIrGfla@FW7~sOCFj3u#`8)m^wjGAu#NXOv-;7l|M@rr zV^n?rkKXy8y7GVY>Hk#b=iyCwIl2F*{CWOQ1?<8C=V$W&Vp`AN(7-HsfbFH!ua)wz zehY9`UEn&g?$^eD`oA~(|K6Jadwc)yo$G(^KL6YH6yK5r?oIc8ANJpNa|5%40rOht zKd0|+`n`c~w*yn)gI8z#|9;-Zrt)Ct)%AaOoMM-2*m&EF|6kWFb}8|HPwy}9E@0$I z`}ewk`7s8j_z&E7kN*2?zx?+B4uJ*9U)KN6|HY%Nz_y)1;Ql{emFe=2*wpI}ct|dp zn{xBgQ|}pusppnNUVi2~$I_YYlS06A{{@b%e5z4bUIZ@jXU9$Ss*y*QMT`AipO?chZ&Y=o1dmv)-kSUWzke%um%9TyS>%` From 1c719561b0cfcf5eae67e983d0688ead4aa1dbdc Mon Sep 17 00:00:00 2001 From: Niels Date: Fri, 24 Jun 2016 00:14:27 +0200 Subject: [PATCH 133/133] update of documentation links --- doc/examples/README.link | 2 +- doc/examples/array.link | 2 +- doc/examples/at__object_t_key_type.link | 2 +- doc/examples/at__object_t_key_type_const.link | 2 +- doc/examples/at__size_type.link | 2 +- doc/examples/at__size_type_const.link | 2 +- doc/examples/back.link | 2 +- doc/examples/basic_json.link | 2 +- doc/examples/basic_json__CompatibleArrayType.link | 2 +- doc/examples/basic_json__CompatibleIntegerNumberType.link | 2 +- doc/examples/basic_json__CompatibleNumberFloatType.link | 2 +- doc/examples/basic_json__CompatibleObjectType.link | 2 +- doc/examples/basic_json__CompatibleStringType.link | 2 +- doc/examples/basic_json__InputIt_InputIt.link | 2 +- doc/examples/basic_json__array_t.link | 2 +- doc/examples/basic_json__basic_json.link | 2 +- doc/examples/basic_json__boolean_t.link | 2 +- doc/examples/basic_json__const_int.link | 2 +- doc/examples/basic_json__copyassignment.link | 2 +- doc/examples/basic_json__list_init_t.link | 2 +- doc/examples/basic_json__moveconstructor.link | 2 +- doc/examples/basic_json__nullptr_t.link | 2 +- doc/examples/basic_json__number_float_t.link | 2 +- doc/examples/basic_json__number_integer_t.link | 2 +- doc/examples/basic_json__object_t.link | 2 +- doc/examples/basic_json__size_type_basic_json.link | 2 +- doc/examples/basic_json__string_t.link | 2 +- doc/examples/basic_json__string_t_value_type.link | 2 +- doc/examples/basic_json__value.link | 2 +- doc/examples/basic_json__value_t.link | 2 +- doc/examples/begin.link | 2 +- doc/examples/cbegin.link | 2 +- doc/examples/cend.link | 2 +- doc/examples/clear.link | 2 +- doc/examples/count.link | 2 +- doc/examples/crbegin.link | 2 +- doc/examples/crend.link | 2 +- doc/examples/dump.link | 2 +- doc/examples/empty.link | 2 +- doc/examples/end.link | 2 +- doc/examples/erase__IteratorType.link | 2 +- doc/examples/erase__IteratorType_IteratorType.link | 2 +- doc/examples/erase__key_type.link | 2 +- doc/examples/erase__size_type.link | 2 +- doc/examples/find__key_type.link | 2 +- doc/examples/front.link | 2 +- doc/examples/get__PointerType.link | 2 +- doc/examples/get__ValueType_const.link | 2 +- doc/examples/get_ptr.link | 2 +- doc/examples/get_ref.link | 2 +- doc/examples/insert.link | 2 +- doc/examples/insert__count.link | 2 +- doc/examples/insert__ilist.link | 2 +- doc/examples/insert__range.link | 2 +- doc/examples/is_array.link | 2 +- doc/examples/is_boolean.link | 2 +- doc/examples/is_discarded.link | 2 +- doc/examples/is_null.link | 2 +- doc/examples/is_number.link | 2 +- doc/examples/is_number_float.link | 2 +- doc/examples/is_number_integer.link | 2 +- doc/examples/is_number_unsigned.link | 2 +- doc/examples/is_object.link | 2 +- doc/examples/is_primitive.link | 2 +- doc/examples/is_string.link | 2 +- doc/examples/is_structured.link | 2 +- doc/examples/max_size.link | 2 +- doc/examples/object.link | 2 +- doc/examples/operator__ValueType.link | 2 +- doc/examples/operator__equal.link | 2 +- doc/examples/operator__equal__nullptr_t.link | 2 +- doc/examples/operator__greater.link | 2 +- doc/examples/operator__greaterequal.link | 2 +- doc/examples/operator__less.link | 2 +- doc/examples/operator__lessequal.link | 2 +- doc/examples/operator__notequal.link | 2 +- doc/examples/operator__notequal__nullptr_t.link | 2 +- doc/examples/operator__value_t.link | 2 +- doc/examples/operator_deserialize.link | 2 +- doc/examples/operator_serialize.link | 2 +- doc/examples/operatorarray__key_type.link | 2 +- doc/examples/operatorarray__key_type_const.link | 2 +- doc/examples/operatorarray__size_type.link | 2 +- doc/examples/operatorarray__size_type_const.link | 2 +- doc/examples/parse__istream__parser_callback_t.link | 2 +- doc/examples/parse__string__parser_callback_t.link | 2 +- doc/examples/push_back.link | 2 +- doc/examples/push_back__object_t__value.link | 2 +- doc/examples/rbegin.link | 2 +- doc/examples/rend.link | 2 +- doc/examples/size.link | 2 +- doc/examples/swap__array_t.link | 2 +- doc/examples/swap__object_t.link | 2 +- doc/examples/swap__reference.link | 2 +- doc/examples/swap__string_t.link | 2 +- doc/examples/type.link | 2 +- 96 files changed, 96 insertions(+), 96 deletions(-) diff --git a/doc/examples/README.link b/doc/examples/README.link index a2526dc64..ed559e19f 100644 --- a/doc/examples/README.link +++ b/doc/examples/README.link @@ -1 +1 @@ -online \ No newline at end of file +online \ No newline at end of file diff --git a/doc/examples/array.link b/doc/examples/array.link index 626dcd25c..cafca79cf 100644 --- a/doc/examples/array.link +++ b/doc/examples/array.link @@ -1 +1 @@ -online \ No newline at end of file +online \ No newline at end of file diff --git a/doc/examples/at__object_t_key_type.link b/doc/examples/at__object_t_key_type.link index f7e44b204..e01197e69 100644 --- a/doc/examples/at__object_t_key_type.link +++ b/doc/examples/at__object_t_key_type.link @@ -1 +1 @@ -online \ No newline at end of file +online \ No newline at end of file diff --git a/doc/examples/at__object_t_key_type_const.link b/doc/examples/at__object_t_key_type_const.link index 8ba211662..2588529b8 100644 --- a/doc/examples/at__object_t_key_type_const.link +++ b/doc/examples/at__object_t_key_type_const.link @@ -1 +1 @@ -online \ No newline at end of file +online \ No newline at end of file diff --git a/doc/examples/at__size_type.link b/doc/examples/at__size_type.link index 76a409c20..00e42d300 100644 --- a/doc/examples/at__size_type.link +++ b/doc/examples/at__size_type.link @@ -1 +1 @@ -online \ No newline at end of file +online \ No newline at end of file diff --git a/doc/examples/at__size_type_const.link b/doc/examples/at__size_type_const.link index 5a1cdde95..0fefb628c 100644 --- a/doc/examples/at__size_type_const.link +++ b/doc/examples/at__size_type_const.link @@ -1 +1 @@ -online \ No newline at end of file +online \ No newline at end of file diff --git a/doc/examples/back.link b/doc/examples/back.link index 49d008f5b..0b0097805 100644 --- a/doc/examples/back.link +++ b/doc/examples/back.link @@ -1 +1 @@ -online \ No newline at end of file +online \ No newline at end of file diff --git a/doc/examples/basic_json.link b/doc/examples/basic_json.link index 1625c487a..e5c17c93a 100644 --- a/doc/examples/basic_json.link +++ b/doc/examples/basic_json.link @@ -1 +1 @@ -online \ No newline at end of file +online \ No newline at end of file diff --git a/doc/examples/basic_json__CompatibleArrayType.link b/doc/examples/basic_json__CompatibleArrayType.link index 313ae3fed..85f64862f 100644 --- a/doc/examples/basic_json__CompatibleArrayType.link +++ b/doc/examples/basic_json__CompatibleArrayType.link @@ -1 +1 @@ -online \ No newline at end of file +online \ No newline at end of file diff --git a/doc/examples/basic_json__CompatibleIntegerNumberType.link b/doc/examples/basic_json__CompatibleIntegerNumberType.link index f994babb3..7a37e9eb2 100644 --- a/doc/examples/basic_json__CompatibleIntegerNumberType.link +++ b/doc/examples/basic_json__CompatibleIntegerNumberType.link @@ -1 +1 @@ -online \ No newline at end of file +online \ No newline at end of file diff --git a/doc/examples/basic_json__CompatibleNumberFloatType.link b/doc/examples/basic_json__CompatibleNumberFloatType.link index 9e08b6a64..9fbc73177 100644 --- a/doc/examples/basic_json__CompatibleNumberFloatType.link +++ b/doc/examples/basic_json__CompatibleNumberFloatType.link @@ -1 +1 @@ -online \ No newline at end of file +online \ No newline at end of file diff --git a/doc/examples/basic_json__CompatibleObjectType.link b/doc/examples/basic_json__CompatibleObjectType.link index 6d65b17a4..7512fb35a 100644 --- a/doc/examples/basic_json__CompatibleObjectType.link +++ b/doc/examples/basic_json__CompatibleObjectType.link @@ -1 +1 @@ -online \ No newline at end of file +online \ No newline at end of file diff --git a/doc/examples/basic_json__CompatibleStringType.link b/doc/examples/basic_json__CompatibleStringType.link index 2131a163b..351d6c0ce 100644 --- a/doc/examples/basic_json__CompatibleStringType.link +++ b/doc/examples/basic_json__CompatibleStringType.link @@ -1 +1 @@ -online \ No newline at end of file +online \ No newline at end of file diff --git a/doc/examples/basic_json__InputIt_InputIt.link b/doc/examples/basic_json__InputIt_InputIt.link index 3ce3686ad..ae46528cc 100644 --- a/doc/examples/basic_json__InputIt_InputIt.link +++ b/doc/examples/basic_json__InputIt_InputIt.link @@ -1 +1 @@ -online \ No newline at end of file +online \ No newline at end of file diff --git a/doc/examples/basic_json__array_t.link b/doc/examples/basic_json__array_t.link index 53322832d..70c9cb8cd 100644 --- a/doc/examples/basic_json__array_t.link +++ b/doc/examples/basic_json__array_t.link @@ -1 +1 @@ -online \ No newline at end of file +online \ No newline at end of file diff --git a/doc/examples/basic_json__basic_json.link b/doc/examples/basic_json__basic_json.link index c3109d16e..78fcbbe54 100644 --- a/doc/examples/basic_json__basic_json.link +++ b/doc/examples/basic_json__basic_json.link @@ -1 +1 @@ -online \ No newline at end of file +online \ No newline at end of file diff --git a/doc/examples/basic_json__boolean_t.link b/doc/examples/basic_json__boolean_t.link index 9fe211e42..c64e1fc47 100644 --- a/doc/examples/basic_json__boolean_t.link +++ b/doc/examples/basic_json__boolean_t.link @@ -1 +1 @@ -online \ No newline at end of file +online \ No newline at end of file diff --git a/doc/examples/basic_json__const_int.link b/doc/examples/basic_json__const_int.link index 73d286286..68a9e235d 100644 --- a/doc/examples/basic_json__const_int.link +++ b/doc/examples/basic_json__const_int.link @@ -1 +1 @@ -online \ No newline at end of file +online \ No newline at end of file diff --git a/doc/examples/basic_json__copyassignment.link b/doc/examples/basic_json__copyassignment.link index 96679cf45..efcac3062 100644 --- a/doc/examples/basic_json__copyassignment.link +++ b/doc/examples/basic_json__copyassignment.link @@ -1 +1 @@ -online \ No newline at end of file +online \ No newline at end of file diff --git a/doc/examples/basic_json__list_init_t.link b/doc/examples/basic_json__list_init_t.link index 5eca20502..bcdf66890 100644 --- a/doc/examples/basic_json__list_init_t.link +++ b/doc/examples/basic_json__list_init_t.link @@ -1 +1 @@ -online \ No newline at end of file +online \ No newline at end of file diff --git a/doc/examples/basic_json__moveconstructor.link b/doc/examples/basic_json__moveconstructor.link index 88002bbd8..9580d02c0 100644 --- a/doc/examples/basic_json__moveconstructor.link +++ b/doc/examples/basic_json__moveconstructor.link @@ -1 +1 @@ -online \ No newline at end of file +online \ No newline at end of file diff --git a/doc/examples/basic_json__nullptr_t.link b/doc/examples/basic_json__nullptr_t.link index bb26af46d..7e9177522 100644 --- a/doc/examples/basic_json__nullptr_t.link +++ b/doc/examples/basic_json__nullptr_t.link @@ -1 +1 @@ -online \ No newline at end of file +online \ No newline at end of file diff --git a/doc/examples/basic_json__number_float_t.link b/doc/examples/basic_json__number_float_t.link index a7c6b6074..47aa2553a 100644 --- a/doc/examples/basic_json__number_float_t.link +++ b/doc/examples/basic_json__number_float_t.link @@ -1 +1 @@ -online \ No newline at end of file +online \ No newline at end of file diff --git a/doc/examples/basic_json__number_integer_t.link b/doc/examples/basic_json__number_integer_t.link index 764aa649d..5d4499b59 100644 --- a/doc/examples/basic_json__number_integer_t.link +++ b/doc/examples/basic_json__number_integer_t.link @@ -1 +1 @@ -online \ No newline at end of file +online \ No newline at end of file diff --git a/doc/examples/basic_json__object_t.link b/doc/examples/basic_json__object_t.link index f6bad665a..2e07a3efb 100644 --- a/doc/examples/basic_json__object_t.link +++ b/doc/examples/basic_json__object_t.link @@ -1 +1 @@ -online \ No newline at end of file +online \ No newline at end of file diff --git a/doc/examples/basic_json__size_type_basic_json.link b/doc/examples/basic_json__size_type_basic_json.link index 6ae76b6f2..78305dcf6 100644 --- a/doc/examples/basic_json__size_type_basic_json.link +++ b/doc/examples/basic_json__size_type_basic_json.link @@ -1 +1 @@ -online \ No newline at end of file +online \ No newline at end of file diff --git a/doc/examples/basic_json__string_t.link b/doc/examples/basic_json__string_t.link index a5051e582..d7d02f2fb 100644 --- a/doc/examples/basic_json__string_t.link +++ b/doc/examples/basic_json__string_t.link @@ -1 +1 @@ -online \ No newline at end of file +online \ No newline at end of file diff --git a/doc/examples/basic_json__string_t_value_type.link b/doc/examples/basic_json__string_t_value_type.link index 4646b5b2a..569087684 100644 --- a/doc/examples/basic_json__string_t_value_type.link +++ b/doc/examples/basic_json__string_t_value_type.link @@ -1 +1 @@ -online \ No newline at end of file +online \ No newline at end of file diff --git a/doc/examples/basic_json__value.link b/doc/examples/basic_json__value.link index 452a1fe4f..27e1ddebd 100644 --- a/doc/examples/basic_json__value.link +++ b/doc/examples/basic_json__value.link @@ -1 +1 @@ -online \ No newline at end of file +online \ No newline at end of file diff --git a/doc/examples/basic_json__value_t.link b/doc/examples/basic_json__value_t.link index 774aaa255..e7e744c11 100644 --- a/doc/examples/basic_json__value_t.link +++ b/doc/examples/basic_json__value_t.link @@ -1 +1 @@ -online \ No newline at end of file +online \ No newline at end of file diff --git a/doc/examples/begin.link b/doc/examples/begin.link index 6a76a5887..64eac7026 100644 --- a/doc/examples/begin.link +++ b/doc/examples/begin.link @@ -1 +1 @@ -online \ No newline at end of file +online \ No newline at end of file diff --git a/doc/examples/cbegin.link b/doc/examples/cbegin.link index 83c75dd3c..c298c6530 100644 --- a/doc/examples/cbegin.link +++ b/doc/examples/cbegin.link @@ -1 +1 @@ -online \ No newline at end of file +online \ No newline at end of file diff --git a/doc/examples/cend.link b/doc/examples/cend.link index acca215d2..61a3203d5 100644 --- a/doc/examples/cend.link +++ b/doc/examples/cend.link @@ -1 +1 @@ -online \ No newline at end of file +online \ No newline at end of file diff --git a/doc/examples/clear.link b/doc/examples/clear.link index 8defa668d..9ad0a14f0 100644 --- a/doc/examples/clear.link +++ b/doc/examples/clear.link @@ -1 +1 @@ -online \ No newline at end of file +online \ No newline at end of file diff --git a/doc/examples/count.link b/doc/examples/count.link index e13caf363..62833ff46 100644 --- a/doc/examples/count.link +++ b/doc/examples/count.link @@ -1 +1 @@ -online \ No newline at end of file +online \ No newline at end of file diff --git a/doc/examples/crbegin.link b/doc/examples/crbegin.link index 27de8eb89..1188be1ea 100644 --- a/doc/examples/crbegin.link +++ b/doc/examples/crbegin.link @@ -1 +1 @@ -online \ No newline at end of file +online \ No newline at end of file diff --git a/doc/examples/crend.link b/doc/examples/crend.link index c678236d9..4bdfef3ac 100644 --- a/doc/examples/crend.link +++ b/doc/examples/crend.link @@ -1 +1 @@ -online \ No newline at end of file +online \ No newline at end of file diff --git a/doc/examples/dump.link b/doc/examples/dump.link index 35ef46533..5cf3e634b 100644 --- a/doc/examples/dump.link +++ b/doc/examples/dump.link @@ -1 +1 @@ -online \ No newline at end of file +online \ No newline at end of file diff --git a/doc/examples/empty.link b/doc/examples/empty.link index fd22770cf..12aa96782 100644 --- a/doc/examples/empty.link +++ b/doc/examples/empty.link @@ -1 +1 @@ -online \ No newline at end of file +online \ No newline at end of file diff --git a/doc/examples/end.link b/doc/examples/end.link index 260696d5a..462a463f1 100644 --- a/doc/examples/end.link +++ b/doc/examples/end.link @@ -1 +1 @@ -online \ No newline at end of file +online \ No newline at end of file diff --git a/doc/examples/erase__IteratorType.link b/doc/examples/erase__IteratorType.link index b523066ed..854a9be5f 100644 --- a/doc/examples/erase__IteratorType.link +++ b/doc/examples/erase__IteratorType.link @@ -1 +1 @@ -online \ No newline at end of file +online \ No newline at end of file diff --git a/doc/examples/erase__IteratorType_IteratorType.link b/doc/examples/erase__IteratorType_IteratorType.link index b7f3da724..26e0b9034 100644 --- a/doc/examples/erase__IteratorType_IteratorType.link +++ b/doc/examples/erase__IteratorType_IteratorType.link @@ -1 +1 @@ -online \ No newline at end of file +online \ No newline at end of file diff --git a/doc/examples/erase__key_type.link b/doc/examples/erase__key_type.link index bef018cab..e4c2fba1d 100644 --- a/doc/examples/erase__key_type.link +++ b/doc/examples/erase__key_type.link @@ -1 +1 @@ -online \ No newline at end of file +online \ No newline at end of file diff --git a/doc/examples/erase__size_type.link b/doc/examples/erase__size_type.link index fe2d560d5..c63abe525 100644 --- a/doc/examples/erase__size_type.link +++ b/doc/examples/erase__size_type.link @@ -1 +1 @@ -online \ No newline at end of file +online \ No newline at end of file diff --git a/doc/examples/find__key_type.link b/doc/examples/find__key_type.link index 2bc0512d1..cd3d4fd25 100644 --- a/doc/examples/find__key_type.link +++ b/doc/examples/find__key_type.link @@ -1 +1 @@ -online \ No newline at end of file +online \ No newline at end of file diff --git a/doc/examples/front.link b/doc/examples/front.link index 22e99c7dd..d69c7f90c 100644 --- a/doc/examples/front.link +++ b/doc/examples/front.link @@ -1 +1 @@ -online \ No newline at end of file +online \ No newline at end of file diff --git a/doc/examples/get__PointerType.link b/doc/examples/get__PointerType.link index a811b26df..68a46b571 100644 --- a/doc/examples/get__PointerType.link +++ b/doc/examples/get__PointerType.link @@ -1 +1 @@ -online \ No newline at end of file +online \ No newline at end of file diff --git a/doc/examples/get__ValueType_const.link b/doc/examples/get__ValueType_const.link index fce774b2b..95862c671 100644 --- a/doc/examples/get__ValueType_const.link +++ b/doc/examples/get__ValueType_const.link @@ -1 +1 @@ -online \ No newline at end of file +online \ No newline at end of file diff --git a/doc/examples/get_ptr.link b/doc/examples/get_ptr.link index e318d7780..13ed7d818 100644 --- a/doc/examples/get_ptr.link +++ b/doc/examples/get_ptr.link @@ -1 +1 @@ -online \ No newline at end of file +online \ No newline at end of file diff --git a/doc/examples/get_ref.link b/doc/examples/get_ref.link index c0d8275a3..ef560c42c 100644 --- a/doc/examples/get_ref.link +++ b/doc/examples/get_ref.link @@ -1 +1 @@ -online \ No newline at end of file +online \ No newline at end of file diff --git a/doc/examples/insert.link b/doc/examples/insert.link index 3886e04d5..9b0a1d90a 100644 --- a/doc/examples/insert.link +++ b/doc/examples/insert.link @@ -1 +1 @@ -online \ No newline at end of file +online \ No newline at end of file diff --git a/doc/examples/insert__count.link b/doc/examples/insert__count.link index b97d0d69f..f6a6441d7 100644 --- a/doc/examples/insert__count.link +++ b/doc/examples/insert__count.link @@ -1 +1 @@ -online \ No newline at end of file +online \ No newline at end of file diff --git a/doc/examples/insert__ilist.link b/doc/examples/insert__ilist.link index 4920588b5..eba2b5607 100644 --- a/doc/examples/insert__ilist.link +++ b/doc/examples/insert__ilist.link @@ -1 +1 @@ -online \ No newline at end of file +online \ No newline at end of file diff --git a/doc/examples/insert__range.link b/doc/examples/insert__range.link index ac773f8b2..3a802b572 100644 --- a/doc/examples/insert__range.link +++ b/doc/examples/insert__range.link @@ -1 +1 @@ -online \ No newline at end of file +online \ No newline at end of file diff --git a/doc/examples/is_array.link b/doc/examples/is_array.link index 8c8b9f825..ccd727507 100644 --- a/doc/examples/is_array.link +++ b/doc/examples/is_array.link @@ -1 +1 @@ -online \ No newline at end of file +online \ No newline at end of file diff --git a/doc/examples/is_boolean.link b/doc/examples/is_boolean.link index 62f5fed14..5ebc9acb3 100644 --- a/doc/examples/is_boolean.link +++ b/doc/examples/is_boolean.link @@ -1 +1 @@ -online \ No newline at end of file +online \ No newline at end of file diff --git a/doc/examples/is_discarded.link b/doc/examples/is_discarded.link index 7ce69a104..d2172392c 100644 --- a/doc/examples/is_discarded.link +++ b/doc/examples/is_discarded.link @@ -1 +1 @@ -online \ No newline at end of file +online \ No newline at end of file diff --git a/doc/examples/is_null.link b/doc/examples/is_null.link index 6b22b9780..d40569d23 100644 --- a/doc/examples/is_null.link +++ b/doc/examples/is_null.link @@ -1 +1 @@ -online \ No newline at end of file +online \ No newline at end of file diff --git a/doc/examples/is_number.link b/doc/examples/is_number.link index bf863a1cf..089d7893d 100644 --- a/doc/examples/is_number.link +++ b/doc/examples/is_number.link @@ -1 +1 @@ -online \ No newline at end of file +online \ No newline at end of file diff --git a/doc/examples/is_number_float.link b/doc/examples/is_number_float.link index 38abb5985..3fa73533c 100644 --- a/doc/examples/is_number_float.link +++ b/doc/examples/is_number_float.link @@ -1 +1 @@ -online \ No newline at end of file +online \ No newline at end of file diff --git a/doc/examples/is_number_integer.link b/doc/examples/is_number_integer.link index d6162ab0e..474cded4b 100644 --- a/doc/examples/is_number_integer.link +++ b/doc/examples/is_number_integer.link @@ -1 +1 @@ -online \ No newline at end of file +online \ No newline at end of file diff --git a/doc/examples/is_number_unsigned.link b/doc/examples/is_number_unsigned.link index 41986cefa..0849b8e56 100644 --- a/doc/examples/is_number_unsigned.link +++ b/doc/examples/is_number_unsigned.link @@ -1 +1 @@ -online \ No newline at end of file +online \ No newline at end of file diff --git a/doc/examples/is_object.link b/doc/examples/is_object.link index 1a304d09a..5bd827c21 100644 --- a/doc/examples/is_object.link +++ b/doc/examples/is_object.link @@ -1 +1 @@ -online \ No newline at end of file +online \ No newline at end of file diff --git a/doc/examples/is_primitive.link b/doc/examples/is_primitive.link index eb73ffb1b..6de65c795 100644 --- a/doc/examples/is_primitive.link +++ b/doc/examples/is_primitive.link @@ -1 +1 @@ -online \ No newline at end of file +online \ No newline at end of file diff --git a/doc/examples/is_string.link b/doc/examples/is_string.link index 6af78b0ba..86ef2b45c 100644 --- a/doc/examples/is_string.link +++ b/doc/examples/is_string.link @@ -1 +1 @@ -online \ No newline at end of file +online \ No newline at end of file diff --git a/doc/examples/is_structured.link b/doc/examples/is_structured.link index 8ae6fd044..43385c8b7 100644 --- a/doc/examples/is_structured.link +++ b/doc/examples/is_structured.link @@ -1 +1 @@ -online \ No newline at end of file +online \ No newline at end of file diff --git a/doc/examples/max_size.link b/doc/examples/max_size.link index d91bc8cda..5719ccaac 100644 --- a/doc/examples/max_size.link +++ b/doc/examples/max_size.link @@ -1 +1 @@ -online \ No newline at end of file +online \ No newline at end of file diff --git a/doc/examples/object.link b/doc/examples/object.link index 575473b35..fd0f424b9 100644 --- a/doc/examples/object.link +++ b/doc/examples/object.link @@ -1 +1 @@ -online \ No newline at end of file +online \ No newline at end of file diff --git a/doc/examples/operator__ValueType.link b/doc/examples/operator__ValueType.link index 204d8f5e3..1428a679c 100644 --- a/doc/examples/operator__ValueType.link +++ b/doc/examples/operator__ValueType.link @@ -1 +1 @@ -online \ No newline at end of file +online \ No newline at end of file diff --git a/doc/examples/operator__equal.link b/doc/examples/operator__equal.link index 41ae20ce3..867075204 100644 --- a/doc/examples/operator__equal.link +++ b/doc/examples/operator__equal.link @@ -1 +1 @@ -online \ No newline at end of file +online \ No newline at end of file diff --git a/doc/examples/operator__equal__nullptr_t.link b/doc/examples/operator__equal__nullptr_t.link index 49e46fd65..d52acab41 100644 --- a/doc/examples/operator__equal__nullptr_t.link +++ b/doc/examples/operator__equal__nullptr_t.link @@ -1 +1 @@ -online \ No newline at end of file +online \ No newline at end of file diff --git a/doc/examples/operator__greater.link b/doc/examples/operator__greater.link index 2299d6102..5499771d8 100644 --- a/doc/examples/operator__greater.link +++ b/doc/examples/operator__greater.link @@ -1 +1 @@ -online \ No newline at end of file +online \ No newline at end of file diff --git a/doc/examples/operator__greaterequal.link b/doc/examples/operator__greaterequal.link index fdd676e6e..e476f3964 100644 --- a/doc/examples/operator__greaterequal.link +++ b/doc/examples/operator__greaterequal.link @@ -1 +1 @@ -online \ No newline at end of file +online \ No newline at end of file diff --git a/doc/examples/operator__less.link b/doc/examples/operator__less.link index 5d7f6f566..d50c2207c 100644 --- a/doc/examples/operator__less.link +++ b/doc/examples/operator__less.link @@ -1 +1 @@ -online \ No newline at end of file +online \ No newline at end of file diff --git a/doc/examples/operator__lessequal.link b/doc/examples/operator__lessequal.link index 620b6aa8a..3b71a46d0 100644 --- a/doc/examples/operator__lessequal.link +++ b/doc/examples/operator__lessequal.link @@ -1 +1 @@ -online \ No newline at end of file +online \ No newline at end of file diff --git a/doc/examples/operator__notequal.link b/doc/examples/operator__notequal.link index 482b97212..49f1529ce 100644 --- a/doc/examples/operator__notequal.link +++ b/doc/examples/operator__notequal.link @@ -1 +1 @@ -online \ No newline at end of file +online \ No newline at end of file diff --git a/doc/examples/operator__notequal__nullptr_t.link b/doc/examples/operator__notequal__nullptr_t.link index 40f6bb4fe..210336234 100644 --- a/doc/examples/operator__notequal__nullptr_t.link +++ b/doc/examples/operator__notequal__nullptr_t.link @@ -1 +1 @@ -online \ No newline at end of file +online \ No newline at end of file diff --git a/doc/examples/operator__value_t.link b/doc/examples/operator__value_t.link index a97072328..3139efa11 100644 --- a/doc/examples/operator__value_t.link +++ b/doc/examples/operator__value_t.link @@ -1 +1 @@ -online \ No newline at end of file +online \ No newline at end of file diff --git a/doc/examples/operator_deserialize.link b/doc/examples/operator_deserialize.link index 27e998d9a..fea1503eb 100644 --- a/doc/examples/operator_deserialize.link +++ b/doc/examples/operator_deserialize.link @@ -1 +1 @@ -online \ No newline at end of file +online \ No newline at end of file diff --git a/doc/examples/operator_serialize.link b/doc/examples/operator_serialize.link index 231306ac2..45b5f4b16 100644 --- a/doc/examples/operator_serialize.link +++ b/doc/examples/operator_serialize.link @@ -1 +1 @@ -online \ No newline at end of file +online \ No newline at end of file diff --git a/doc/examples/operatorarray__key_type.link b/doc/examples/operatorarray__key_type.link index 40df071bf..d597ad787 100644 --- a/doc/examples/operatorarray__key_type.link +++ b/doc/examples/operatorarray__key_type.link @@ -1 +1 @@ -online \ No newline at end of file +online \ No newline at end of file diff --git a/doc/examples/operatorarray__key_type_const.link b/doc/examples/operatorarray__key_type_const.link index bba664a5c..d34adb46c 100644 --- a/doc/examples/operatorarray__key_type_const.link +++ b/doc/examples/operatorarray__key_type_const.link @@ -1 +1 @@ -online \ No newline at end of file +online \ No newline at end of file diff --git a/doc/examples/operatorarray__size_type.link b/doc/examples/operatorarray__size_type.link index b9d578810..aa5f718a9 100644 --- a/doc/examples/operatorarray__size_type.link +++ b/doc/examples/operatorarray__size_type.link @@ -1 +1 @@ -online \ No newline at end of file +online \ No newline at end of file diff --git a/doc/examples/operatorarray__size_type_const.link b/doc/examples/operatorarray__size_type_const.link index a1f8c98b7..a5c351e62 100644 --- a/doc/examples/operatorarray__size_type_const.link +++ b/doc/examples/operatorarray__size_type_const.link @@ -1 +1 @@ -online \ No newline at end of file +online \ No newline at end of file diff --git a/doc/examples/parse__istream__parser_callback_t.link b/doc/examples/parse__istream__parser_callback_t.link index 85960e159..4d2d0a9cd 100644 --- a/doc/examples/parse__istream__parser_callback_t.link +++ b/doc/examples/parse__istream__parser_callback_t.link @@ -1 +1 @@ -online \ No newline at end of file +online \ No newline at end of file diff --git a/doc/examples/parse__string__parser_callback_t.link b/doc/examples/parse__string__parser_callback_t.link index 9db1c3b83..1ad3b7199 100644 --- a/doc/examples/parse__string__parser_callback_t.link +++ b/doc/examples/parse__string__parser_callback_t.link @@ -1 +1 @@ -online \ No newline at end of file +online \ No newline at end of file diff --git a/doc/examples/push_back.link b/doc/examples/push_back.link index 8ec17dbac..d0ca11be9 100644 --- a/doc/examples/push_back.link +++ b/doc/examples/push_back.link @@ -1 +1 @@ -online \ No newline at end of file +online \ No newline at end of file diff --git a/doc/examples/push_back__object_t__value.link b/doc/examples/push_back__object_t__value.link index 24882e38c..04bdbd9b8 100644 --- a/doc/examples/push_back__object_t__value.link +++ b/doc/examples/push_back__object_t__value.link @@ -1 +1 @@ -online \ No newline at end of file +online \ No newline at end of file diff --git a/doc/examples/rbegin.link b/doc/examples/rbegin.link index de269d74b..79ed80c38 100644 --- a/doc/examples/rbegin.link +++ b/doc/examples/rbegin.link @@ -1 +1 @@ -online \ No newline at end of file +online \ No newline at end of file diff --git a/doc/examples/rend.link b/doc/examples/rend.link index 17faa9117..6e8850f06 100644 --- a/doc/examples/rend.link +++ b/doc/examples/rend.link @@ -1 +1 @@ -online \ No newline at end of file +online \ No newline at end of file diff --git a/doc/examples/size.link b/doc/examples/size.link index 4cc0afa10..9b546197a 100644 --- a/doc/examples/size.link +++ b/doc/examples/size.link @@ -1 +1 @@ -online \ No newline at end of file +online \ No newline at end of file diff --git a/doc/examples/swap__array_t.link b/doc/examples/swap__array_t.link index 8851fdb98..1dca248ca 100644 --- a/doc/examples/swap__array_t.link +++ b/doc/examples/swap__array_t.link @@ -1 +1 @@ -online \ No newline at end of file +online \ No newline at end of file diff --git a/doc/examples/swap__object_t.link b/doc/examples/swap__object_t.link index 8bd7495ef..cdb94e9a6 100644 --- a/doc/examples/swap__object_t.link +++ b/doc/examples/swap__object_t.link @@ -1 +1 @@ -online \ No newline at end of file +online \ No newline at end of file diff --git a/doc/examples/swap__reference.link b/doc/examples/swap__reference.link index 3ee4c0df8..262d1961c 100644 --- a/doc/examples/swap__reference.link +++ b/doc/examples/swap__reference.link @@ -1 +1 @@ -online \ No newline at end of file +online \ No newline at end of file diff --git a/doc/examples/swap__string_t.link b/doc/examples/swap__string_t.link index 719313695..f3c448d50 100644 --- a/doc/examples/swap__string_t.link +++ b/doc/examples/swap__string_t.link @@ -1 +1 @@ -online \ No newline at end of file +online \ No newline at end of file diff --git a/doc/examples/type.link b/doc/examples/type.link index f197d847a..ccb4422b0 100644 --- a/doc/examples/type.link +++ b/doc/examples/type.link @@ -1 +1 @@ -online \ No newline at end of file +online \ No newline at end of file